...

NGINX FastCGI キャッシュ:WordPress の動作を高速化する

私は、 NGINX キャッシュ サーバーレベルでこれを利用し、HTMLレスポンスを直接返す。これによりTTFBが大幅に短縮され、PHP-FPMの負荷が軽減され、データベースの処理量も減少する クエリ.

中心点

  • サーバー側 プラグインの代わりに:FastCGIキャッシュはPHPの負荷を軽減し、レイテンシを低減します。.
  • パージ 変更があった場合:コンテンツは常に最新の状態に保たれ、必要に応じて更新されます。.
  • 除外事項 ログイン、ショッピングカート、チェックアウトでは、動的な領域を動的に保持します。.
  • スケーリング 負荷がかかっているとき:キャッシュがより頻繁にヒットし、サーバーの負荷を軽減します。.
  • 測定可能 高速化:TTFB、RPS、CPUの値が大幅に改善される。.

NGINXのFastCGIキャッシュがWordPressの動作を高速化する方法

最初のアクセス時にWordPressがページをレンダリングし、その後、NGINXが完成したレスポンスを エッチエムティーエル から取得し、以降の同一のリクエストはPHP-FPMを使用せずに処理します。これにより、CPU時間とコンテキスト切り替えを削減しつつ、ファイルシステムやOSキャッシュによる高速な ヒット数 を提供します。特にトラフィックのピーク時でも、PHPプロセスを起動する必要がないため、応答時間は低水準に保たれます。これによりTTFBを最小限に抑え、1秒あたりのリクエスト数を増やすことが可能になります。その結果、よりスムーズな操作感、タイムアウトの減少、そして真に動的なプロセスに向けた明確なパフォーマンスの余裕が実現されます。.

サーバーサイドキャッシュとプラグインキャッシュの比較(比較表付き)

キャッシュプラグインは PHPスタック また、ヒットした場合でも頻繁にプロセスを起動してしまうのに対し、FastCGI CacheはWebサーバーレベルで直接応答します。これにより、PHPの初期化やプラグインのフックといった多くのオーバーヘッドが省略されます。 リピーターに対しては、主にサーバーサイドのアプローチを採用し、必要に応じて軽量なフロントエンド最適化プラグインと組み合わせています。詳細を徹底的に確認したい場合は、軽量な テスト段階 そして、TTFB、CPU、キャッシュヒット率を個別に測定します。その違いは、特に負荷がかかっている状況下で、すぐに明らかになります。.

基準 プラグインキャッシュ (PHP) NGINX FastCGI キャッシュ
回答方法 PHPが初期化され、プラグインがキャッシュを確認する Webサーバーがファイルを直接配信する
TTFB PHPの起動により高くなる キャッシュヒット時には非常に低い
リソース リクエストごとのCPU/RAMの割り当て量を増やす はるかに少ない資源
スケーリング PHPプロセスによって制限される NGINX による効率的なスケーリング
依存関係 テーマやプラグイン間の競合が発生する可能性があります WordPressのバックエンドで動作します

さらに、ホスト、スキーマ、URIごとにコンテンツが分離されるよう、明確なキャッシュキーと整理されたフォルダ構造を採用しています。入門をお探しの方は、私のガイドをご覧ください。 NGINXのキャッシュ最適化 指針として活用する。そうすることで、設定が整理され、将来の拡張もスムーズに行えるようになる。.

適切なシナリオと重要な例外

最も恩恵を受けるのは 内容, 、つまり、ブログ、雑誌、ランディングページ、そして匿名でのアクセスが多い企業サイトなどです。私は、訪問者にとって表示内容が同じままのページはすべてキャッシュし、パーソナライズされた要素はすべて除外しています。 これには、ログイン、プロフィール、コメントフォーム、WooCommerceのショッピングカート、チェックアウト、マイアカウントなどが含まれます。クッキーとヘッダーを基準として、キャッシュを意図的にバイパスしています。これにより、公開ページは極めて高速なまま維持され、一方で機密性の高いエリアは適切に動的な状態を保ち、ユーザーはスムーズに サーブ になる。

技術的な基礎:キャッシュゾーン、キー、ヘッダー

まず、 キャッシュパス および、サイズやアイドル時間を含むNGINX設定内のゾーン。 キャッシュキーには、スキーマ、ホスト、URI、およびオプションでクエリ文字列を含め、バリエーションが別々に保存されるようにしています。fastcgi_cache_valid、bypass、no-cacheルールを使用して、リクエストがキャッシュをバイパスするタイミングを制御しています。 Set-Cookie、Authorization、およびWordPressやWooCommerceの特定のクッキーといった重要なヘッダーは、動的なコンテンツであることを示します。さらに、負荷がかかった際にもページが正常に表示され続けるよう、どのエラーページや50xレスポンスを一時的にキャッシュするかを指定しています。 回答.

