かなり今更な感じもしますが、最近いろんなサイトでWordpress用のNginxのサイト設定の書き方の流行が変わって来ているようなので、改めて変更点をメモしておきます。
変更点は以下のとおりです。
- パフォーマンスを重視して、fast-cgiはなるべくsocketを使うように設定。
- 最近のNginx(0.8.30以降?)は、SCRIPT_FILENAME の値が既に定義済みらしい。
環境によって、fastcgi_params には無いけど、 fastcgi.conf にはあったりするので、それぞれ要確認。 - php.ini の cgi.fix_pathinfo を 0 にするのを推奨し、それに対応。
- RFC 3875の仕様に沿って、PATH_INFO と PATH_TRANSLATED を追加。
- セキュリティの為、 /wp-content/uploads/ 内は PHP を起動しない。
設定サンプル
upstream php {
server unix:/tmp/php-cgi.socket;
server 127.0.0.1:9000;
}
server {
server_name domain.tld;
root /var/www/wordpress;
index index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
if ($uri !~ "^/wp-content/uploads/") {
fastcgi_pass php;
}
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
location ~ /\.ht {
deny all;
access_log off;
log_not_found off;
}
}
ルートじゃない場合の設定
location /wordpress {
try_files $uri $uri/ /wordpress/index.php;
}
location ~ \.php$ {
fastcgi_split_path_info ^(/wordpress)(/.*)$;
...
if ($uri !~ "^/wordpress/wp-content/uploads/") {
fastcgi_pass php;
}
}
マルチサイトの設定等も最近はよく見かけますが、自分は検証用のマルチサイトを持っていないので、紹介は控えます。
追記
書き忘れましたが、何らかの理由で PATHINFO パーマリンク の設定にしている場合は以下の設定が必要です。
location ~ \.php$ {
#下記の1行を追加
fastcgi_split_path_info ^(.+\.php)(.*)$;
...
}