nginx(reverse proxy cached) + nginx(backend) + PHP-fpm の設定メモ
既にたくさんの記事でこの設定がありましたが、どれを参考にしてもなかなかうまく動かなかったのですが、自分のためのメモということで、ここに書いておきます。前までは、 nginx(reverse proxy cached) + apache-cgi(backend)でやっていたのですが、nginxがときどき暴走してしまっていたので、ちょっと見直してみました。
うまく動かなかったのは、私の設定がいけてないのがもちろん一番の理由なのですが、もう一つあげるとするのであれば、 wordpress のインストールがドメイン直下ではなく、サブディレクトリ以下だったことです。マルチブログでは、まだ動作を確認していないのですが、近々見てみます。あと、書き込みとかは、全部wordpress_masterサーバで行わせるが、読み込みは、どっちでも行わせるという設定にしています。
wordpressは、 /home/app/ganchiku.com/blog 以下にインストールされていることを前提にして書いています。/home/app/ganchiku.com/ も一応見えるのですが、こっちには他のファイル等を入れていることを前提にしています。
環境:php5-fpm(5.3.5) nginx (1.0.11-1) ubuntu(10.04)
nginx は本家のパッケージを、php5-fpm は launchpadのパッケージをsources.list に加えて適当にインストールします。
nginx(reverse proxy cached)は、ポート80で動かし、リバースプロクシの役割をしてもらいます。また、nginx(backend)は、ポート9001で動かし、ウェブサーバとするのですが、さらにPHPの処理は、バックエンドのPHP-fpmに投げて行います。PHP-fpmはデフォルトでは、ポート9000で動くのですが、unixソケットに変更します。
というわけで、以下ベタ貼り。というか、サイト固有のものだけ変えます。よくここでミスるので、実際に貼りつけてもうまくいかない、なんてことになるんだよなぁ。
まずリバースプロクシ側
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=czone:180m max_size=512m inactive=120m;
proxy_temp_path /var/tmp/nginx;
proxy_cache_key "$scheme://$host$request_uri";
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-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffers 32 16k;
upstream wordpress_master {
server 192.168.1.5:9001 fail_timeout=120s;
}
upstream wordpress_slave {
server 127.0.0.1:9001 fail_timeout=120s;
}
server {
listen 80;
server_name dev.ganchiku.com;
proxy_cache_valid 200 20m;
expires off;
set $do_not_cache 0;
location / {
root /home/app/ganchiku.com;
rewrite ^/$ /blog/ permanent;
}
location /blog/wp-admin {
proxy_pass http://wordpress_master;
}
location /blog/wp-login.php {
proxy_pass http://wordpress_master;
}
location ~ .*\.php {
proxy_pass http://wordpress_master;
}
location /blog {
set $mobile 0;
if ($http_user_agent ~* '(DoCoMo|J-PHONE|Vodafone|MOT-|UP\.Browser|DDIPOCKET|ASTEL|PDXGW|Palmscape|Xiino|sharp pda browser|Windows CE|L-mode|WILLCOM|SoftBank|Semulator|Vemulator|J-EMULATOR|emobile|mixi-mobi
le-converter)') {
set $mobile 1;
}
if ($http_user_agent ~* '(iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|PSP|BlackBerry)') {
set $mobile 2;
}
# If logged in, don't cache.
if ($http_cookie ~* "comment_author_[^=]*=([^%]+)%7C|wordpress_logged_in_[^=]*=([^%]+)%7C") {
set $do_not_cache 1;
}
if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}
proxy_no_cache $do_not_cache;
proxy_cache_bypass $do_not_cache;
proxy_cache czone;
proxy_cache_key "$scheme://$host$request_uri$is_args$args$mobile";
proxy_cache_valid 200 20m;
proxy_cache_valid 404 5m;
proxy_pass http://wordpress_slave;
}
location ~* \.(jpg|png|gif|jpeg|css|js|swf|pdf|ppt|pptx)$ {
proxy_cache_valid 200 120m;
expires 864000;
proxy_cache czone;
proxy_pass http://wordpress_master;
}
location ~* wp\-.*\.php|wp\-admin {
# Don't static file cache admin-looking things.
proxy_pass http://wordpress_slave;
}
location ~* \/[^\/]+\/(feed|\.xml)\/? {
if ($http_cookie ~* "comment_author_[^=]*=([^%]+)%7C|wordpress_logged_in_[^=]*=([^%]+)%7C") {
set $do_not_cache 1;
}
proxy_no_cache $do_not_cache;
proxy_cache_bypass $do_not_cache;
proxy_cache czone;
proxy_cache_valid 200 60m;
proxy_pass http://wordpress_master;
}
location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
# Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
# whether logged in or not (may be too heavy-handed).
proxy_cache_valid 200 120m;
expires 864000;
proxy_pass http://wordpress_slave;
proxy_cache czone;
}
location = /50x.html {
root /var/www/nginx-default;
}
#AWS uses Elastic Load Balancer.
set_real_ip_from 10.0.0.0/8;
real_ip_header X-FORWARDED-FOR;
add_header X-Forwarded-For $http_x_forwarded_for;
log_format htest '$http_x_forwarded_for - $remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
#Custom Error Page
error_page 404 /404.html;
error_page 502 503 504 /50x.html;
access_log /home/app/log/ganchiku.proxy.log;
error_log /home/app/log/ganchiku.proxy.log;
# Set the real IP.
proxy_set_header X-Real-IP $remote_addr;
# Set the hostname
proxy_set_header Host $host;
#Set the forwarded-for header.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
上記で書きましたが、upstreamに wordpress_masterとwordpress_slaveを2つ用意しています。192.168.1.5を書き込みを行うサーバのIPアドレスと固定します。そして、読み込みは、どのサーバで動かしてもローカルのIPとします。これは実は肝で、この設定でオートスケールしても、そのまま使えるようにしているんですね。あと AWS の Elastic Load Balancerを使用しているので、その辺の設定も適当に付けておきました。
次にバックエンド側
server {
listen 9001;
server_name dev.ganchiku.com;
root /home/app/ganchiku.com;
access_log /home/app/log/ganchiku.backend.log;
error_log /home/app/log/ganchiku.backend.log;
index index.php;
try_files $uri $uri/ /blog/index.php?q=$uri;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/tmp/php.socket;
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SERVER_PORT 80;
fastcgi_param SERVER_NAME dev.ganchiku.com;
expires 2h;
}
}
肝は、try_files と indexの指定かな。indexの指定がないと、index.phpがディレクトリインデックスだと認識してくれないので、ちゃんと書きます。デフォルトでなっているだろう、と思ってここを書かずに、うまくいかずに数時間費やしてしまいました。とほほ。
fastcgi_passには、PHP-fpmを指定します。ポートで動かしているのであれば、コメントアウトしている方を使ってください。UNIX ソケットで使用しているのであれば、UNIXソケットのファイルを指してください。
PHP-fpmをUNIXソケットで動かす
Ubuuntuの場合は、 /etc/php5/fpm/pool.d/www.confを変更すればいいかな。独自にファイルを作ってもいいですが、基本一行のみの変更なので、修正しました。
;listen = 127.0.0.1:9000 listen = /tmp/php.socket
listenしている行を変更します。127.0.0.1:9000をコメントアウトして、 /tmp/php.socket に変更してphp-fpmを再起動すれば、ソケットで通信をすることがでできます。いくつかのブログでソケット通信の方が速いと書いてありましたので、それに倣ってみました。
実際は、この設定をサブドメインのマルチブログに適用していないのですが、しなければいけないので、その内容を見てみます。
まぁ、いつものように間違いがあれば、指摘してくださいな。



Shin Ohno 2003-2012