npp

Nginx Cache Purge Preload Plugin HELP

ここに見出しテキストを追加

吾輩は猫である。名前はまだない。どこで生れたか頓と見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

Nginx Cache Purge Preload Plugin HELP

私の環境でプラグインが動作しないのはなぜですか?

このWordPressプラグインは、Linuxシステム上で動作するNginxウェブサーバーのみに対応しています。また、shell_exec関数が有効で、かつ制限されていない状態である必要があります。そのため、ネイティブLinuxコマンドがPHP経由で実行できない共有ホスティング環境では、プラグインが完全に動作しない可能性があります。

さらに、パージおよびプリロード処理を正しく機能させるには、PHPプロセスオーナー(PHP-FPM-USER)に適切な権限を付与することが不可欠です。これは、WEBSERVER-USER(nginxまたはwww-data)とPHP-FPM-USERという2つの異なるユーザーロールを持つ、隔離されたユーザー環境で必要となります。

📌 警告が表示されたり、プラグインの設定やタブが無効になっている場合は、権限の問題、サポートされていない環境、またはプラグインの動作に必要な依存関係が不足している可能性があります。

NPPはどのようにキャッシュをクリアするのですか?また、HTTPパージとは何ですか?

NPPパージワークフロー
NPPは階層型パージ戦略を採用しています。単一URLのパージ(手動、更新時の自動パージ、関連URL)の場合、各パスを順番に試行し、いずれかのパスが成功した時点で処理を停止します。「すべてパージ」の場合は、常にファイルシステムを直接使用します。

高速パス1 — HTTPパージ(オプション)
設定でHTTPパージが有効になっており、ngx_cache_purge Nginxモジュールが検出された場合、NPPはモジュールのパージエンドポイントにHTTPリクエストを送信します。モジュールは共有メモリとディスクからキャッシュエントリをアトミックに削除します。HTTP 200が返された場合、ファイルシステムは一切変更されず、パージは完了です。それ以外の応答の場合、NPPは自動的に次のパスに進みます。

高速パス2 — インデックス検索
NPPはプリロード時に作成された、URL→ファイルパスの永続的なインデックスを保持しています。インデックスにURLが見つかり、かつファイルが存在する場合、NPPはディレクトリスキャンを行うことなくファイルを直接削除します。


高速パス 3 — 再帰的なファイルシステムスキャン
どちらの高速パスも成功しない場合、NPP は Nginx キャッシュディレクトリ全体を走査し、各ファイルのキャッシュキーヘッダーを読み取り、一致するエントリを削除します。これは元のワークフローであり、すべての環境におけるフォールバックとして機能します。

すべて削除
「すべて削除」は常にファイルシステム操作を使用し、キャッシュディレクトリの内容全体を再帰的に削除します。HTTP 削除は「すべて削除」には適用されません。Cloudflare APO Sync または Redis Object Cache Sync が有効になっている場合、ファイルシステムの削除が完了した後にこれらの同期が実行されます。

HTTP 削除が利用できない場合
HTTP 削除は完全にオプションです。モジュールが存在しない場合、コンパイルされていない場合、または Nginx で削除場所ブロックが設定されていない場合、NPP は自動的にインデックスとファイルシステムパスにフォールバックします。既存のワークフローは完全に維持され、何も問題は発生しません。

HTTP 削除を有効にする方法
[設定] → [NPP 設定] → [詳細設定] に移動し、HTTP 削除を有効にします。これは、一般的なマネージドホスティングプラットフォーム、コントロールパネル、Ubuntu nginx-extras パッケージを使用するサーバーなど、ngx_cache_purge がプリコンパイルされたスタックでそのまま動作します。

NPPのキャッシュウォームが実際の訪問者によってバイパスされるのはなぜですか?(Accept-Encoding / ダブルキャッシュファイル)

問題点:NPPがキャッシュをウォームアップするが、訪問者が別のキャッシュを作成し、キャッシュミスが発生する
PHPが出力自体を圧縮する場合(php.iniでzlib.output_compression = Onを設定)、レスポンスヘッダーにVary: Accept-Encodingを追加します。Nginxのキャッシュエンジンは、リクエストのAccept-Encodingの値からMD5バリアントハッシュを計算し、それぞれの値ごとに個別のキャッシュファイルを作成します。

NPPのプリローダーは、デフォルトでAccept-Encoding: identityを送信します。これは、圧縮されていないプレーンなコンテンツをリクエストしていることを意味します。実際のブラウザは常に1つの値を送信するため、そのバリアントハッシュはプリロードされたエントリと一致しません。そのため、Nginxは2つ目のキャッシュファイルを作成し、ウォームアップされたキャッシュを完全にバイパスしてしまいます。NPPのプリローダーが送信する内容自体が問題なのではありません。たとえブラウザを完全に模倣していたとしても、ブラウザによって送信する値は異なります(Chromeはzstdを追加し、Safariはbrを省略し、古いクライアントはgzipのみを送信します)。そのため、すべての訪問者に対応する単一のエントリをウォームアップすることは不可能です。これがNPPによるNginxのキャッシュ管理ロジックを破綻させています。これは事実上NPPのキャッシュウォーミングを無効にし、プリロードされたエントリが実際の訪問者に配信されなくなります。唯一の正しい修正方法はNginx/PHP側で行うことです。

これはfastcgi_cache、proxy_cache、uwsgi_cache、scgi_cacheに等しく影響します。

修正方法:必要な変更点2つ
ステップ1 — PHPレベルの圧縮を無効にする(php.ini)
PHPは出力を圧縮したり、Vary: Accept-Encodingを追加したりしてはいけません。圧縮処理はすべてNginxに任せましょう。

