技術評論社から出ている「Nginx ポケットリファレンス」が要領よくまとまっています。PHPがはやるのは、環境構築が極めて簡単という麺もあるかと思います。言語仕様としては、Pythonの方が面白いのですが、Djangoなどフレームワークで作成したアプリケーションのデプロイの仕方がよく分からない。本書は各アプリケーションのデプロイの仕方をそれなりに詳しく記述していて、参考になりました。
Nginxの/etc/sites-enabled/defaultの内容は下記です。
# You may add here your # server { # ... # } # statements for each of your virtual hosts to this file ## # You should look at the following URL's in order to grasp a solid understanding # of Nginx configuration files in order to fully unleash the power of Nginx. # http://wiki.nginx.org/Pitfalls # http://wiki.nginx.org/QuickStart # http://wiki.nginx.org/Configuration # # Generally, you will want to move this file somewhere, and start with a clean # file but keep this around for reference. Or just disable in sites-enabled. # # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. ## server { listen 80; # listen [::]:80 default_server ipv6only=on; # Make site accessible from http://localhost/ server_name nginxsvr.com; # root /usr/share/nginx/html; root /var/www/html; index index.html index.htm index.php; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { # try_files $uri $uri/ /index.php?$uri&$args; if (!-e $request_filename) { rewrite ^(.+)$ /index.php?url=$1 last; break; } } #location / { #if ($request_filename = false) { # rewrite ^$ /index.php last; #} #if (!-e $request_filename) { # rewrite ^(.+)$ /index.php?url=$1 last; # break; #} # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules #} # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests #location /RequestDenied { # proxy_pass http://127.0.0.1:8080; #} #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # #error_page 500 502 503 504 /50x.html; #location = /50x.html { # root /usr/share/nginx/html; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_split_path_info ^(.+\.php)(/.+)$; # fastcgi_pass 127.0.0.1:9000; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # fastcgi_param PATH_INFO $fastcgi_script_name; # include fastcgi_params; # # With php5-fpm: fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } # for FuelPHP 1.73 server { listen 80; # listen [::]:80 default_server ipv6only=on; # Make site accessible from http://localhost/ server_name fuelphp6.it-ishin.com; # root /usr/share/nginx/html; root /var/www/fuelphp/public; index index.html index.htm index.php; access_log /var/log/nginx/fuelphp-access.log; error_log /var/log/nginx/fuelphp-error.log; location / { # try_files $uri $uri/ /index.php?$uri&$args; if (!-e $request_filename) { rewrite ^(.+)$ /index.php?url=$1 last; break; } } #location / { #if ($request_filename = false) { # rewrite ^$ /index.php last; #} #if (!-e $request_filename) { # rewrite ^(.+)$ /index.php?url=$1 last; # break; #} # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules #} # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests #location /RequestDenied { # proxy_pass http://127.0.0.1:8080; #} #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # #error_page 500 502 503 504 /50x.html; #location = /50x.html { # root /usr/share/nginx/html; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include /etc/nginx/fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } upstream backend { # server 127.0.0.1:8000; server unix:/var/run/django01.sock; } server { listen 80; server_name bootcamp.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; access_log /var/log/nginx/gunicorn-access.log; error_log /var/log/nginx/gunicorn-error.log; location / { proxy_pass http://backend; } location /static/(.*) { alias /home/michiaki/Django/bootcamp/staticfiles/$1; } } upstream backend2 { # server 127.0.0.1:8000; server unix:/var/run/django02.sock; } server { listen 80; server_name mysite.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; access_log /var/log/nginx/django-access.log; error_log /var/log/nginx/django-error.log; location / { # proxy_pass http://localhost:8000; proxy_pass http://backend2; } #location /(.*) { # proxy_pass http://localhost:8000/$1; #} location /static/ { alias /home/michiaki/Django/mysite/static/; } } server { listen 80; server_name mysite2.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; access_log /var/log/nginx/django-access.log; error_log /var/log/nginx/django-error.log; location / { # proxy_pass http://127.0.0.1:8000; proxy_pass http://backend2; } #location /(.*) { # proxy_pass http://localhost:8000/$1; #} location /static/ { alias /home/michiaki/Django/mysite2/static/; } }
これは、Unixドメインソケットを使ってNginxとDjangoアプリケーションを接続する設定例です。この設定のもとで、Nginxを動かせておいて、
sudo gunicorn --daemon --bind unix:/var/run/django01.sock bootcamp.wsgi:application
と打ち込むと、次のようにDjango製のSNSアプリケーションbootcampが立ち上がります。bootcampは、次のサイトに従ってインストールしておきます。https://github.com/vitorfs/bootcamp。このページにインストールガイドがあります。なお、Python2系列用のgunicorn, Python3系列用のgunicorn3はUbuntuでapt-get install gunicorn/gunicorn3でインストールできます。
[追記]ただし、python-dev, python-pipのインストールが必要です。また、pip install requirements.txtで必要なソフトがインストールできますが、デフォルトのデータベースサーバーとして、Postgresql Serverを使っているので、最後の行はコメントアウトする必要がありました。そうすると、デフォルトのデータベースとしてがsqlite3になるので、php5-sqliteもインストールする必要があります。
そのうえで、python manage.py syncdbで/tmp/db.sqlite3が作成されます。これをbootcampデイレクトリィにコピーして、settings.pyでデータベースとしてこのdb.sqlite3を登録する必要がありました。
対応または推奨のDjangoのバージョンは1.6.5なのでうまく行かなければ、インストール時にホームディレクトリの.localにダウンロードされるDjangoとgunicornを使ってください。sudo ~/.local/bin/gunicorn となります。
これは、Ubuntu15.10にVirtuablBoxでUbuntu16.04LTSのalpha2をインストールして動かしたものです。URLで8000番ポートはありません。
最も簡単なお馴染みのPython3系列のDjangoインストール成功画面は次のようになります。
sudo gunicorn --daemon --bind unix:/var/run/django02.sock mysite2.wsgi:application
/var/run上にソケットを作成するので、sudoが必要になります。「ポケット・リファレンス」では一般ユーザーで起動していますが、これはCent OS 7の環境です。これで動くかどうかは分かりませんず、Ubuntuではそうは行きません。
上図はpython3 manage.py runserverで立ち上げたものではありません。Nginx+Gunicorn2/3(アプリケーション・サーバー)です。