ApacheでPythonを動かしてみた(mod_wsgiをソースからインストール)

概要

Pythonを使って何かしたかったので、まずはサーバアプリとして公開する方法を調べてみました。 色々実現方法はあると思いますが、自分がイメージしやすいWebサーバのモジュールとして起動することにしました。

注意

ApachePythonを動かすためのmod_wsgiモジュールをこの記事ではソースからインストールしています。 しかし、そのすぐ後でyumでインストールしてみたらそっちの方が断然楽だったので、次の記事にまとめました。 本記事よりも、以下の記事を見る方が良いです。 ApacheでPythonを動かしてみた(bottle利用) - 薮蛇なエンジニアの開発備忘録

前提

Pythonはpyenvでインストール済みで、ApacheなどのWEBサーバは未インストール状態を想定しています。また、OSとPythonは以下の前提です。

Pythonのインストール方法:CentOSにPython環境を作ってみたまとめ - 薮蛇なエンジニアの開発備忘録

  • CentOS6.7
  • Apache2系
  • Python 2.7.11

各種パッケージのインストール

必要なパッケージをインストール。

(参考サイト:さくらVPS(CentOS6) Python3.5とmod_wsgiの導入

yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
yum install -y httpd-devel python-devel
pip install --upgrade pip

mod_wsgiインストール

ApachePythonを動かすためにはmod_wsgiというモジュールを入れる必要があるようです。wikipediaによるとWSGIはウィズギーと読むらしいです。

wgetで取ってきてmake installしたところ「オプションつけてPythonコンパイルしなおせ」という旨のエラーが出てしまいました。指定されたオプションをつけてPythonをインストールしなおしました。

(参考サイト1:PL/Pythonの実行環境にpyenvでインストールしたPythonを使う - Qiita

(参考サイト2:mod_wsgiのインストールと設定 - Qiita

Pythonコンパイルしなおしてmod_wsgiをインストール手順

CONFIGURE_OPTS="CFLAGS=-fPIC --enable-shared" pyenv install 2.7.11
cd /usr/local/src
wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz
tar zxvf mod_wsgi-3.3.tar.gz
cd mod_wsgi-3.3
./configure CFLAGS=-fPIC
make
make install

LoadModuleの設定

httpd.confを編集してモジュールを追加。

vim /etc/httpd/conf/httpd.conf

LoadModule wsgi_module   modules/mod_wsgi.so

これでapacheを再起動しようとすると、libpython2.7.so.1.0が無いというエラーが出てしまいました。

エラー内容: /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_wsgi.so into server: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

ld.so.confにライブラリのパスを書くといいようです。

(参考サイト:CentOS 6.5にPython 2.7をインストールしApacheで使用 | Akashic Records

find / -name libpython2.7.so.1.0
vim /etc/ld.so.conf #findした結果の /usr/local/src/pyenv/versions/2.7.11/lib/をファイル末尾に追記
ldconfig
service httpd restart

これでhttpdを再起動できました。

Pythonファイルの作成

vim /var/www/html/sample.py

def application(environ,start_response):
    status = '200 OK'
    output = 'Hello World!'
    response_header = [('Content-type','text/plain'),
                        ('Content-Length',str(len(output)))]
    start_response(status,response_header)
    return [output]

vim /etc/httpd/conf/httpd.conf

WSGIScriptAlias / /var/www/html/sample.py

これでapacheを再起動してブラウザからドキュメントルートにアクセスしたところ、Hello Worldが表示されました!

まとめ

色々と苦戦しましたが、Pythonが動かせるWEBサーバを立ち上げることができました。

Pythonサーバサイドプログラムの基本になっているらしいWSGIについて軽く調べましたが、Pythonサーバプログラムの共通ルールらしいという概要しか分からず、すぐには具体的なイメージを掴めませんでした。

次回はサーバサイドプログラムとして基本的なことをできるように調べようと思います。