キャッシュ管理とパージ戦略

キャッシュは、更新が確実に ロールアウト. 記事を保存する際、トップページ、カテゴリ、フィードを含む対象のURLに対して、的を絞ったキャッシュの削除(パージ)を実行します。さらに、コンテンツが定期的に再生成されるよう、適切なTTLを設定します。大規模なサイトでは、重要なランディングページに対してプリロードを行うことで、最初の訪問者がキャッシュが空の状態での表示(コールドスタート)を経験しないようにしています。 変更のたびにキャッシュヒット率を確認し、パージによって古いフラグメントが残っていないかを確認しています。 残す.

WordPressおよびWooCommerceのルール

ログイン済みのユーザーには、一貫してキャッシュを有効にします 終わった, 、通常は `wordpress_logged_in` クッキーに基づいて行います。WooCommerce については、URI パターンに基づいて「カート」「チェックアウト」「マイアカウント」を除外し、`woocommerce_items_in_cart` などのクッキーに注意を払っています。一方、商品ページ、カテゴリページ、コンテンツページについては、通常通りキャッシュしています。 さらに、フックによって在庫数や価格が変更された場合は、キャッシュを削除します。この区別により、購入プロセスを含まずに、公開ページを高速に維持できます。 邪魔する.

TTL、ステール、ロッキングの適切な選択

私はコンテンツのTTLを実務に合わせて、数分から数時間程度に設定しています。これは、 実際 およびトラフィック。Staleオプションを使用すると、バックグラウンドで新しいバージョンが生成されている間、期限切れのオブジェクトを一時的に配信することができます。ロッキング機能は、多数のリクエストが同時に期限切れのオブジェクトにアクセスした際の「スタンピード効果」を防ぎます。 適切なエラーおよびタイムアウトのルールにより、たとえ短時間の障害が発生した場合でも、訪問者が確実に応答を受け取れるようになります。ポリシーに関する詳細については、私の簡潔な キャッシュ制御戦略, 、FastCGI Cacheと相性が良いもの。.

重要なモニタリングと測定値

まず、私は TTFB, 、続いて1秒あたりのリクエスト数とCPU使用率を確認し、キャッシュヒットとキャッシュミスを分けて分析します。NGINXのログとレスポンスヘッダーからは、HIT、MISS、BYPASS、EXPIREDのいずれであるかが分かります。 ヒット率が上昇し、CPU使用率が低下していることは、ルールが効果を発揮しているという合図です。さらに、ファイルシステムのI/OやアクティブなPHPプロセスの数も監視しています。条件付きキャッシュには、ETag/Last-Modifiedを適切に活用しており、その詳細については私のガイドを参照してください。 ETag を使用した条件付きキャッシュ, 、ブラウザとサーバーのキャッシュが連携し、ネットワーク負荷が顕著に .

よくある間違いとその解決策

よくある落とし穴は、範囲が広すぎることです。 キャッシュキー, 、これによりバリエーションが上書きされ、誤ったコンテンツが配信されてしまう。同様に深刻な問題として、wordpress_logged_in や WooCommerce のシグナルといった Cookie に対する除外設定が欠けている点が挙げられる。パージの対象が単一ページのみの場合、アーカイブページやトップページは古い状態のままとなるため、私は対象となる URL を拡大している。 また、クエリ文字列をキーに含める必要も頻繁にあります。そうしないと、あるバリエーションが別のバリエーションを上書きしてしまいます。TTLが短すぎると不必要なMISS率が上昇し、長すぎると内容が古くなるリスクが高まります。 ページ数.

実装のための実務ワークフロー

私はどのプロジェクトも、明確な プラン: 目標を定義し、キャッシュ対象のパスを指定し、動的な例外を設定します。その後、キャッシュパス、ゾーン、キー、およびヘッダールールを設定します。次のステップでは、HIT/MISSをテストし、クッキーを確認し、軽度の負荷テスト下でTTFBを監視します。 その後、グラフが適切な状態になるまで、TTL、ステール、ロッキングを最適化します。最後に、パージ経路、担当範囲、および編集者向けの簡単な手順を文書化し、コンテンツが常に 新鮮な は残る。

実践的なNGINXの設定とサンプル

私はこの設定を クリア 構造化されている:中央のキャッシュゾーン、一意のキー、明確なスキップルール、そして役立つ診断ヘッダー。堅実な出発点は、次のようなものです:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m \
    inactive=60m use_temp_path=off loader_files=200 loader_sleep=50ms loader_threshold=300ms;

map $request_method $skip_non_get {
    default 1;
    GET 0;
    HEAD 0;
}

