Pyramidを本番環境で動かしたい② 〜Apache+mod_wsgiでPyramidを動かす
前回に引き続き,Pyramidを本番環境で動かすための色んな設定とかをしていく.
で,今回は,主にRunning a Pyramid Application under mod_wsgi — The Pyramid Web Application Development Framework v1.3.4に従っていく.
(ところどころ違うけど)
ただし,virtualenv,virtualenvwrapperが使えることを前提とする.
virtualenvとかについてはここ > Pythonの仮想環境 virtualenvとvirtualenvwrapper - [[ともっくす alloc] init]
以降,ユーザがo-tomoxで,/home/o-tomox/がホームディレクトリである環境でやっていく.
下準備
Pyramidのプロジェクトはホームディレクトリ配下のmodwsgiディレクトリに作成する.
$ mkdir modwsgi
$ cd modwsgi
次に,環境を構築する.
pythonの仮想環境名は,env-pyramidtestにして,pyramidをインストールする.
が,省略.
(前述の通り,ここで > Pythonの仮想環境 virtualenvとvirtualenvwrapper - [[ともっくす alloc] init])
Pyramidプロジェクトの作成
プロジェクト名はpyramidtest,scaffoldingはstarterで作成.
(カレントディレクトリは/home/o-tomox/modwsgi/)
$ pcreate -s starter pyramidtest
そして,セットアップする.
$ cd pyramidtest
$ python setup.py install
wsgiスクリプトの作成
~/modwsgi/pyramid.wsgiを作成して,以下を記述する.
from pyramid.paster import get_app, setup_logging ini_path = '/home/o-tomox/modwsgi/pyramidtest/production.ini' setup_logging(ini_path) application = get_app(ini_path, 'main')
で,パーミッションを変更する.
$ chmod 755 ~/modwsgi/pyramid.wsgi
Apacheの設定
/etc/httpd/conf.d/mod_wsgi.confに以下を追記する.
WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On WSGIDaemonProcess pyramid user=apache group=apache threads=1 \ python-path=/home/o-tomox/.virtualenvs/env-pyramidtest/lib/python2.6/site-packages WSGIScriptAlias /myapp /home/o-tomox/modwsgi/pyramid.wsgi <Directory /home/o-tomox/modwsgi> WSGIProcessGroup pyramid Order allow,deny Allow from all </Directory>
<追記>
python-pathが間違っていたのを修正.
で,Apacheを再起動する.
$ /etc/init.d/httpd restart
アクセスしてみる
http://<自分のサーバのドメイン名>/myappにアクセスすると,
無事にpyramidtestが起動して……いない.
こんな結果が返ってくる.
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Pyramidのチュートリアルによると,これでできるらしいんだけど.
で,Apacheのエラーログ(/var/log/httpd/error_log)を見てみると,
(13)Permission denied: mod_wsgi (pid=11379): Unable to connect to WSGI daemon process 'pyramid' on '/etc/httpd/logs/wsgi.11372.0.1.sock' after multiple attempts.
とかなってる.
ソケットの場所を指定
この問題を解決するには,WSGISocketPrefixでソケットの場所を指定する必要がある.
というわけで,以下を/etc/httpd/conf.d/mod_wsgi.confに追記する.
WSGISocketPrefix run/wsgi
で,Apacheを再起動する.
$ /etc/init.d/httpd restart
もう一回アクセスしてみる
もう一回,http://<自分のサーバのドメイン名>/myappにアクセスすると,今度こそ無事にpyramidtestが起動しているがわかる.
ちなみに,こんな感じ.
良い感じ.
複数のPyramidプロジェクトを起動させたい場合には,
WSGIDaemonProcess [デーモンプロセス名] user=apache group=apache threads=1 \ python-path=[pythonのパス] WSGIScriptAlias [アクセスするURL] [WSGIスクリプトのパス] <Directory [プロジェクトのパス]> WSGIProcessGroup [デーモンプロセス名] Order allow,deny Allow from all </Directory>
を/etc/httpd/conf.d/mod_wsgi.confに追記していく感じでいいと思う.
デーモンプロセス名は自分がわかりやすいように,他と重複しないように付ければいい.
Apacheの再起動も忘れずに.