; /etc/php/fpm-phpX.Y/php.ini
zlib.output_compression = Off

保存後、PHP-FPMをリロードしてください:systemctl reload php-fpm
ステップ2 — NginxのPHPブロックにfastcgi_ignore_headers Varyを追加する
PHPの圧縮を無効にしても、他のアップストリームコンポーネントがVaryヘッダーを出力する場合があります。このディレクティブは、キャッシュ操作中にNginxにこれを完全に無視するように指示します。

location ~ \.php$ {
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_pass unix:/var/run/php-fcgi-yoursite.sock;
include /etc/nginx/fastcgi_params;
fastcgi_param HTTP_ACCEPT_ENCODING ""; # ← PHPに到達する前にAccept-Encodingを削除します
fastcgi_ignore_headers Vary; # ← セカンダリキャッシュファイルの作成を防止します
fastcgi_cache YOUR_ZONE;
fastcgi_cache_valid 30d;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
fastcgi_cache_lock on;

} なぜ両方必要なのか? fastcgi_param HTTP_ACCEPT_ENCODING “” は、PHP がクライアントの Accept-Encoding 値を認識することを防ぎます。そのため、PHP は圧縮出力を生成したり、Vary: Accept-Encoding を出力したりすることがそもそもできません。 fastcgi_ignore_headers Vary は、2 つ目の防御策です。Vary ヘッダーがアップストリームから届いた場合でも、Nginx はキャッシュ操作中にそれを処理しません。これら 2 つの設定により、クライアントが送信する内容に関わらず、URL ごとに単一のキャッシュファイルが保証されます。

📌 共有 fastcgi_params ファイルに fastcgi_param HTTP_ACCEPT_ENCODING “” を既に設定している場合は、ここで再度設定する必要はありません。include /etc/nginx/fastcgi_params によって自動的に適用されます。

保存後にNginxをリロードしてください:`nginx -t && systemctl reload nginx`

ステップ3 — Nginxにgzipを処理させる(nginx.confのhttpブロック)
PHPの圧縮を無効にすると、Nginxが唯一の圧縮レイヤーになります。これは正しいアーキテクチャです。http {}ブロックに以下の記述があることを確認してください。

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_types text/plain text/css application/javascript application/json text/xml application/xml text/javascript;

`gzip_vary on`は、Nginxから配信されるレスポンスに`Vary: Accept-Encoding`を追加します。ただし、これはキャッシュ検索後に実行されるため、キャッシュファイルの作成には影響しません。キャッシュキーは既に解決済みです。

`fastcgi_ignore_headers Vary`が安全な理由
通常、`Vary`を抑制すると、gzip圧縮されたコンテンツを解凍できないクライアントに配信してしまうリスクがあります。しかし、`zlib.output_compression = Off` の場合、PHP は圧縮出力を生成しないため、コンテンツのバリアントは 1 つしか存在しません。Nginx は、独自の gzip モジュールを使用してクライアントごとにオンザフライで圧縮します。キャッシュファイルは 1 つで、すべてのクライアントに正しく配信されます。

変更前 / 変更後
シナリオ URL ごとにキャッシュファイルを作成 実際の訪問者に対して NPP ウォームヒット リスク
`zlib.output_compression = On`、修正なし 2 (プライマリ + セカンダリ) ❌ ミス — 訪問者はセカンダリファイルを取得 RAM / ディスクの無駄遣い、NPP のプリロードが無効
`zlib.output_compression = Off` + `fastcgi_ignore_headers Vary` 1 ✅ ✅ ヒット — NPP ウォームエントリが配信される なし
📌 注: この問題は、Nginx のすべてのキャッシュタイプ (fastcgi_cache、proxy_cache、uwsgi_cache、scgi_cache) で発生します。設定に応じて、`fastcgi_ignore_headers Vary` / `proxy_ignore_headers Vary` / `uwsgi_ignore_headers Vary` を適用してください。

HTTPパージのためにNginxをどのように設定すればよいですか?また、NPPにはどのようなオプションがありますか?

プリロード処理が正しく機能するためには、サーバーにwgetコマンドがインストールされている必要があります。プラグインはwgetコマンドを使用してページを取得し、キャッシュをプリロードするためです。さらに、プリロード処理中のwgetプロセスのサーバー負荷を効果的に管理するために、cpulimitコマンドをインストールしておくことをお勧めします。

パージとプリロードの動作が正しく機能しないのはなぜですか?

技術的背景:

適切に設定されたNginxサーバーでは、PHP-FPMユーザー(Webサイトユーザーとも呼ばれる)とWebサーバーユーザー(一般的にnginxまたはwww-data)を必ずしも分離する必要はありませんが、これらのユーザーを分離することでセキュリティとパフォーマンスが向上するシナリオも存在します。その理由は以下のとおりです。

セキュリティ:PHP-FPMプロセスをNginx Webサーバーとは異なるユーザーで実行することで、権限昇格のリスクを軽減できます。一方のプロセスが侵害された場合でも、攻撃者は自動的に他方のプロセスを制御下に置くことはできません。

権限管理:ユーザーを分離することで、よりきめ細かな権限設定が可能になります。例えば、PHPスクリプトは必要なディレクトリのみにアクセスを制限でき、Webサーバーユーザーにはファイルシステムの他の部分に対してより制限的な権限を与えることができます。

リソース管理:ユーザーを分離することで、リソース管理と監視が容易になります。ユーザーごとのリソース使用量を追跡しやすくなるためです。

