nginxのキャッシュが効かなくてハマりかけた

こんばんは、ころすけ(@wg_koro)です。

NGINXロゴ

このブログのサーバーで使っているnginxの設定を見直していました。んー、何か遅いよなぁ。

もしかしてnginxのキャッシュ、使われてないんじゃないか?

キャッシュ未使用だと、ページ受信にかかる時間は551ms
未キャッシュ
※各画像はクリックで拡大できます

キャッシュが使われると42ms。大違い。
キャッシュ済み

今回設定を見直すまで、ずっと上の「キャッシュ未使用な状態」だったのです。

原因は何だろう

とりあえず、ヘッダーにキャッシュステータスを出力させてみる。configファイルのserverブロック以下に下記の一行を追加。

add_header X-Cache $upstream_cache_status;

これでレスポンスヘッダにキャッシュ状態が表示されるようになります。
キャッシュ状態
キャッシュが使われるとHIT、使われていない場合はMISSと出力されます。

これであちこちのページを見てみる。・・・うん、やっぱりキャッシュ使われていないや・・・。

レスポンスヘッダーをよく見てみると

Cache-Controll: no-cache, max-age=0

というのが出力されている。そりゃキャッシュしないわけだ。
キャッシュされてない

nginx document HttpProxyModule

The following response headers flag a response as uncacheable unless they are ignored:

・Set-Cookie
・Cache-Control containing “no-cache”, “no-store”, “private”, or a “max-age” with a non-numeric or 0 value
・Expires with a time in the past
・X-Accel-Expires: 0

犯人はどのファイルだ?

WordPress本体がno-cacheを吐きだしているのか?と思い、調べてみる。しかしそんな情報はなし。それじゃプラグイン? grepしてみよう。

find WordPressディレクトリパス -name ‘*.php’ | xargs grep ‘no-cache’

./wp-content/plugins/wordpress-flickr-manager/FlickrPanel.php: header(“Cache-Control: no-cache”);

いた( ゚Д゚ )

このプラグインを無効にするとキャッシュが効きました。よしよし。

原因追及まとめ

  • configにadd_header X-Cache $upstream_cache_status;を追加してキャッシュ状態を確認してみる
  • WordPress自体はキャッシュ無効ヘッダーを出さない
  • プラグイン、あるいはWPテーマPHPのどこかにno-cacheを出力するものが埋まっているはず
  • 原因除去してキャッシュ有効化完了

キャッシュが効かない場合は、参考してみてください。

3件のコメント

  1. proxy_ignore_headers ディレクティブを使用すれば、プラグインのソースコードを改訂しなくてもバックエンドの出す邪魔なヘッダを無視してくれますよ。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください