Nginxリバースプロキシ+WordPressサイトを構築する際に以下のようにバックエンドのWordPressからX-Accel-Expiresヘッダを送信すると、ページの種類ごとにキャッシュの有効期限を調整できます。
ぜひお試しを。
nginx.conf
fastcgiの設定のところに以下のように記述してください。
location ~ \.php$ {
include /path/to/nginx/fastcgi_params;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /path/$fastcgi_script_name;
fastcgi_pass_header "X-Accel-Expires";
}
ポイントは、fastcgi_pass_header "X-Accel-Expires";の行です。
この行を追加しないと、fastcgiがリバースプロキシにX-Accel-Expiresヘッダを転送してくれません。
この記述を入れないと、無意味なので必ず入れましょう。
プラグインまたはfunctions.phpの処理
テーマのfunctions.phpもしくはプラグインで以下のような処理を。
<?php
add_action("template_redirect", "my_cache_control");
function my_cache_control() {
if (is_singular()) {
header("X-Accel-Expires: 86400");
} else {
header("X-Accel-Expires: 0");
}
}
?>
上の例では、固定ページや投稿は1時間キャッシュして、その他のページはキャッシュしないでねという指示をWordPressからリバースプロキシに送信しています。
Nginxの設定でこういう処理をしようとすると、ちょっとめんどくさいし複数のサイトがあると修羅場になったりするんですが、この方法なら柔軟に設定できます。
Nginxではリバースプロキシのキャッシュの有効期限を以下の方法でも設定できますが、X-Accel-Expiresは最も優先順位の高い方法でこれ以外の方法を上書きしてくれます。
- X-Accel-Expires ヘッダ
- Cache-Control ヘッダ
- nginx.conf 内の proxy_cache_validパラメータ
(上にあるものほど優先順位が高い。)