Python
mod_wsgi

mod_wsgiでhello worldを描画する

はじめに

ゴールは「mod-wsgiを使用して"Hello World"を描画すること」です。mod-wsgiとは?
Python製WebFramework Djangoを使用する上でも使用します。

前提として以下を行なっているものとします。
- pyenv と pyenv-virtualenv をインストールする

環境
OS: Debian8.0 Jessie
Python: 3.6.3

apache2のinstall

apache2をインストールします

sudo apt-get -y install apache2
sudo apt-get -y install apache2-dev

mod-wsgiのinstall

少し注意が必要です。というのも、インストールする方法がapt-getとpipの二通りあるからです。
apt-getの場合、インストールされるのはapache2のlibapache2-mod-wsgiなのですが、こいつは後にコンパイルされたPythonと実行しているPythonの違いによるwarningを吐き出すことになります。
ということで、pipを使ってインストールすることをオススメします。

mod-wsgiのinstall

pip install mod-wsgi

念のために確認

pip freeze | grep wsgi

mod-wsgi==4.5.22

OKです。

apache2の設定

libapache2-mod-wsgiをインストールした場合とは違い、少し設定が必要になります。
pipでのmod-wsgiインストール時に下記のファイルが作成されています。

/home/USERNAME/.pyenv/versions/3.6.3/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

このファイルをapache2に認識させてあげましょう。

sudo vim /etc/apache2/mods-available/wsgi.load

で以下を書き込みます。USERNAMEを置き換えるのを忘れないでください。

LoadModule wsgi_module /home/USERNAME/.pyenv/versions/3.6.3/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

その後、wsgiを有効化しましょう。

sudo a2enmod wsgi

Enabling module wsgi.
To activate the new configuration, you need to run:
  systemctl restart apache2

このようなコメントが出ればOKです。apache2を再起動してください。

sudo service apache2 restart

Apache2の設定

Apache2の設定ファイル群(/etc/apache2/)をいじりますが、念のためにバックアップをしておきましょう。

cd /etc/apache2/sites-available
sudo cp 000-default.conf 000-default.conf.bk
sudo vim 000-default.conf

以下を最後の行に追加します。
ちなみに、vimではG(shift + g)で最終行に移動しますね。

WSGIScriptAlias /test_wsgi /var/www/html/test_wsgi.py

test_wsgi.pyを作成

上のWSGIScriptAliasで指定したtest_wsgi.pyファイルを作成します。

sudo vim /var/www/html/test_wsgi.py

ファイルの中身は以下の通りにしてください。

def application(environ, start_response):
    status = '200 OK'
    output = b'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

apache2のリスタート

上記が完了したらapache2をリスタートします。

sudo service apache2 restart

この後、ドメイン名(またはIP)/test_wsgiにアクセス(Http←気をつけて)するとHello Worldが表示されるはずです。