[[ともっくす alloc] init]

ともっくすの雑多な日記と技術的なメモ

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の再起動も忘れずに.