WordPress で Nginx の FastCGI Cache をパージするプラグインの変更

スポンサーリンク

 今までは Nginx の FastCGI Cache にてアクセス元のデバイスが「PC かモバイル端末か」でキャッシュを分けていたので、公開されている WordPress のプラグインをインストールしてそのままでは運用できなかった。
 その為、Nginx Proxy Cache Purge というシンプルなプラグインをインストールして独自にカスタマイズして対応してきた。

Nginx Proxy Cache Purge
Purges the nginx proxy cache when you publish or update a post or page.

 しかしここ最近では当サイトも WordPress のテーマがレスポンシブである事もあり、アクセスしてくる端末に依存しないコンテンツ出力へと変更。FastCGI Cache に関しても PC 用とモバイル端末用に分ける必要もないために一本化する作業を行った。
 作業後にアクセスログで特に error.log を眺めていたところ Nginx Proxy Cache Purge によるキャッシュパージでは表面上正常に処理できてはいる物のエラーを吐きながらの処理になっていた。

 例えばこのように。

PHP message: PHP Warning:  Use of undefined constant path - assumed 'path' (this will throw an Error in a future version of PHP) in /home/hoge/public_html/wp-content/plugins/nginx-proxy-cache-purge/nginx-proxy-cache-purge.php on line 15
PHP message: PHP Warning:  Use of undefined constant scheme - assumed 'scheme' (this will throw an Error in a future version of PHP) in /home/hoge/public_html/wp-content/plugins/nginx-proxy-cache-purge/nginx-proxy-cache-purge.php on line 20
PHP message: PHP Warning:  Use of undefined constant host - assumed 'host' (this will throw an Error in a future version of PHP) in /home/hoge/public_html/wp-content/plugins/nginx-proxy-cache-purge/nginx-proxy-cache-purge.php on line 20

 キャッシュのパージは出来ていても、裏でエラーを吐いているのはなんだか気持ちの悪い物でキャッシュ構造を単純化したなら他のプラグインを試してみようと言う事で探してみた。

 今回見つけてきた物は Nginx Helper というプラグイン。

Nginx Helper
Cleans nginx's fastcgi/proxy cache or redis-cache whenever a post is edited/published. Also does a few more things.

 このプラグインは Nginx に ngx_cache_purge モジュールがあっても無くても動作する物。
 ngx_cache_purge モジュールがある場合にはプラグインが指定する標準的なアドレスへアクセスする事でキャッシュがパージされる。
 モジュールが無い場合にはキャッシュディレクトリ以下をまるっと削除する事でキャッシュをパージするという方法をとる。

 とりあえずこの Nginx Helper をインストールして有効化。設定を行っていく。

 WordPress 管理画面より設定から Nginx Helper を開く。

 Enable Purge にチェックを入れ、キャッシュ方法は nginx Fastcgi cache にチェックを入れる。恐らく Proxy Cache もこっち。
 Purge Method は今回 ngx_cache_purge モジュールを使用しているので Using a GET request~ をチェックした。

 Purging Conditions は全てチェックを入れた。キャッシュをパージするタイミングに関する設定となる。
 コンテンツの出力内容が変化しうる場面全てでパージさせる設定だ。

 ログ出力は特に不要だったのでチェックは入れず Save All Changes をクリックして設定を適用させた。

 この設定にて新規投稿があったり記事編集後とか、コメントが付いた後などは自動でキャッシュがパージされて更新されたコンテンツが出力されるようになる。
 エラーも何一つ吐いていなかったから割とスッキリ使っていけるかなと思う。

2018/09/06 追記

 問題なく使えると思っていた物の feed のキャッシュがパージ出来ていない事に気がついた。
 Nginx Helper にある purger.php を次のように修正して解決した。

--- purger.php.org      2018-09-06 20:11:52.919140873 +0900
+++ purger.php  2018-09-06 20:13:01.863286674 +0900
@@ -225,10 +225,10 @@
                                        $this->_delete_cache_file_for( $_url_purge );
 
                                        if ( $feed ) {
-                                               $feed_url = rtrim( $_url_purge_base, '/' ) . '/feed/';
+                                               $feed_url = rtrim( $_url_purge_base, '/' ) . '/feed';
                                                $this->_delete_cache_file_for( $feed_url );
-                                               $this->_delete_cache_file_for( $feed_url . 'atom/' );
-                                               $this->_delete_cache_file_for( $feed_url . 'rdf/' );
+                                               $this->_delete_cache_file_for( $feed_url . '/atom' );
+                                               $this->_delete_cache_file_for( $feed_url . '/rdf' );
                                        }
                     break;
                                case 'get_request':
@@ -244,10 +244,10 @@
                                        $this->_do_remote_get( $_url_purge );
 
                                        if ( $feed ) {
-                                               $feed_url = rtrim( $_url_purge_base, '/' ) . '/feed/';
+                                               $feed_url = rtrim( $_url_purge_base, '/' ) . '/feed';
                                                $this->_do_remote_get( $feed_url );
-                                               $this->_do_remote_get( $feed_url . 'atom/' );
-                                               $this->_do_remote_get( $feed_url . 'rdf/' );
+                                               $this->_do_remote_get( $feed_url . '/atom' );
+                                               $this->_do_remote_get( $feed_url . '/rdf' );
                                        }
                     break;
                        }

 要は末尾のスラッシュが余計だったということで。

スポンサーリンク