画像やリンクが無効になっている可能性もあるのでご了承下さい。
はじめに
Nginx Helper は Web サーバー Nginx で WordPress をホストして FastCGI Cache を用いる場合、キャッシュのパージを行う際にとても便利なプラグインである。
ただ、ちょっと動作上問題の部分があったりで旧 Version 1.9.11 をずっと使用してきた。
しかし、バグ有りであってもメンテナンスはされているので、セキュリティ的にも最新版をなるべく使いたいと個人的に思うところがある。
現行最新である Version 2 系を自分で何とか出来ない物かとバグを潰してみたお話し。
バグ確認と修正
コメント投稿時に記事のキャッシュがパージされない
Nginx Helper 1.9.11 まではコメント投稿時であっても正常にコメントの付いた記事のキャッシュをパージしてくれていた。
しかし 2.0.3 では処理が止まってしまってパージされない。
例えばこんな感じに “Status Changed from to approved” とログがあってその先が無い。
つまりキャッシュのパージ処理が動作していないことになる。
2018-12-10 13:40:02 | INFO | * * * * *
2018-12-10 13:40:02 | INFO | * Blog :: ぶっちろぐ ( 1 ).
2018-12-10 13:40:02 | INFO | * Post :: 記事タイトル ( Article ID )
2018-12-10 13:40:02 | INFO | * Comment :: 2082.
2018-12-10 13:40:02 | INFO | * Status Changed from to approved
修正方法
パージを起動するスクリプトは wp-content/plugins/nginx-helper/admin/class-purger.php
となる。
該当箇所は次に示すソースのハイライトした 105 行目となる。
case 'approved':
$this->log( "in case : approves" );
$this->log( "flag = " . $nginx_helper_admin->options['purge_page_on_new_comment'] );
if ( 1 === $nginx_helper_admin->options['purge_page_on_new_comment'] ) {
$this->log( "in if" );
$this->log( '* Comment ( ' . $_comment_id . ' ) approved. Post ( ' . $_post_id . ' ) purging...' );
$this->log( '* * * * *' );
$this->purge_post( $_post_id );
}
問題のある記述はこれ。
if ( 1 === $nginx_helper_admin->options['purge_page_on_new_comment'] ) {
if 文で使われている比較演算子 ===
の型があってないので比較結果は False となりパージを行う関数が呼ばれないのでパージがされなかったと言うことになる。
よって次の様にキャストする事で整数として比較することで正常というか想定した動作に修正する。
if ( 1 === (int) $nginx_helper_admin->options['purge_page_on_new_comment'] ) {
尚、同ファイルの他にも同様に比較している部分が複数存在するが、それらはしっかりキャストされているという謎。凡ミスのバグなのかなと思ってみたり。
動作確認
適当に既存の記事へコメントを付けつつ Nginx Helper のログを眺めてみた。
2019-06-04 00:04:38 | INFO | * * * * *
2019-06-04 00:04:38 | INFO | * Blog :: ぶっちろぐ ( 1 ).
2019-06-04 00:04:38 | INFO | * Post :: 記事タイトル ( Article ID )
2019-06-04 00:04:38 | INFO | * Comment :: 2134.
2019-06-04 00:04:38 | INFO | * Status Changed from to approved
2019-06-04 00:04:38 | INFO | * Comment ( 2134 ) approved. Post ( Article ID ) purging...
2019-06-04 00:04:38 | INFO | * * * * *
2019-06-04 00:04:38 | INFO | * * * * *
2019-06-04 00:04:38 | INFO | * Blog :: ぶっちろぐ ( 1 ).
2019-06-04 00:04:38 | INFO | * Custom post type 'post' :: 記事タイトル ( Article ID ).
2019-06-04 00:04:38 | INFO | * CPT 'post' ( Article ID ) published or edited and its status is published
2019-06-04 00:04:38 | INFO | * * * * *
2019-06-04 00:04:38 | INFO | Function purge_post BEGIN ===
2019-06-04 00:04:38 | INFO | Purging homepage https://bucci.bp7.org/
2019-06-04 00:04:38 | INFO | - Purging URL | https://bucci.bp7.org/
2019-06-04 00:04:38 | INFO | - - https://bucci.bp7.org/xxxxx/ *** PURGED ***
2019-06-04 00:04:38 | INFO | - - https://bucci.bp7.org/xxxxx/feed is currently not cached
2019-06-04 00:04:38 | INFO | - - https://bucci.bp7.org/xxxxx/feed/atom is currently not cached
2019-06-04 00:04:38 | INFO | - - https://bucci.bp7.org/xxxxx/feed/rdf is currently not cached
...
..
.
このようなログとなり、冒頭で書いた “Status Changed from to approved” で止まってその先が処理されないという問題が修正出来た。
正常にコメントの付いた記事のキャッシュがパージされているので、コメントが即時適用されることを確認した。
この件に関し、報告を上げておいた方が良いのかなと思って github の該当リポジトリにある issue を探していたら上記修正内容はとうに既出事項だったようで。
素人なりのデバッグなりやって原因突き止めたのに無駄足だったようだ。楽しかったから良いけど。
2 月下旬に修正コードが上げられているのになんでコミットされないのかは良く分からず。
feed などのパージ URL に関して
Nginx Helper は WordPress の各種 feed の URL としてトレイリングスラッシュ (( URL 末尾にスラッシュを付ける事 )) 有りでパージを行う。
しかし、WordPress のパーマリンク設定が “数字ベース” になっていると、feed の URL にトレイリングスラッシュは付かないのでパージされなくなる。
この辺の細かい WordPress の仕様に追従出来ていないようだし対応されるのを待つあいだ、手動でコードを書き換えるのも面倒だから当ブログのパーマリンク設定をカスタム設定にして数字ベースであってもトレイリングスラッシュを付加するような動作仕様の変更を行った。
パーマリンク設定のカスタム構造で /archives/%post_id%/
とすれば数字ベースにトレイリングスラッシュ有りとなるので変更は単純明快であるし、変更後のアドレスへ自動的に 301 リダイレクトされるから SEO 面でも大きな不安は無い。
おわりに
Nginx の FastCGI Cache を用いればサーバーサイドで WordPress の高速化を行えるが、キャッシュ管理や Nginx Helper などプラグインのメンテナスが面倒になってしまう。
ページの表示速度を上げるか、運用面で楽をするか何れかを選択しろと言われれば面倒でも前者をとりたいタイプなので致し方ないところかなと思った。
コメント