ngx_cache_purge module + WordPressプラグインでNginx proxy_cacheを快適に

ngx_cache_purge

ngx_cache_purge moduleを導入して、任意の記事のキャッシュファイルを指定して削除できるようになりました。さらにWordPressのプラグインを利用すれば、記事が投稿・更新されると同時にキャッシュファイルを削除してくれます。

ngx_cache_purge module

nginxのproxy cacheを使い始めると、記事を更新したときにproxy cacheの有効期限が切れるまで待たないと、記事の最新バージョンを見ることができません。それかキャッシュファイルを手動で削除すればいいのですが、たくさんあるキャッシュファイルから削除したい記事のキャッシュファイルをキャッシュキーで検索するのも大変です。結局すべてのキャッシュファイルを削除してる人が多いと思います。そうするとまたすべてのページでキャッシュを作り直す必要がでてきて非効率的な感じ。新規投稿や更新したときに自動的にそのページだけのキャッシュを削除してくれないものか・・・
ngx_cache_purge module + WordPressのNginxプラグインでできました!

ngx_cache_purge moduleをインストール

ngx_cache_purge moduleはデフォルトで使用できないので、ソースから再インストールしてその際にadd_moduleする必要があります。

# Download ngx_cache_purge
mkdir -p /usr/share/nginx
cd /usr/share/nginx
wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz
tar -xzvf ngx_cache_purge-2.1.tar.gz

# Download and Install nginx-1.4.4
wget http://nginx.org/download/nginx-1.4.4.tar.gz
tar -xvzf nginx-1.4.4.tar.gz
cd nginx-1.4.4/
./configure --prefix=/etc/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-log-path=/var/log/nginx/access.log \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-scgi-temp-path=/var/lib/nginx/scgi \
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
--lock-path=/var/lock/nginx.lock \
--pid-path=/var/run/nginx.pid \
--with-debug \
--with-http_addition_module \
--with-http_dav_module \
--with-http_geoip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_sub_module \
--with-http_xslt_module \
--with-ipv6 \
--with-sha1=/usr/include/openssl \
--with-md5=/usr/include/openssl \
--with-mail \
--with-mail_ssl_module \
--add-module=/usr/share/nginx/ngx_cache_purge-2.1
make
make install

この前作ったngx_pagespeed moduleをadd_moduleしてインストールするChefのレシピにもngx_cache_purge moduleを追加しました。

nginxの設定追加

vhostの設定にngx_cache_purge用の設定を追加します。

server {
	
	## 中略 ##
	
	location / {
		proxy_pass http://backend;
		set $do_not_cache 0;
		proxy_no_cache $do_not_cache;
		proxy_cache_bypass $do_not_cache;
		proxy_cache zone;
		proxy_cache_key $scheme://$host$uri$is_args$args;
		proxy_cache_valid  200 1d;
	}

	location ~ /purge(/.*) {
		proxy_cache_purge zone "$scheme://$host$1$is_args$args";
	}
	
	## 中略 ##
}

proxy_cache_purgeにproxy_cacheのゾーンとキャッシュキーを指定すると該当するキャッシュファイルを削除してくれます。
http://tactosh.comのキャッシュを削除したいときはhttp://tactosh.com/purge/
http://tactosh.com/2014/01/ngx_pagespeed-score/の場合は、http://tactosh.com/purge/2014/01/ngx_pagespeed-score/にアクセスすればキャッシュを削除できて下の画像のように表示されます。

今まではproxy_cache_keyを

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

にしていましたが、これだとlocation ~ /purge(/.*)ブロックの中で$proxy_hostが読み取れないのが原因で404エラーになってしまったので今回のでURLっぽいキャッシュキーに変更しました。

WordPressのNginxプラグインインストール

次に記事を投稿・更新したときにフックでキャッシュファイルを削除させるためにこちらのWordPressのプラグインをインストールします。管理画面で検索だとプラグイン名「Nginx」のものです。
インストールが完了したら設定画面でEnable Cache PurgeのチェックをONにします。

そうすると以下のオプションが出てきます。

これで

  1. 記事投稿
  2. 記事更新
  3. 記事削除
  4. コメント追加

されたときにキャッシュが削除されるようになりました!

最後に、どのブラウザからも/purge/にアクセスできるのはよくないので、

location ~ /purge(/.*) {
	allow 127.0.0.1;
	deny all;
	proxy_cache_purge zone "$scheme://$host$1$is_args$args";
}

のようにしてIP制限をするのが良いそうです。

これで快適なWP LIFEですね!

  • Tetsuya Saitou

    TACTOSH様
    こんにちは

    tetuya0703と申します
    HPを拝見させていただき、Nginxにcache_purage、wordpressにNiginx Helperをinstallしました

    私の環境はNginxとwordpressが別サーバーで運用をしていてフロントエンドとしてNginxがcacheとproxyをしてバックエンドのwordpressに問い合わせをする構成にしています

    当然のことながら、Nginxでcacheをしていることから記事を投稿しても、Nginxのcacheが有効の期間は新規の記事がみれません。都度、nginxでcache_purageをするのも運用上、大変なのでTACTOSH様が紹介されているwordpressのプラグインであるNginx Helperをinstallして設定をしてみました

    すると、Nginx経由でwordpressの記事の投稿をするとタイムアウトして”internal server error”となってしまいます
    そもそも、私のようなcacheサーバーとwordpressを別サーバーで構成をしている場合にNginx Helperは記事の投稿、削除等の時にNginxのcacheを削除出来るものなのでしょうか

    根本的な質問で強縮なのですが、ご指導頂けますと幸いです

    宜しくお願い申し上げます