Apacheのmod_wsgiを導入してPythonを実行する
Apache を導入している VPS で Flask を使おうと思ったのですが,その前に Python が動く環境を作らねばということで,何やら mod_wsgi というモジュールが使えるらしいです.
サーバ上で Python を動かす方法
一つはさっき述べた mod_wsgi を導入する方法で,もう一つは CGI を使う方法です.
かつて Python を Web サーバで動かすための仕組みとして,CGI (Common Gateway Interface) 含め,様々な Web アプリケーションフレームワークが用意されてきました.
そこで,標準仕様を決めて開発を楽にするために WSGI (Web Server Gateway Interface) に統一しようという話になったようです (大雑把).ちなみに読みは「ウィズギー」らしい.
CGI を使うときは /var/www/cgi-bin に Python ファイルを置き,設定で .py を読み込むように記述すればいいだけのようなのでこっちのほうが簡単なのかもしれませんが,mod_wsgi は高速とかいう話も聞いたのでこっちでやってみました.
インストール
導入する環境は CentOS7, Apache 2.4 が入っているさくらの VPS です.(Apache 2.2 などは一部書き方が違います.)
yum を使ってインストールします.
yum だと古いやつが入るので pip のほうがいいかもしれません.
terminal
# (bad!!) yum install mod_wsgi
# pip install mod_wsgi
成功すると,/etc/httpd/modules 内に mod_wsgi.so が追加されます.
Web サーバの設定
Apache
特定の URL に接続されたときに mod_wsgi を使って Python を読み込むように設定ファイル (/etc/httpd/conf 以下の .conf ファイルなど) に記述します.
LoadModule wsgi_module modules/mod_wsgi.so
<VirtualHost *:80>
ServerName wsgiapp.example.com
WSGIScriptAlias /top /var/www/html/wsgi/app.py
<Directory "/var/www/html/wsgi/">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
仮想ホスティングを使っていくつかのサイトが同一サーバに載っている状態です.
この場合,ServerName で指定した URL の http://wsgiapp.example.com/top に接続があったときに WSGIScriptAlias のパスで指定しているファイルを読み込みます.
書き終えたら Apache を再起動します.
terminal
# systemctl restart httpd.service
Python Script
/var/www/html/wsgi/app.py に Python ファイルを用意します.
app.py
# -*- coding:utf-8 -*-
def application(environ,start_response):
status = '200 OK'
html = '<html>\n' \
'<head><meta name="robots" content="noindex"></head>\n' \
'<body>\n' \
'<p>Hello WSGI!</p>\n' \
'</body>\n' \
'</html>\n'
response_header = [('Content-type','text/html')]
start_response(status,response_header)
return [html]
.wsgi ファイルを用意している場合もあります.WSGIScriptAlias の設定,ファイル内の記述が合っていればどちらでも動くようです.
DNS 設定
http://wsgiapp.example.com/top で実際に表示するためには http://wsgiapp.example.com で Web サーバに接続できるように DNS を正しく設定している必要があります.A で Web サーバの IP アドレスを指定しておきましょう.
エラーが出るとき
ここまで終われば Hello WSGI! が表示されるはずですが,どこかで設定を間違えるとエラーになります.
サーバが見つかりません
DNS 設定がうまくいってません.
404 Not Found
- WSGIScriptAlias のパスとファイルを用意したパスが合ってません.
- Python ファイル内の記述が適切ではありません.(print で出力とかダメ)