nginxのngx_cache_purgeで404が出てハマった話

先日WordPressをnginxのプロキシキャッシュで高速化してみました。その後、新しい記事の投稿時などにキャッシュを消す為にngx_cache_purgeモジュールをインストールしました。それで万事解決と思っていたのですが、nginxのエラーログを見ていて、purge時に404エラーが返っていて、キャッシュが削除できていない事に気づきました。結果的には設定がミスっていただけなのですが、かなりハマったのでメモしておきます。

結論から言うと、プロキシの設定を以下のように行う必要があります。何にハマっていたかというと、proxy_cache_keyの値とproxy_cache_pargeのkeyの値が合ってなかったという恥ずかしい話でした。proxy_cache_keyのデフォルト値は$scheme$proxy_host$request_uriなのですが、proxy_cache_purgeは$1$is_args$argsなので、何も考えずにその辺から値をコピってくると動かないという。

location / {
    proxy_cache         blog_cache;
    proxy_cache_key     $uri$is_args$args;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    Host            $host;
    proxy_pass          http://127.0.0.1:10001;
}

location ~ /purge(/.*) {
    allow       127.0.0.1;
    deny        all;
    proxy_cache_purge   blog_cache      $1$is_args$args;
}

ngx_cache_purgeの挙動を何も解っていなかったのも原因なので、もう少しだけ書いておきます。上記設定の場合に、http://taichino.com/feedのキャッシュを作って消すという手順を確認してみます。

  1. http://taichino.com/feedにアクセス
  2. /var/cache/nginx/0/4e/da6f7b5015a12fe724dc34140c8664e0というキャッシュが生成される
  3. http://taichino.com/purge/feedにアクセス。成功したらSuccessful purgeというページが表示される
  4. 2で確認したキャッシュが削除される

なおWordPressのNginx Proxy Cache Purgeプラグインは、このルールに従って順次/purge/以下のURLにアクセスして、キャッシュを消しているだけです。落ち着いたら何でも無い事にハマり倒してしまう癖が中々直らず困ったものです。

Leave a Reply

Your email address will not be published. Required fields are marked *