問題提起:

Nginxのキャッシュパージに関する問題は、2つの異なるユーザーが関わる環境でよく発生します。

WEBSERVER-USERは厳格な権限設定のもとでキャッシュフォルダとファイルを作成する役割を担いますが、PHP-FPM-USERはキャッシュパージとプリロード処理を担当するものの、必要な権限を持っていません。

このプラグインは、WEBSERVER-USERとPHP-FPM-USERという2つの異なるユーザーが関わるNginx環境において、キャッシュパージとプリロードを自動化するという課題に対し、あらかじめ用意されたbashスクリプトを提供することで対応します。

権限の問題に対する解決策は何ですか?

WEBSERVER-USER(nginxまたはwww-data)とPHP-FPM-USERという2つの異なるユーザーロールが存在する環境では、事前に作成されたbashスクリプトがNginxキャッシュパスの管理を自動化します。このスクリプトはbindfsを利用して元のNginxキャッシュパスのFUSEマウントを作成し、PHP-FPM-USERが必要な権限でこれらのディレクトリに書き込みできるようにします。このアプローチにより、PHP-FPM-USERに新しいマウントポイントへのアクセス権を付与することで権限の競合を解決し、元のNginxキャッシュパスはそのまま維持され、同期が保たれます。

要約:

このソリューションはbindfsを利用してNginxキャッシュパスのFUSEマウントを作成します。

PHP-FPM-USERは元のキャッシュパスを変更することなく、マウントポイントへの書き込みアクセス権を付与されます。

これにより権限の競合が解決され、キャッシュのパージとプリロード操作がシームレスに実行されます。

このタスクを自動化することで、権限やファイルアクセス管理の手動設定が不要になります。

PHP-FPM-USERへの書き込み権限付与を自動化する解決策はありますか?

