Nginxのプロキシキャッシュで画面が真っ白になる

今日ブログにアクセスしてチェックしてみるとトップページが真っ白になってました。何でだろうと原因を探っていると下記の記事と全く同じ現象が起きていました。

大トラブル発生!?nginxのキャッシュ設定で気をつけたいこと

HEADのアクセスでキャッシュすると真っ白になる

普段HEADでアクセスなんてしないので完全に盲点でした…。HEADでアクセスした際に本文のない応答がキャッシュに入っちゃってそれがそのまま使われてしまうという事ですね。

先日書いたこちらの記事だと、下記のような設定になっていました。抜粋です。

  set $mobilef '';
  if ($http_user_agent ~* '(iPhone|iPod|Android.*Mobile|Windows.*Phone|dream|CUPCAKE|BlackBerry|webOS|incognito|webmate)') {
    set $mobilef 'mobile.';
  }
  fastcgi_cache_key "$mobilef$scheme://$host$request_uri";
 
  set $do_not_cache 0;
  if ($request_method = POST) {
    set $do_not_cache 1;
  }
  if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
    set $do_not_cache 1;
  }
  if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
    set $do_not_cache 1;
  }

上記の設定だとPOST以外はキャッシュするという条件になっています。これをGETだけキャッシュするように変更しました。

  if ($request_method !~ ^(GET)$) {
    set $do_not_cache 1;
  }

これで下記のようにHEADでアクセスしてもキャッシュされなくなりました。これで問題なし。

$ curl --head http://takayukii.me

原因はUptime RobotのHTTPアクセス

原因は外形監視ができるUptime Robotをしかけたのが原因でした。下記のFAQにHEADを使うとしっかり書かれています。

FAQ

For HTTP monitors, no, as they use HTTP HEAD requests and the tracking codes the analytics services won’t be downloaded.

そして、このHTTPモニターですが、真っ白キャッシュ現象の場合はHTTPステータスコードが200で返ってくるので異常を検知できなかったりします。今回合わせてキーワードモニターもUptime Robotで設定しました。

キャッシュはやはりいろいろトラブルの元になりますね。トラブルが起きたのがこの個人用のブログで良かった。