map $http_cookie $skip_cookie {
    default 0;
    ~*(wordpress_logged_in|comment_author|woocommerce_items_in_cart|wp_woocommerce_session|woocommerce_cart_hash) 1;
}

map $arg_preview $is_preview { default 0; 1 1; }
map $request_uri $is_search { default 0; ~*\?s= 1; }

server {
    # ...
    set $skip_cache 0;
    if ($skip_non_get) { set $skip_cache 1; }
    if ($skip_cookie)  { set $skip_cache 1; }
    if ($is_preview)   { set $skip_cache 1; }
    if ($is_search)    { set $skip_cache 1; }

    location ~ \.php$ {
 include fastcgi_params;
 fastcgi_pass unix:/run/php/php8.2-fpm.sock;

        fastcgi_cache WORDPRESS;
 fastcgi_cache_key "$scheme$request_method$host$request_uri";
 fastcgi_cache_bypass    $skip_cache;
        fastcgi_no_cache $skip_cache;

 fastcgi_cache_valid 200 301 302 10m;
        fastcgi_cache_valid 404 1m;
 fastcgi_cache_use_stale updating error timeout http_500 http_502 http_503;
 fastcgi_cache_lock on;
 fastcgi_cache_lock_timeout 5s;

        add_header X-Cache $upstream_cache_status always;
 add_header X-Cache-Key   $scheme$host$request_uri always;
    }
}

後でプロジェクトに応じて、Varyシグナル(例:言語、通貨)やより詳細な除外条件を追加する予定です。重要:POST、PUT、DELETE、および 認証 或いは Set-Cookie 私は一貫してPHPをスキップしています。.

バリエーション戦略とクッキー戦略の詳細

HTMLドキュメントのバリエーションが少ないほど、ヒット率は高くなります。私は意図的にバリエーションを減らし、以下の箇所でのみ分割を行っています。 号ごとに異なる:

  • 言語: レスポンシブなHTMLバージョンが1つあるのが理想的です。言語ごとに別々のバージョンがある場合は、キーにはUser-Agentではなく、言語クッキーまたはURI(例:/de/、/en/)を使用します。.
  • デバイス: UAスプリットは避けています。モバイルファーストのCSSとレスポンシブレイアウトにより、キャッシュが維持されます コンパクト.
  • 通貨/国: ジオロケーション機能や通貨切り替え機能を備えたショップの場合、IPアドレスではなく、安定したCookieに基づいて意図的に設定を変更しています。そうしないと、カーディナリティが爆発的に増えてしまうからです。.
  • クエリー文字列: 不要なバリエーションが発生しないように、有用なパラメータ(例:pagination、filter)をホワイトリストに登録し、トラッキングパラメータ(utm_*、gclid)は無視しています。.

特に、同意/バナープラグインのクッキーについては注意が必要です。もしそれらがトップページですでにクッキーを設定している場合、NGINXが誤って動的コンテンツと認識してしまう可能性があります。私は、純粋に 視覚的な 機能的な影響のないバナーは、キャッシュバイパスカスケードをトリガーしません。.

ファイルシステム、キャッシュゾーン、およびローダーのチューニング

キャッシュメモリの選択はパフォーマンスに多大な影響を与えます。私は高速なローカルSSDを使用しており、 keys_zone メタデータが上書きされないよう、十分な容量(例:インデックス用に100~256 MB)を確保してください。この 非アクティブ- 時間はトラフィックプロファイルに基づいて決定します。ロングテールコンテンツが多い場合は、非アクティブ時間を長くした方が効果的ですが、動的なポータルサイトの場合はそうではありません。loader_*パラメータを使って、NGINXがオブジェクトをプリロードする積極度を調整し、負荷がかかった状態でもシステムが 静か のままです。アクセスが非常に多いサイトの場合、tmpfs への部分キャッシュが有効な場合もありますが、その際は RAM の負荷と inode の使用状況を綿密に確認します。 ログローテーションとファイル数の上限設定により、ボリュームが満杯になるのを防ぎます。モニタリングでは、I/O待機時間、空き容量、およびオープンファイル記述子に注意を払います。.

CDNとブラウザキャッシュを適切に階層化する

私はNGINXキャッシュを、あるものと組み合わせて使うのが好きです。 Edge-CDN そして、適切なブラウザのTTL値。その仕組みは次の通りです。オリジン(NGINX)は一貫性のあるHTMLページを配信し、CDNがさらにそれらをキャッシュします。ブラウザには適度に短いmax-age値が設定されるため、編集担当者は変更を素早く確認できます。ステイル処理メカニズムと 再検証する‑戦略は、NGINXがバックグラウンドで再レンダリングを行っている間も、エッジノードが配信を継続できるように設定しています。パージは、定義された順序(まずCDN、次にオリジン)で実行するか、あるいは両方で同期して実行することで、古いコンテンツが残るのを防いでいます。 また、Age、Cache-Status、vary などの CDN ヘッダーが、サーバー側のルールと競合しないか確認しています。.

