新しい開発環境を構築するにあたり、またApacheとmod_pythonで構築するのもアレだな、ということで流行のnginxを試してみた。
だいたいの情報は、
nginxホーム
http://nginx.net/
NginxJa
http://wiki.nginx.org/NginxJa
nginx 一人 nginx 勉強会 第一回 nginx で Django を動かしてみる
http://d.hatena.ne.jp/Voluntas/20071020/1192875482
NGINX + FastCGI + Django
http://dev.osso.nl/herman/blog/2009/07/28/nginx-fastcgi-django/
Tips for nginx
http://labs.unoh.net/2009/08/tips_for_nginx.html
あたりを見れば分かるのだけど、1つのパターンとして自分が構築した手順をまとめておこうと思う。
インストール
今回構築した環境はUbuntuで、debパッケージもあったのだけど、バージョンが0.6で1つ前のバージョンだったので、ソースからインストールした。
バージョンは安定板の0.7.62。
上記のnginxホームか、NginxJaからtar.gzでダウンロードできる。
SSLを利用する事を想定して、configureで設定
$ tar xvfz nginx-0.7.62.tar.gz $ cd nginx-0.7.62 $ ./configure --with-http_ssl_module $ make $ sudo make install
configure時にpcreがないやらsslが見つからないやら言われて、「入ってるのに!」と困ってたら、devel版が必要だったらしい。
ウノウラボさんのサイトに書いてあるとおり、pcre-devel、zlib-devel、open-ssl-develをdebインストールして無事インストール完了。
インストール先は /usr/local/nginx/ となっていた。
設定
設定ファイルにdjangoプロジェクトをfastcgiで呼び出せるように設定。今回は、preforkで起動することにする。
プロジェクトの構成は下記のような内容とする。
- プロジェクトホーム: /home/user1/workspace/proj1/
- 静的ファイルディレクトリ: {プロジェクトホーム}/static/
- ソケットファイル: {プロジェクトホーム}/logs/proj1.sock
- pidファイル: {プロジェクトホーム}/logs/proj1.pid
/usr/local/nginx/conf/nginx.conf
worker_processes 2; error_log logs/error.log debug; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; keepalive_timeout 75 20; server { listen 80; server_name localhost; location /static { alias /home/user1/workspace/proj1/static; } location / { client_max_body_size 10M; # fastcgi_pass 127.0.0.1:8000; fastcgi_pass unix:/home/user1/workspace/proj1/logs/proj1.sock; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param QUERY_STRING $query_string; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_pass_header Authorization; fastcgi_intercept_errors off; } log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/localhsot.proj1.access.log main; error_log logs/localhost.proj1.error.log; # proxy the PHP scripts to Apache listening on 127.0.0.1:80 } }
fastcgi_paramについては、最初同じconfディレクトリ内にあったfastcgi_paramsというファイルをincludeしていたのだけど、
そうするとどのURLを指定してもトップページした表示されなくなったのでやめた。
client_max_body_sizeは、画像アップロード用に10Mに設定した。デフォルトは1Mらしい。
SSLの設定は試していないので、また今度。
次に、Djangoプロジェクト用にfastcgiの起動スクリプトを作成する。
複数のプロセスが起動するので、こういうスクリプトを作成しておくと再起動に便利らしい。
作成後、実行権限をつけておく。
/home/user1/workspace/proj1/scripts/fastcgi.sh
#!/bin/bash # Replace these three settings. PROJDIR="/home/user1/workspace/proj1" PIDFILE="$PROJDIR/logs/proj1.pid" SOCKET="$PROJDIR/logs/proj1.sock" cd $PROJDIR if [ -f $PIDFILE ]; then kill `cat -- $PIDFILE` rm -f -- $PIDFILE fi exec /usr/bin/env - \ PYTHONPATH="../python:.." \ python manage.py runfcgi method=prefork socket=$SOCKET pidfile=$PIDFILE
起動
nginxの起動
$ sudo /usr/local/nginx/sbin/nginx
nginxを再起動する時は、psでmaster processをチェックしてkillしてる。
django起動と再起動
$ cd /home/user1/workspace/proj1/
$ ./scripts/fastcgi.sh