Nginx+PHP-FPMでWordPressを動かすときの設定(パーマリンク・アクセスログ対策)

2016年3月26日

Nginx+PHP-FPMでWordPressを動かすときに必要な設定を行う。

必須の設定が1つ、やっておいた方がいい設定が1つの計2つ。
・カスタムパーマリンク用の設定(必須)
・アクセスログ用の設定(できたら)

前提として以下の2つの設定は行ってある。

CentOS6.5でNginx1.7とPHP-FPM5.5(FastCGI)を連携してPHPを動かす設定

Nginxの基本設定

1. default.confの全体像

今回は、Nginxのバーチャルホストの設定ファイル(default.conf)のみ編集する。

sudo vim /etc/nginx/conf.d/default.conf

変更後のdefaulst.confの全体像がこちら。

[bash]
server {
listen 80 default_server;

server_name runble1.com www.runble1.com;
if ($http_host = www.runble1.com) {
rewrite (.*) http://runble1.com$1;
}

root /var/www/wp;
index index.php;

access_log /var/log/nginx/runble1_access.log main;
error_log /var/log/nginx/runble1_error.log warn;

#error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# WordPress用のリダイレクト設定
try_files $uri $uri/ /index.php?q=$uri&$args;

# WordPress用アクセスログ設定
location ~* \.(gif|jpg|png|ico|css|js)$ {
access_log off;
}
location ~ /wp-admin {
access_log off;
include php_exec;
}
location ~ /wp-content {
access_log off;
include php_exec;
}
location ~ /wp-includes {
access_log off;
include php_exec;
}
location ~ /wp-cron.php {
access_log off;
include php_exec;
}
location ~ /wp-login.php {
access_log off;
include php_exec;
}
location ~ /wp-comments {
access_log off;
include php_exec;
}

# 拡張子がphpの場合
location ~ \.php$ {
# fastcgi(php-fpmの設定)
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

}
[/bash]

2. カスタムパーマリンクの設定

WordPressでカスタムパーマリンクを使っている場合、Nginxでそれに合わせたリダイレクト処理が必須となる。
この設定を行ってないと 404 Not Foundが返ってきてしまうので注意。

そのために、try_filesディレクティブを追加する。
$uri : URLのホスト名以降の情報(パラメータ情報を除く)
$args : URLのパラメータ情報

[bash]
# WordPressのパーマリンクに対応
try_files $uri $uri/ /index.php?q=$uri&$args;
[/bash]

try_filesは、ファイルの存在チェックを行い、存在しない場合はリダイレクト処理を行う。
最後のパラメータ「/index.php?q=$uri&$args」は、確実に存在するものにしておく。

存在チェックは、パラメータで指定された順に行っていく。
この記述では、「$uri」→「$uri/」と判定する(最後のパラメータは判定されない)

リダイレクト処理は、最初に存在したパラメータに対して行われる。
「$uri」と「$uri/」が存在しない場合、最後の「/index.php?q=$uri&$args」にリダイレクトされる。

2. アクセスログの設定

必須ではないが設定しておこう。

アクセスログを取得しないファイル用のlocationを作成し、access_logをoffにしているだけ。
php_execはphpを動かすための設定になる(後述)。

[bash]
# WordPress用アクセスログ設定
location ~* \.(gif|jpg|png|ico|css|js)$ {
access_log off;
}
location ~ /wp-admin {
access_log off;
include php_exec;
}
location ~ /wp-content {
access_log off;
include php_exec;
}
location ~ /wp-includes {
access_log off;
include php_exec;
}
location ~ /wp-cron.php {
access_log off;
include php_exec;
}
location ~ /wp-login.php {
access_log off;
include php_exec;
}
location ~ /wp-comments {
access_log off;
include php_exec;
}
[/bash]

locationは、そのスコープ内で処理を済ませる必要が有る。
そのため、各location内にPHP-FPMの設定を行わなければならない。

ただ、それだと設定ファイルが長くなるので、その部分だけ別ファイルに移し、includeするやり方が見やすい。

sudo vim /etc/nginx/php_exec

PHP-FPMの設定を記述。

[bash]
lcation ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[/bash]

このphp_execファイルをincludeしている。

[bash]
# PHP-FPM用
include php_exec;
[/bash]

リバースプロキシを設定している人は、この2つ以外もやらないといけない。
それはリバースプロキシを設定するときにやろう。

参考

Nginx + php-fpm でWordpressを動かしてみる | レンタルサーバー・自宅サーバー設定・構築のヒント

Nginx で WordPress を使う時の注意点 | レンタルサーバー・自宅サーバー設定・構築のヒント