プレウォーミング、デプロイメント、および編集ワークフロー

フラッシュ後に何千人ものユーザーがコールドスタートを引き起こさないように、重要なページをウォームアップしています ターゲット 対象:トップページ、ベストセラー、カテゴリ、マガジン・ハブページ。軽量なプリローダーがサイトマップを読み込み、並列処理でリクエストを送信するとともに、レート制限を遵守することで、PHPやデータベースが限界に達しないようにします。 デプロイに関しては、フルフラッシュ(テーマ/コードの変更)と部分フラッシュ(コンテンツの更新)を区別し、その内容を文書化しています。 ステップ 編集チームと運営チーム向け。これにより、リリース期間を短く抑え、リスクを最小限に抑えることができます。.

マルチサイト、多言語対応、通貨ロジック

WordPressマルチサイトでは、キャッシュキーをホスト名またはサイトIDで厳密に分離しています。これにより、 サブサイト 適切に分離されていること。WPML/Polylang を使用した多言語サイトでは、言語パス(de/en)または専用ドメインを優先して利用しています。その場合、キーにはスキーマ、ホスト、パスが含まれます。 オンラインショップでは、通貨クッキーとジオロケーションを厳密に考慮しています。商品ページやカテゴリページは通貨ごとにキャッシュし、カートやチェックアウト画面は動的なままにしています。価格や税率が変更された場合は、 部分的に (製品、カテゴリ、ティーザーモジュール)を整理し、主要なランディングページが迅速かつ一貫性のある状態になるようにする。.

負荷テスト、メトリクス、ロールバック

本番稼働の前に、現実的な状況をシミュレーションします ピーク (GET/HEADの混合、アセット、HTML) について、測定項目を厳密に分類します:ウォーム vs. コールド、CDN使用時/非使用時、ログインユーザー vs. 匿名ユーザー。 P50/P95 TTFB、エラー率、CPU使用率、I/O待機時間、PHPプロセス数を確認しています。 NGINXでは、$upstream_cache_statusを含む適切なlog_formatを有効にし、レスポンスヘッダー(HIT/MISS/BYPASS/EXPIRED)から直接サンプルをチェックします。 簡単なロールバック手順(キャッシュ動作のスキップ切り替え、TTLの短縮、個々のルールの無効化)を用意しておくことで、異常が検出された場合に すぐに システム全体を不安定にすることなく対応することができる。.

セキュリティ、正確性、および個人情報保護

私は、管理画面、プレビューモード、非公開ページ、ノンセで保護された操作など、機密性の高いコンテンツがキャッシュに保存されないよう徹底して防止しています。HEADとGETの区別は遵守しており、POSTはキャッシュ不可のままにしています。Set-CookieおよびAuthorizationはハードキャッシュの対象となります。 バイパス-シグナル。誤ったヒットが生じないよう、プレビューページ(preview=true)と検索結果(s=)は除外しています。 また、HTMLレスポンスに個人データが含まれていないか確認し、それがキャッシュに広く保存されるのを防いでいます。必要に応じて、パーソナライズされた部分については、意図的に ない cache.

エッジケースと例外を適切に処理する

いくつかのパターンが繰り返し見受けられます。XMLサイトマップやフィードエンドポイントについては、短時間(例:1~5分)キャッシュします。301/302リダイレクトについては、リダイレクトループを防ぐために個別に再検証を行います。 アーカイブページやページネーションページには、適度なTTLを設定しています。これらはしばしば フレッシュ コンテンツを保持する。ソートにのみ影響するパラメータはキーに含めることができるが、TTLを人為的に短縮してはならない。また、プラグインが予期せずCookieを設定した場合は、それが本当にHTML出力のために必要なものかどうかを確認する。 関連性がある である場合――そうでない場合は、不要なBYPASSのヒットを避けるために、それらを「無視可能」としてマークします。.

簡単にまとめると

NGINX FastCGI Cache を使って、WordPress の処理を高速化しています。 ソース, HTMLを直接出力することで、コストのかかるPHPプロセスを削減します。適切な除外設定と信頼性の高いパージ機能により、コンテンツを常に最新の状態に保ちつつ、TTFBやCPU使用率を大幅に低減します。StaleおよびLocking機能を備えた実用的なTTL設定により、トラフィックのピーク時でもスムーズな配信を実現します。 測定値を着実に監視し、ルールを継続的に最適化することで、持続的に高速なページを実現できます。これにより、ウェブサイトの応答性が向上し、メンテナンスしやすさを維持しつつ、トラフィックの増加に合わせてスムーズに成長していきます。 トラフィック 中へ。.

現在の記事