Program, サーバー

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を出力するものが埋まっているはず
  • 原因除去してキャッシュ有効化完了

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

Facebook / 広告
2013年02月03日 | Posted in Program, サーバー3 Comments » 

関連記事

コメント3件

  • […] nginxのキャッシュが効かなくてハマりかけた | Zafiel […]

  • @inaba_n より:

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

  • wg koro より:

    おお知らなかった!
    情報ありがとうございます!

  • コメントを残す

    メールアドレスが公開されることはありません。

    スパム対策のため、コメントする際は下記の計算式を埋めてください。 計算式の有効期限が切れました。計算式の隣にある再読み込みボタンを押してください。