bash <(curl -Ss https://psaux-it.github.io/install.sh)

install.sh スクリプトは、psaux-it.github.io にあるメインの fastcgi_ops_root.sh スクリプトを実行するためのラッパーとして機能します。この bash スクリプトは、Nginx Cache Purge Preload WordPress プラグイン (NPP) 用に設計されています。

このスクリプトはまず、PHP-FPM-USER (PHP プロセス所有者または Web サイトユーザーとも呼ばれます) とその関連する Nginx キャッシュ パスを自動的に識別しようとします。

PHP-FPM-USER と対応する Nginx キャッシュ パスを自動的に一致させることができない場合は、manual-configs.nginx ファイルを使用して簡単に手動で設定できます。

一致したパスに基づいて、このスクリプトは Nginx キャッシュ パスの管理を自動化します。bindfs を使用して元の Nginx キャッシュ パスの FUSE マウントを作成し、PHP-FPM-USER が必要な権限でこれらのディレクトリに自動的に書き込めるようにします。

セットアップ(自動または手動)が完了すると、スクリプトはnpp-wordpress systemdサービスを作成し、サーバー再起動時にFUSEマウントが自動的に復元されるようにします。

機能:
自動検出:Nginxキャッシュパスと関連するPHP-FPM-USERSを迅速に設定します。

動的構成:Nginx構成を動的に検出し、シームレスな統合を実現します。

systemd統合:FUSEマウント操作を管理するためのnpp-wordpress systemdサービスを生成し、有効化します。

手動構成サポート:manual-configs.nginxファイルによる手動構成が可能です。

ヒント:さらに、同じホスト上でそれぞれ独自のNginxキャッシュパスと関連するPHP-FPMプールユーザーを持つ複数のWordPressサイトをホスティングしている場合、このスクリプトを1つだけデプロイすることで、NPPプラグインを使用するすべてのWordPressインスタンスを効率的に管理できます。この合理化されたアプローチにより、キャッシュ管理タスクが一元化され、サーバー環境全体で最適な効率性とメンテナンスの簡素化が実現します。

自動検出がうまく機能しない場合は、適切なマッチングを行うために、NginxキャッシュパスにPHP-FPM-USERユーザー名が含まれていることを確認してください。

例えば、PHP-FPM-USERがpsauxitの場合、以下のfastcgi_cache_pathの命名形式はPHP-FPM-USERと完全に一致し、スクリプトによって自動的に検出されます。

fastcgi_cache_path /dev/shm/fastcgi-cache-psauxit
fastcgi_cache_path /dev/shm/cache-psauxit
fastcgi_cache_path /dev/shm/psauxit
fastcgi_cache_path /var/cache/psauxit-fastcgi
fastcgi_cache_path /var/cache/website-psauxit.com

⚠️ 注意:install.shスクリプトは、モノリシック(オールインワン)サーバー、つまりNginx、PHP-FPM、WordPressがすべて同じホスト上で動作する環境向けに設計されています。 Dockerベースのセットアップの場合、専用のDocker統合ツールがgithub.com/psaux-it/wordpress-nginx-cache-dockerで利用可能です。

Nginxキャッシュディレクトリに、自分が指定したパスを使用できないのはなぜですか?

Nginxのキャッシュディレクトリオプションは、重要なシステムファイルやWordPressのインストールデータが誤って削除されるのを防ぐため、許可されるパスを制限します。

許可されるルートパス:

/dev/shm/ — RAMベース(tmpfs)。高速ですが、再起動時に失われます。高性能な環境での使用を推奨します。
/tmp/ — 一時ファイルシステム。テスト環境やメモリ容量の少ない環境に適しています。
/var/ — 永続ディスク。本番環境で最も一般的に使用されます。多くのサブディレクトリはブロックされます(下記参照)。
/cache/ — カスタムマウントポイント。Docker環境や専用キャッシュボリュームを使用する環境に便利です。

有効なパスの例:

/dev/shm/nginx-cache
/tmp/cache
/var/cache/nginx
/var/nginx-cache
/var/run/nginx-cache
/cache/mysite

重要なルール:

パスはルートディレクトリより少なくとも1階層深くなければなりません。/var/cache、/var/run、/cache のようなルートディレクトリはブロックされます。/var/cache/nginx のようなサブディレクトリを使用してください。

システムデータを保護するため、/var/ 内の以下のサブツリーはブロックされます:/var/log、/var/lib、/var/www、/var/spool、/var/mail、/var/lock、/var/backups、/var/snap。

許可されたルートディレクトリ以外のパス(/home、/opt、/srv、/etc、WordPress インストールディレクトリなど)は常に拒否されます。

シンボリックリンクは解決され、リンク先は同じルールに基づいて検証されます。

safexecとは何ですか?

safexecは、PHPのshell_exec()などの上位レベルのコンテキストからツールを実行するための、安全な権限降下型SUIDラッパーです。NPPのバックエンドとしてC言語で記述されており、オプションのLD_PRELOADシムライブラリlibnpp_norm.soと連携します。libnpp_norm.soは、キャッシュのプリロード中にパーセントエンコードされたHTTPリクエスト行を正規化し、Nginxキャッシュキーの一貫性を確保します。

NPPがsafexecを必要とする理由/使用する理由

権限降下:コマンドはnobodyユーザーとして実行されます。

プリロード時のURL正規化
メリット
不正なシェルコマンドの挿入や動作不良によるリスクを軽減します。

プリロードプロセスをWordPress/PHP-FPMから分離します。

推奨されますか?

NPPはPHPのshell_execを深く利用しているため、safexecの使用はすべてのユーザーに強く推奨されます。

インストール方法は?

リリースぺージから.deb、.rpm、または.apkパッケージを使用するか、以下のコマンドを直接実行してください。

curl -fsSL https://psaux-it.github.io/install-safexec.sh | sudo sh
Debian / Ubuntu (.deb)
				
					# Download checksums
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/SHA256SUMS

# For x86_64
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/safexec_1.9.5-1_amd64.deb
sha256sum -c SHA256SUMS --ignore-missing
sudo apt install ./safexec_1.9.5-1_amd64.deb

# For AArch64
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/safexec_1.9.5-1_arm64.deb
sha256sum -c SHA256SUMS --ignore-missing
sudo apt install ./safexec_1.9.5-1_arm64.deb
				
			
RHEL / CentOS / Fedora (.rpm)
				
					# Download checksums
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/SHA256SUMS

# For x86_64
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/safexec-1.9.5-1.el10.x86_64.rpm
sha256sum -c SHA256SUMS --ignore-missing
sudo dnf install ./safexec-1.9.5-1.el10.x86_64.rpm

# For AArch64
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/safexec-1.9.5-1.el10.aarch64.rpm
sha256sum -c SHA256SUMS --ignore-missing
sudo dnf install ./safexec-1.9.5-1.el10.aarch64.rpm

				
			
Alpine Linux (.apk)
				
					# Download checksums
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/SHA256SUMS

# For x86_64
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/safexec-1.9.5-r1.x86_64.apk
sha256sum -c SHA256SUMS --ignore-missing
sudo apk add --allow-untrusted ./safexec-1.9.5-r1.x86_64.apk

# For AArch64
wget https://github.com/psaux-it/nginx-fastcgi-cache-purge-and-preload/releases/download/v2.1.5/safexec-1.9.5-r1.aarch64.apk
sha256sum -c SHA256SUMS --ignore-missing
sudo apk add --allow-untrusted ./safexec-1.9.5-r1.aarch64.apk
				
			

注:パッケージはAlpineの信頼できるキーで署名されていないため、–allow-untrustedオプションが必要です。上記のSHA256チェックサムは整合性の検証に使用されます。

検証:

safexec --version

注:NPPが呼び出せるように、WordPress/PHP-FPMホストまたはコンテナ内にsafexecをインストールしてください。

オプション:クイックテスト
NPPはsafexecを自動的に使用しますが、手動でテストすることもできます。

safexec wget -qO- https://example.com
safexec --kill=<pid>

注:cgroup v2が利用できないシステムでは、分離はrlimitsにフォールバックします。setuid-rootが設定されていない場合、safexecはパススルーモードで動作します。

詳細なドキュメントとソースコード:GitHub » safexec

Cloudflare APO Syncはどのように機能し、どのように有効化すればよいですか?

Cloudflare APO同期
有効にすると、NPPはすべてのキャッシュパージ操作をCloudflareのエッジキャッシュに自動的に反映し、CloudflareでキャッシュされたページとNginxキャッシュを常に同期させます。

要件
公式のCloudflare WordPressプラグインがインストールされ、有効化され、Cloudflareアカウントで認証されている必要があります。NPPは設定を直接読み込むため、NPP自体にAPIキーを入力する必要はありません。HTMLキャッシュを有効にするには、Cloudflareプラグイン内で自動プラットフォーム最適化(APO)またはプラグイン固有キャッシュのいずれかを有効にする必要があります。

有効化方法
[設定] → [NPP設定] → [詳細設定] に移動し、[Cloudflare APO同期]をオンにします。Cloudflareプラグインがインストールされていない、または認証されていない場合、ダッシュボードウィジェットでトグルが「利用不可」と表示され、自動的に無効になります。


削除対象とタイミング
単一URLの削除(手動、更新時の自動削除、コメント数の変更、投稿の削除):NPPは、NginxとCloudflareのエッジキャッシュから、該当ページとその関連URL(ホームページ、カテゴリアーカイブ)を削除します。削除リクエストは効率化のためバッチ処理され、リクエストのシャットダウン時に一度だけ送信されます(API呼び出しごとに最大30URL)。

すべて削除:Cloudflareのゾーンキャッシュ全体が、単一のAPI呼び出し(zonePurgeCache)で消去されます。これはNginxのキャッシュクリアと全く同じです。

デバイスタイプ別APOキャッシュ:Cloudflareプラグインでこの設定が有効になっている場合、NPPは自動的にCF-Device-Type: mobileヘッダーを含む2回目の削除処理を送信し、モバイル専用のキャッシュされたバリアントも削除します。

重要な注意事項
Cloudflareの削除は、CloudflareプラグインでAPOまたはプラグイン固有のキャッシュが実際に有効になっている場合にのみ実行されます。Cloudflare側でHTMLキャッシュが無効になっている場合、削除はスキップされ、ログに記録されます。 NPPはプリロード操作中はCloudflareをパージせず、パージイベントが発生した時のみパージします。

プリロードウォッチドッグとは何ですか?また、いつ有効にすればよいですか?

プリロードウォッチドッグ
プリロードウォッチドッグは、プリロード完了後、キャッシュインデックスの構築、完了メールの送信、モバイルプリロードパスの開始といった後処理タスクが即座に実行されるようにします。

必要な理由
通常、これらのタスクはWP-Cronによって処理されますが、WP-Cronは訪問者のアクセスをトリガーとして動作します。アクセス数の少ないサイトやキャッシュを多用しているサイトでは、プリロード完了後に訪問者がアクセスしない場合があり、後処理タスクの実行が遅延したり、まったく実行されない可能性があります。ウォッチドッグは、プリロード完了の正確なタイミングを検出し、タスクを直接トリガーすることで、この依存関係を解消します。訪問者のアクセスは必要ありません。

有効化方法
[設定] → [NPP設定] に移動し、プリロードウォッチドッグを有効にしてください。アクセス数の少ないサイト、キャッシュを多用しているサイト、およびスケジュールキャッシュ機能を使用しているサイトで特に推奨されます。

注意事項
ウォッチドッグは、プリロードサイクルごとに自動的に起動し、処理が完了すると自動的に終了します。 「すべて消去」によってプリロードがキャンセルされた場合、ウォッチドッグも停止されるため、キャンセルされた実行のためのタスクは起動されません。

このプラグインは、他のNginxキャッシュプラグインと比べて何が違うのですか?

WordPress用のNginxキャッシュプラグインのほとんどは、ngx_cache_purgeモジュールによるキャッシュのパージと基本的なファイルシステムのパージという共通の基本機能を備えています。以下の表は、NPPがこの基本機能を超えてどのような動作をするかを示しています。

Nginx Cache Plugin NPPの機能
ngx_cache_purgeモジュールによるパージ ✅ 主要な方法 ✅ オプションの高速パス(HTTPパージ)
ファイルシステムパージのフォールバック ✅ サポート済み ✅ 3層構造:HTTP → URLインデックス → 再帰スキャン
URL→ファイルパスインデックスによる即時パージ ❌ 不可 ✅ プリロード中に自動的に構築および更新されるため、ディレクトリスキャンを完全にスキップします
マルチユーザー環境(WEBSERVER-USER ≠ PHP-FPM-USER) ❌ ファイルシステムパージはサポートされていません(既知の制限事項) ✅ bindfs + safexec で完全に解決済み(NPP開発の核心的な理由)
シェル操作のプロセス分離 ❌ 不可 ✅ safexec ― 権限を放棄するSUIDラッパー、nobodyとして実行
キャッシュプリロードエンジン ⚠️ 基本 ― シンプルなHTTPフェッチループ ✅ レート制限、CPU制限、拒否正規表現、AMP、モバイルパス、プロキシをサポートする完全なwgetベースのクローラー
モバイルキャッシュのプリロード❌ いいえ ✅ モバイルユーザーエージェントによるプリロード処理を個別に実行
スケジュールされたキャッシュ(cronプリロード) ❌ いいえ ✅ カスタム間隔と時間選択機能を備えた完全なcronスケジューラ
プリロードウォッチドッグ ❌ いいえ ✅ 訪問者トラフィックに依存せずにプリロード後のタスクの実行を保証
キャッシュカバレッジ比率 ❌ いいえ ✅ 現在キャッシュにある既知のURLの割合を示すライブゲージ
Cloudflare APO同期 ❌ いいえ ✅ すべてのパージをCloudflareエッジキャッシュに自動的にミラーリング
Redisオブジェクトキャッシュ双方向同期 ⚠️ せいぜい一方向のみ ✅ 双方向 — NPPパージでRedisがフラッシュされ、RedisフラッシュでNPPパージがトリガーされる
REST API ❌ いいえ ✅ APIキー認証によるパージとプリロードのための完全なREST API
URL正規化(パーセントエンコーディング) ❌ いいえ ✅ safexec + libnpp_norm.soまたはmitmproxy経由 — キャッシュミスを防止非ASCII URL
プラグイン/テーマ更新時の自動削除 ⚠️ 有効にするにはカスタムフィルターが必要です ✅ 組み込みのトグル、デフォルトで有効
完了メール通知 ❌ いいえ ✅ プリロード完了後にメールサマリーを送信します

ダッシュボードウィジェットのキャッシュカバレッジ比率とは何ですか?

キャッシュカバレッジ率
NPPダッシュボードウィジェットの円形ゲージは、サイトの既知のURLのうち、現在Nginxキャッシュに存在するURLの割合を示します。これは、「前回のプリロードでNPPがクロールしたすべてのページのうち、現在キャッシュされているページはいくつあるか?」という疑問に答えるものです。

計算方法
「合計」は、保存されたプリロードスナップショットから取得した、前回完了した「すべてプリロード」実行中に検出されたURLの数です。「ヒット」は、現在Nginxキャッシュディレクトリに存在するキャッシュファイルの数です。カバレッジ = ヒット ÷ 合計 × 100。この比率は100%を上限としています。キャッシュにはスナップショットに含まれていないページ(手動でアクセスしたページ、ページ分割されたアーカイブなど)が含まれる可能性がありますが、ゲージの値は100を超えることはありません。

「N/A」と表示される理由
「すべてプリロード」が少なくとも1回実行され、正常に完了するまで、ゲージには「N/A」と表示されます。スナップショットは、完全なプリロードが完了したときにのみ書き込まれます。中断されたプリロードや部分的なプリロードではスナップショットは作成されません。スナップショットが作成されたら、ゲージの更新ボタンをクリックすると、キャッシュディレクトリのライブスキャンが実行され、比率が即座に更新されます。

使用タイミング
「すべてパージ」を実行した後、「すべてプリロード」を実行してキャッシュが完全に再構築されたことを確認するために、このゲージを確認してください。プリロード後に比率が100%を大きく下回る場合は、拒否正規表現によってページが除外された、プリロードが中断された、またはキャッシュエントリの有効期限が切れている可能性があります。

機能の依存関係マップ ― どの機能がどの機能といつ連携するのか?

NPPを他のキャッシュプラグインと併用するにはどうすればよいですか?

NPPを他のWordPressキャッシュプラグインと併用する場合、競合や重複を避けるため、他のプラグインのページキャッシュ機能を無効にすることが重要です。これらのプラグインはフロントエンド最適化には引き続き使用できます。手順は以下のとおりです。

競合を防ぐため、他のキャッシュプラグインを正しく設定してください。
ページキャッシュ機能を無効にする際は、以下の手順に従ってください。
使用しているキャッシュプラグイン(例:WP Rocket、W3 Total Cache、LiteSpeed Cache)のページキャッシュオプションをオフにしてください。

その他のフロントエンド最適化機能は有効にしてください。
CSS/JS最適化:スタイルシートとスクリプトを圧縮・結合します。

遅延読み込み:画像や動画を必要な時だけ読み込むことで、ページの読み込み速度を向上させます。

データベースクリーンアップ:WordPressデータベースを最適化し、肥大化を抑制します。

CDN連携:コンテンツ配信ネットワーク(CDN)から静的ファイルをシームレスに配信します。


サーバー側のページキャッシュにはNPPを使用し、その他のプラグインはフロントエンドの最適化のみに使用することで、冗長なキャッシュ層や競合のない、効率的で高性能なシステムを実現できます。

/product/ のようにパーセントエンコードされた文字を含む URL でキャッシュミスが発生するのはなぜですか?

背景:一部のURLには非ASCII文字(中国語、キリル文字、アラビア文字など)が含まれており、ブラウザやwgetなどのツールはこれらの文字を自動的にパーセントエンコードされたASCII形式に変換します。例:

/product/水滴轮锻碳单摇/ → /product/%e6%b0%b4%e6%bb%b4%e8%bd%ae%e9%94%bb%e7%a2%b3%e5%8d%95%e6%91%87/
しかし、パーセントエンコードされた文字は、リクエストの生成方法によって大文字または小文字で表示される可能性があります。

Nginxのキャッシュは大文字と小文字を区別します。つまり、NPPのプリロードリクエストで大文字エンコードされたファイルが保存され、実際の訪問者が小文字でページにアクセスした場合、Nginxはこれらを異なるものとして認識し、キャッシュミスを返します。


例えば、NPPプラグインが以下のURLをプリロードした場合:

https://example.com/product/%E6%B0%B4%E6%BB%B4%E8%BD%AE%E9%94%BB%E7%A2%B3%E5%8D%95%E6%91%87/
…しかし、ユーザーが以下のようにアクセスした場合:

https://example.com/product/%e6%b0%b4%e6%bb%b4%e8%bd%ae%e9%94%bb%e7%a2%b3%e5%8d%95%e6%91%87/
Nginxは一致するキャッシュファイルを見つけることができません。これは、エンコーディングの不一致によって引き起こされる典型的なキャッシュの不一致です。


✅ 解決策 1 (推奨): safexec でエンコーディングを正規化する
✅ 解決策 2: mitmproxy でエンコーディングを正規化する
mitmproxy は、NPP プリロード (wget) と Nginx の間に「中間者」プロキシとして機能します。パーセントエンコードされた文字をリアルタイムで一貫した大文字小文字に書き換えることで、プリロードとブラウザのリクエストが同じ形式を使用するようにします。

パーセントエンコードの不一致 (大文字と小文字) によって発生するキャッシュミスを修正するには、以下の手順に従ってください。

WordPress 管理画面 → 設定 → Nginx キャッシュパージ プリロード → プリロードオプション

プロキシを使用する:
これを有効にすると、すべてのプリロードリクエスト (wget から) が mitmproxy を経由するようになります。

プロキシホスト:
127.0.0.1|localhost – mitmproxy が WordPress と同じサーバーで実行されている場合。

my-mitmproxy – コンテナ環境で mitmproxy を使用している場合。

プロキシポート:
mitmproxyがリッスンしているポート番号を入力してください。

例:3434
このプラグインを有効にすると、すべてのプリロードリクエスト(wget)が自動的にmitmproxyを経由するようになります。mitmproxyはリクエストパスをリアルタイムで傍受・書き換え、パーセントエンコードされた文字がNginxに到達する前に一貫した形式になるようにします。これにより、エンコードの大文字小文字の違いによるキャッシュの不一致が解消されます。

[wget] → [mitmproxy] → [Nginx]
🧠 ヘルパースクリプトはありますか?

お使いのシステムでNPPプラグインがキャッシュキーを生成する方法に応じて、適切なスクリプトを選択してください。

1. percent_encode_lowercase.py – NPPプラグインのプリロードリクエスト内のパーセントエンコードされた文字を強制的に小文字に書き換えて一貫性を保ちます。

from mitmproxy import http, ctx
import re

percent_encoded_re = re.compile(r’%[0-9A-Fa-f]{2}’)

def request(flow: http.HTTPFlow) -> None:

path = flow.request.path

new_path = percent_encoded_re.sub(lambda m: m.group(0).lower(), path)

if new_path != path:

flow.request.path = new_path

ctx.log.info(f”Rewriting path: {path} → {new_path}”)
2. percent_encode_uppercase.py – NPPプラグインのプリロードリクエスト内のパーセントエンコードされた文字を強制的に小文字に書き換えます。 NPPプラグインは一貫性を保つため、リクエストを大文字にプリロードします。

from mitmproxy import http, ctx
import re

percent_encoded_re = re.compile(r’%[0-9a-f]{2}’)

def request(flow: http.HTTPFlow) -> None:

path = flow.request.path

new_path = percent_encoded_re.sub(lambda m: m.group(0).upper(), path)

if new_path != path:

flow.request.path = new_path

ctx.log.info(f”Rewriting path: {path} → {new_path}”)
🔧 mitmproxyのsystemdサービスの例:
同じホスト: –listen-host 127.0.0.1 を使用
コンテナ: –listen-host 0.0.0.0 を使用
Allow-Hosts: 設定yourdomain.com
[ユニット]
説明=Mitmproxy – パーセントエンコーディングの正規化
適用後=network.target

[サービス]
タイプ=シンプル
実行開始=/usr/bin/mitmdump \
–mode regular \
–listen-host 127.0.0.1 \
–listen-port 3434 \
–set block_global=false \
–allow-hosts yourdomain.com \
-s /etc/mitmproxy/percent_encode_lowercase.py
再起動=always
再起動間隔=3秒
標準出力=append:/var/log/mitmproxy.log
標準エラー=append:/var/log/mitmproxy.log
[インストール]
対象ユーザー=multi-user.target

なぜ「-GLOBAL ERROR SERVER: このプラグインはお使いの環境では機能しません。Nginx Webサーバーが必要です。-」というエラーが表示されるのですか?

このメッセージは、プラグインが環境内で実行中のNginxサーバーまたは有効なnginx.confファイルを検出できない場合に表示されます。これは、リバースプロキシ環境(例:Nginxの前にApacheを配置)、コンテナ環境、またはjailシステム(cPanel、aaPanelなど)でよく発生します。

🔧 このような非標準環境でプラグインを強制的に有効化するには、wp-config.phpに以下の定数を定義してください。

define(‘NPPP_ASSUME_NGINX’, true);

このオーバーライドにより、Nginxの自動検出が失敗した場合でも、プラグインのすべての機能が有効になります。

✅ 推奨ソリューション:最高の精度を得るには、実際のnginx.confファイルをWordPress環境(jail/chroot/コンテナ)にバインドマウントまたは同期してください。

/etc/nginx/nginx.conf
これにより、プラグインは稼働中のNginx設定を自動的に解析し、キャッシュパス、ユーザーディレクティブ、キャッシュキー設定を正確に検出できます。

ステータスタブの「プラグインキャッシュをクリア」は、いつ使用すればよいですか?

プラグインキャッシュのクリア
NPPは、ページ読み込みごとに実行される処理を回避するため、サーバー側の負荷の高いステータスチェック(Nginxの検出、設定の解析、権限チェック、キャッシュパスの検証など)をキャッシュします。このキャッシュはWordPressの一時データとして保存され、通常は自動的に更新されます。

クリアするタイミング
NPPに即座に反映させる必要があるサーバー側の変更を行った場合は、プラグインキャッシュをクリアしてください。

nginx.confまたはNPPの設定でNginxキャッシュパスを変更した場合。

ngx_cache_purgeモジュールをインストール、削除、または再設定した場合。

fastcgi_ops_root.sh / bindfsセットアップスクリプトを初めて実行した場合、または変更後に再実行した場合。

PHP-FPMのユーザー権限またはキャッシュディレクトリの所有権を変更した場合。

サーバー設定の変更後にステータスタブに古い値または予期しない値が表示される場合。

テスト中で、すべてのチェックで正確なリアルタイムステータスが必要な場合。

アクセス方法
ステータスタブを開き、ページ上部の「プラグインキャッシュのクリア」ボタンをクリックしてください。キャッシュをクリアするとページが自動的に再読み込みされるため、すぐに最新の値が表示されます。

クリアしても安全ですか?

はい。プラグインのキャッシュをクリアしても、Nginxのキャッシュ、WordPressのコンテンツ、プラグインの設定には影響しません。NPPの内部ステータススナップショットのみが破棄され、次回ステータスタブを開いた際に自動的に再構築されます。

「ステータス」タブの「URLインデックスのクリア」は、どのような場合に使用すべきですか?

URLインデックスのクリア
NPPは、キャッシュされたページURLを正確なファイルシステムパスにマッピングする、永続的なURL→ファイルパスインデックスを保持しています。このインデックスのおかげで、単一ページのキャッシュ削除時にディレクトリ全体の再帰スキャンをスキップできるため、キャッシュサイズに関わらずほぼ瞬時に処理が完了します。

インデックスの構築方法
インデックスは、「すべてプリロード」、「スケジュール済みプリロード」、および「詳細設定」タブへのアクセス時に自動的に作成されます。インデックスは段階的に拡張され、単一ページのキャッシュ削除が成功するたびに、書き込みバックによってパスが追加されるため、フルスキャンなしでインデックスは時間とともに改善されます。

クリアのタイミング
インデックスに信頼できなくなった古いエントリや誤ったエントリが含まれている場合にのみ、クリアが必要です。

Nginxキャッシュディレクトリを別のパスに移動した場合:保存されているすべてのパスが誤っています。

fastcgi_cache_keyディレクティブを変更した場合:保存されているURLとパスのマッピングは、新しいキースキームでは無効になります。

キャッシュディレクトリを手動で削除して再作成した場合:古いパスはディスク上に存在しません。

単一ページパージでエラーが頻繁に発生したり、正しいファイルが削除されなかったりするケースが発生しています。

クリアすべきでない場合
インデックスを定期的にクリアしないでください。これは定期的なフラッシュが必要なキャッシュではありません。クリアすると、インデックスが再構築されるまで、次のパージ操作は再帰的なファイルシステムスキャンにフォールバックする必要があります。大規模なキャッシュの場合、インデックスが再構築されるまで、すべての単一ページパージに遅延が発生します。

クリア後の動作
インデックスはデータベースから削除されます。次回、[すべてプリロード]、[スケジュール済みプリロード]、または[詳細設定]タブを開くと、新しいディレクトリスキャンから自動的にインデックスが再構築されます。その間、単一ページパージは安全なフォールバックとして再帰スキャンにフォールバックします。何も問題は発生せず、パージは正常に実行されます。

場所
[ステータス]タブ→[URLインデックスのクリア]ボタン。

PHP-FPMとNginxの適切な設定方法を教えてください。

PHP-FPM Nginxの適切な設定
PHP-FPM Nginxを適切に設定するには、以下の手順に従ってください。

PHP-FPM-USER(Webサイトユーザー)
PHP-FPM-USERは、Webサイトを実行するために特別に作成する必要があります。

WEBSERVER-USER(Webサーバーユーザー)
Nginxは、RHEL系システムではnginx、Debian系システムではwww-dataなど、独自の非特権ユーザーで実行する必要があります。

PHP-FPM-USERとWEBSERVER-USERの接続
WebサーバーユーザーがPHP-FPM-GROUPに属するファイルを読み取れることを確認してください。ファイルのアクセスは、グループのchmodパーミッションビットで制御します。セキュリティリスクを最小限に抑えるため、nginx/www-dataユーザーに追加のグループパーミッションを付与しないようにしてください。

Webサイトコンテンツのパーミッション設定
Webサイトコンテンツのグループパーミッションをg=rXに設定し、nginx/www-dataがすべてのファイルを読み取り、すべてのディレクトリを走査できるようにしますが、書き込みはできません。


重要:
nginx/www-data ユーザーに追加のグループ権限を付与すると、最小権限の原則に基づき、セキュリティリスクが発生する可能性があります。PHP-FPM-USER は、sudoer リストに記載されていなくても、sudo 権限を持つべきではありません。セキュリティ上の問題が生じる可能性があるためです。そのため、ウェブサイトコンテンツのグループ権限を g=rX に設定し、nginx/www-data がすべてのファイルを読み取り、すべてのディレクトリを走査できるようにしますが、書き込みはできないようにします。

usermod -a -G PHP-FPM-GROUP WEBSERVER-USER
WEBSERVER-USER (nginx/www-data など) を PHP-FPM-GROUP に追加し、ウェブサーバーユーザーがこのグループに属するファイルにアクセスできるようにします。

`chown -R PHP-FPM-USER:PHP-FPM-GROUP /home/websiteuser/websitefiles`
`/home/websiteuser/websitefiles` ディレクトリ以下のすべてのファイルの所有者を PHP-FPM-USER と PHP-FPM-GROUP に設定し、PHP-FPM がこれらのファイルを読み書きできるようにします。

`chmod -R u=rwX,g=rX,o= /home/websiteuser/websitefiles`
`/home/websiteuser/websitefiles` ディレクトリ以下のファイルのパーミッションを設定し、PHP-FPM-USER が読み書き可能、PHP-FPM-GROUP (Webサーバーユーザーを含む) が読み取り可能、その他のユーザーはアクセス不可とします。

PHP-FPM プール設定
設定ファイルで PHP-FPM プール設定を調整し、PHP-FPM プロセスのユーザー、グループ、所有者、およびパーミッションを指定します。

[websiteuser.com]
ユーザー = websiteuser
グループ = websiteuser
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
listen = /var/run/php-fcgi-websiteuser.sock

Nginx Cache Purge Preload Plugin HELP

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連コンテンツ

最近の投稿

Nginx Cache Purge Preload Plugin HELP