ほんじゃらねっと

ダイエット中プログラマのブログ

nginx+fastcgi+djangoの環境を構築

新しい開発環境を構築するにあたり、またApachemod_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