W3 Total Cache+AMPプラグインでnginxが起動しない件を対処【WordPress】

 2021年7月28日

先日、本番系でのトラブル発生には至らなかったものの、nginx + WordPress + W3 Total Cache + 公式 AMP プラグインで nginx が起動しない症状に出くわしたので、対処方法をシェアしておきます。

テスト系で気が付いたんですよね。

具体的な症状としては、nginx を起動時、以下のようなエラーが出る、というもの。

# systemctl start nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.Code language: PHP (php)

journalctl で詳細を見ると、nginx の設定ファイル上で指定されている "w3tc_amp" 変数が無い、という感じのエラーが出ていました。

-- Unit nginx.service has begun starting up.
Jun 12 17:21:01 localhost.localdomain nginx[2189]: nginx: [emerg] unknown "w3tc_amp" variable
Jun 12 17:21:01 localhost.localdomain systemd[1]: nginx.service: control process exited, code=exited status=1
Jun 12 17:21:01 localhost.localdomain systemd[1]: Failed to start nginx - high performance web server.
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit nginx.service has failed.
--
-- The result is failed.
Jun 12 17:21:01 localhost.localdomain systemd[1]: Unit nginx.service entered failed state.
Jun 12 17:21:01 localhost.localdomain systemd[1]: nginx.service failed.
Code language: JavaScript (javascript)

w3tc というプリフィックスなので、こりゃあ、W3 Total Cache 絡みだろう、と思ったらそのとおり。

WordPress のホームディレクトリ内に W3TC が書き出した「nginx.conf」内にある、以下のリライト設定をエディタで削除したら nginx が起動するように。

if (!-f "$document_root/wp-content/cache/page_enhanced/$http_host/$w3tc_request_uri/_index$w3tc_ua$w3tc_ssl$w3tc_preview$w3tc_amp.html$w3tc_enc") {
  set $w3tc_rewrite 0;
}
if ($w3tc_rewrite = 1) {
    rewrite .* "/wp-content/cache/page_enhanced/$http_host/$w3tc_request_uri/_index$w3tc_ua$w3tc_ssl$w3tc_preview$w3tc_amp.html$w3tc_enc" last;
}
Code language: JavaScript (javascript)

目先の設定は以上。

ただし、この設定は、W3 Total Cache の設定の「拡張機能」→「AMP」を無効化しないとまた書かれるので注意。

プラグイン設定ページの説明によると、W3TC の AMP 拡張は minify との互換性のための機能とのこと。この機能をオフにすると、AMP ページの minify もオフになりそうです。

今回の症状は、ページキャッシュ方法として「ディスク:拡張」を使っているケースで発生しましたが、その設定だと AMP 向け URL のクエリストリング "?amp=1" が付いたページを個別にキャッシュすることができないため、本番系でそのままの設定にすることは無かったであろうとは思います。

このあたり、W3 Total Cache で AMP ページを他のテンプレートとは別にキャッシュするのに必要な勘所ですので、興味のある方は深堀りしてみてください。

Hatena Pocket Line

コメントを記入