NginxでWordpressを使う場合の最初にやっておくこと
NginxでWordpressを扱う場合に以下の設定は、最初にやっておくべきでしょう。
/etc/nginx/nginx.confの設定例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| ...
http {
...
server {
# TCPポート番号 80
listen 80;
# サーバー名 (www 有無両方を受け付ける)
server_name domain1.com www.domain1.com;
# アクセスログのファイルパス
access_log /var/log/httpd/domain1.com.access.log;
# エラーログのファイルパス
error_log /var/log/httpd/domain1.com.error.log;
# www 省略時は、www 付加してホスト名を統一する
if ($http_host = "domain1.com") {
rewrite (.*) http://www.domain1.com$1;
}
...
# WordPress カスタム パーマネントリンク対応
try_files $uri $uri/ /index.php?q=$uri&$args;
# or
# try_files $uri $uri/ /index.php;
# PHPファイルの対応
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
...
}
...
}
|
/etc/nginx/fastcgi_paramsの設定例
(以下はインストール時にデフォルトで設定されているものそのままです)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
|
try_files $uri $uri/ /index.php?q=$uri&$args;
Wordpressのカスタムパーマネントリンクの対応行っています。
要求されたURIが、ファイルあるいはディレクトリが存在するかチェックし、存在しない場合は、index.php
へリダイレクトします。
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
|
FastCGIの対応を設定しています。
fastcgi_pass 127.0.0.1:9000;
FastCGIが開いているソケットあるいはポートへのパスを設定します。
ここでは、FastCGIのサーバーおよびポート番号を設定します。
FastCGIのファイル名省略時のデフォルトファイル名を設定します。
ここで指定されたファイル名は、/
で終了しているURIの場合、変数$fastcgi_script_name
に格納されます。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
FastCGIサーバのパラメータを設定します。
ここでは、SCRIPT_FILENAME
パラメータを $document_root + $fastcgi_script_name
定義しています。
FastCGIサーバのデフォルトパラメータを読み込みます。
Wordpressの設定として必要なものは、
try_files $uri $uri/ /index.php?q=$uri&$args;
につきると思います。
Apacheでは、以下のように .htaccess に記述します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
|
これを、そのままNginxで記述してみると、
...
http {
...
server {
...
location / {
...
try_files $uri $uri/ /index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
...
}
...
}
...
}
...
|
このように
try_files
の1行です。
先の例では、明示的に
q パラメータと
$args を設定していますが、上記の例のようにパラメータなしでも動作します。
ただ、プラグインの関連もありますので、十分に確認しましょう。
Nginx キャッシュでWordpressを使う場合に気を付けること
ここでは、
Nginx キャッシュ機能(リバースプロキシ、FCGIキャッシュ)とともにWordpressを使う場合に注意すべき点をまとめてみました。
WordPressの最大メモリ使用量に気を付けること
Wordpressは、あらかじめ設定されている最大メモリ使用量を超えた場合、真っ白なページ(White page あるいは Blank page と呼ばれる)を出力することがあります。
それも 正常なエラーステータス 200 で出力することがあります。
その場合、キャッシュに真っ白なページが保存され、キャッシュが更新されない間は、その真っ白なページが訪問者に表示されることがあります。
そのようなことがないように多少ゆとりもってメモリサイズを設定しておきましょう。
メモリサイズは、
wp-config.php 等で以下のように設定することができます。
...
// 以下は、128MB を設定しています。
// -- wp-settings.phpの前に設定しておきましょう。
define('WP_MEMORY_LIMIT', '128M');
...
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
...
|
デフォルトのメモリサイズは、
Wordpress 3.0 以降では、/wp-includes
/default-constants.php で設定され、
マルチサイトを運用している場合は、 64MB
シングルサイトを運用している場合は、 40MB
となっています。
以下はデフォルトのメモリサイズを設定している箇所です。
...
// set memory limits
if ( !defined('WP_MEMORY_LIMIT') ) {
if( is_multisite() ) {
define('WP_MEMORY_LIMIT', '64M');
} else {
define('WP_MEMORY_LIMIT', '40M');
}
}
...
|
WordPressでキャッシュしてはいけないディレクトリ、ファイルを設定する
Wordpressで、管理ページは、一切、キャッシュすべきではありません。
/etc/nginx/nginx.conf の server ディレクティブで、以下のように設定することができます。
...
server {
listen 80;
server_name domain1.com www.domain1.com;
access_log /var/log/httpd/domain1.com.access.log;
error_log /var/log/httpd/domain1.com.error.log;
if ($http_host = domain1.com) {
rewrite (.*) http://www.domain1.com$1;
}
location / {
# キャッシュ有無フラグの初期化を行います。
# -- (0:キャッシュする、1:キャッシュしない)
set $do_not_cache 0;
# (*1)クッキーにより、ログイン中、コメント書き込み中、記事書き込み中の判断をします。
if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
set $do_not_cache 1;
}
# (*1)Wordpressの専用ディレクトリはキャッシュなし。
if ($request_uri ~ "^/wp-admin/.*"){
set $do_not_cache 1;
}
if ($request_uri ~ "^/wp-content/.*"){
set $do_not_cache 1;
}
if ($request_uri ~ "^/wp-includes/.*"){
set $do_not_cache 1;
}
# (*1)Wordpressのcronはキャッシュなし。
if ($request_uri ~ "^/wp-cron.php.*"){
set $do_not_cache 1;
}
# (*1)Wordpressのloginはキャッシュなし。
if ($request_uri ~ "^/wp-login.php.*"){
set $do_not_cache 1;
}
# FastCGI キャッシュの場合
# -- (*2)存在するファイルはキャッシュなし。
if ($request_uri ~* "\.(jpg|jpeg|gif|css|png|js|ico|xml|txt)$"){
set $do_not_cache 1;
}
# モバイル(携帯を含む)で出力を切り替えている場合は
# -- (*3)通常のPCからのアクセスとモバイルで異なるページを出力している場合は、モバイル側をキャッシュなし。
if ($http_x_wap_profile ~ ^[a-z0-9\"]+) {
set $do_not_cache 1;
}
if ($http_profile ~ ^[a-z0-9\"]+) {
set $do_not_cache 1;
}
if ($http_user_agent ~ ^.*(2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800).*) {
set $do_not_cache 1;
}
if ($http_user_agent ~ ^(w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-).*) {
set $do_not_cache 1;
}
if ($http_user_agent ~ ^(DoCoMo/|J-PHONE/|J-EMULATOR/|Vodafone/|MOT(EMULATOR)?-|SoftBank/|[VS]emulator/|KDDI-|UP\.Browser/|emobile/|Huawei/|IAC/|Nokia|mixi-mobile-converter/)) {
set $do_not_cache 1;
}
if ($http_user_agent ~ (DDIPOCKET\;|WILLCOM\;|Opera\ Mini|Opera\ Mobi|PalmOS|Windows\ CE\;|PDA\;\ SL-|PlayStation\ Portable\;|SONY/COM|Nitro|Nintendo)) {
set $do_not_cache 1;
}
# (*4)GET要求以外はキャッシュなし。
if ($request_method != "GET") {
set $do_not_cache 1;
}
# FastCGI キャッシュ と リザーブプロキシ キャッシュ で、それぞれ以下のような設定を行います。
# -- それぞれで ディレクティブが異なります。
# FastCGI キャッシュの場合
# -- キャッシュするか否か
fastcgi_no_cache $do_not_cache;
# -- キャッシュを使用するか否か
fastcgi_cache_bypass $do_not_cache;
...
# リザーブプロキシ キャッシュの場合
# -- キャッシュするか否か
proxy_no_cache $do_not_cache;
# -- キャッシュを使用するか否か
proxy_cache_bypass $do_not_cache;
...
}
}
...
|
- (*1)
通常、Wordpressのログイン中は、Wordpressから以下のようにヘッダ情報が出力されます。
...
Expires Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control no-cache, must-revalidate, max-age=0
...
|
Expiresによって、キャッシュされてもキャッシュの保持期間は、0未満なので、すぐにキャッシュ開放されるようになっています。
Cache-Controlの
no-cache にてキャッシュしないようになっていて、
must-revalidate にて更新が必要となっていて、
max-age にてコンテンツの寿命なしとなっていて、
キャッシュしないように、また、キャッシュされてもキャッシュの保持期間は、0なので、すぐにキャッシュ開放されるようになっています。
そのため、上記のクッキーによるログイン中の判断やWordpressのディレクトリの判断によるキャッシュ制御は不要のように思われるかもしれません。
ただ、注意しなければならないのは、既にキャッシュされていた場合、上記の設定がないとNginxでは、そのキャッシュが有効ならキャッシュを使用しようとする点です。
上記の設定では、fastcgi_cache_bypass / proxy_cache_bypass によってキャッシュを利用しないようにしている点に注意してください。
この設定により、ログイン中の判断やWordpressのディレクトリ配下のファイルの場合は、仮にキャッシュが存在しても使用しないようになります。
- (*2)
Nginxの場合は、存在するファイルはキャッシュしない方が良いとされています。
キャッシュしてもキャッシュしない場合と同等かそれ以下の速度でしかレスポンスしないと言われていて、キャッシュする意味がありません。
(リザーブプロキシの場合で、ウェブサーバーと別サーバーとなっている場合は別です。)
FastCGIキャッシュを使用している場合は、存在するファイル(画像ファイル、CSSファイル、JavaScriptファイル)はキャッシュしないようにします。
- (*3)
携帯を含むモバイルからのアクセスに対して、ページを切り替えている場合は、キャッシュしないようにする必要があります。
これは、同じURLで表示イメージが違うからですが、モバイルとPCのどちらをキャッシュするかは、アクセスが少ない方をキャッシュすべきでしょう。
それは、ある程度、Google Analytics などを使ってアクセスを分析してから、判断するのが良いと思います。
ここでは、とりあえずモバイルからのアクセスをキャッシュしないようにしています。
- (*4)
GET要求以外は、キャッシュしないようにする必要があります。
要求として POST or HEAD などがありますが、POSTは、処理要求そのままですから、常に動的でなければなりません。また、最近増えているアクセスがHEADです。
HEADは、文字通りヘッダー情報のみのやり取りを要求したもので、実際のページを出力しません。そのため、キャッシュには空白ページがキャッシュされ、キャッシュ以降に訪れたユーザは、真っ白なページを見ることになりかねないのです。
(実際、このサイトでは、最近まで空白ページが出力されていました。気を付けましょう。)
ここで注意すべき点は、アドレス(URL)をチェックする際に、
$request_uri を使って判断している点です。
$uriでないことに注意してください。
例えば、Wordpressでパーマリンクの設定を /カテゴリ/ポスト名 としていたとします。
以下の設定例では、http://www.domain1.com/sample-category/sample-post については、キャッシュしないようにしたわけです。
...
try_files $uri $uri/ /index.php?q=
...
set $do_not_cache 0;
# ここでURIをチェック
# カテゴリ : sample-category
# ポスト : sample-post
if ($uri ~ "^/sample-category/sample-post"){
set $do_not_cache 1;
}
fastcgi_no_cache $do_not_cache;
fastcgi_cache_bypass $do_not_cache;
...
|
この設定では思ったとおり
キャッシュなしになりません。
これは、
try_files で $uri が変更されるからです。
これが厄介なのは、
try_files が if 文の前であっても後であっても結果は同じで、
キャッシュなしになりません。
...
set $do_not_cache 0;
# ここでURIをチェック
# カテゴリ : sample-category
# ポスト : sample-post
if ($uri ~ "^/sample-category/sample-post"){
set $do_not_cache 1;
}
fastcgi_no_cache $do_not_cache;
fastcgi_cache_bypass $do_not_cache;
...
try_files $uri $uri/ /index.php?q=$uri&$args;
...
|
感覚的には、
try_files で $uri が変更されるのだから、その前のif文では、$uri=/sample-category/sample-post なのではないかと思いがちですが、
上記も同じ結果を得ます。
つまり 設定ファイルの書き順通りに処理されるわけではないことに注意する必要があります。
ユーザのブラウザから要求されたURIで判断したい場合は、変更されない
$request_uri を使用しなければならないことに注意してください。
上記のイメージを実現するには、以下のように書き換えれば良いです。
...
set $do_not_cache 0;
# ここでURIをチェック
# カテゴリ : sample-category
# ポスト : sample-post
# if ($uri ~ "^/sample-category/sample-post"){
if ($request_uri ~ "^/sample-category/sample-post"){
set $do_not_cache 1;
}
fastcgi_no_cache $do_not_cache;
fastcgi_cache_bypass $do_not_cache;
...
try_files $uri $uri/ /index.php?q=
...
|
ここでは、FastCGIキャッシュを使っていますが、リバースプロキシキャッシュも同じ動作です。
いかがだったでしょうか?
Nginx + WordPressを使う場合の注意すべきポイントを簡単に解説してみました。
FastCGIキャッシュ、リバースプロキシ キャッシュともに、
思ってもいないようなキャッシュによって、期待しないページが表示されることもあります。
特にキャッシュを使う時は、気を付けましょう。
コメントを投稿 :