サーバーサイドのキャッシュは Nginx 或いは アパッチ 明確なキャッシュルールを設定し、レスポンスタイムへの影響を監視します。こうすることで、サーバーの負荷を顕著に軽減し、1秒あたりのリクエスト数を増やし、高負荷時でも動的なウェブサイトを確実に高速に保つことができる。
中心点
セッティングの前に、私は目的を明確に整理する。 キャッシュどのくらいの期間、どのレベルで。動的なページでは、私は次のような例外を計画している。 セッション そしてパーソナライズされたデータ。私は適切なアーキテクチャを選択し、リバースプロキシが理にかなっているかどうかをチェックします。そして、コンフィギュレーションをクリーンな バーチャルホスト そして計画的にヘッダーをチェックする。最後に、各変更の効果を確実に評価できるように、モニタリングのアンカーをつける。
- 建築 明らかにする
- キャッシュ・タイプ 定義
- ヘッダー 牡牛
- 無効化 プラン
- モニタリング 確立
基礎知識:サーバーサイド・キャッシングとは?
サーバーサイド・キャッシングは リクエスト これにより、頻繁にリクエストされるコンテンツを再計算することなく配信できるようになった。アプリケーション、データベース、ファイルシステムの作業が減るので、最初のバイトまでの時間が明らかに短縮されます。私は、プロキシレベルのキャッシュ、FastCGIキャッシュ、静的ファイル用のファイルキャッシュを区別している。 資産.どのコンテンツを公開とみなし、どれをパーソナライズしたままにするかについて、厳密な計画を立てることが重要だ。それぞれのルールについて、私はキャッシュを空にするための有効期限(TTL)と明確な条件を定義している。
Nginx と Apache - アーキテクチャとキャッシュの概念
Nginxの動作 イベントドリブン そのため、高い並列性と高速なキャッシュに非常に適している。Apacheはプロセスとスレッドを使用するが、非常に柔軟なモジュール・ランドスケープを提供しており、細かく制御できる。静的なコンテンツでは、NginxはCPU負荷が非常に低いのが印象的だが、動的なアプリケーションではApacheが機能の深さで勝っている。リバース・プロキシを使えば、ほとんどすべてのアプリケーションで応答時間の短縮の恩恵を受けることができる。リバースプロキシとしてのNginxのパフォーマンス面の概要はこちらで紹介している: リバースプロキシとしてのNginx.
次の表は、主な相違点をまとめたもので、適切なものを見つけるのに役立つ。 戦略 を選ぶことができる。これによって、要件、ツール、将来の運用計画をよりよく分類することができます。私はメンテナンス、アプリの複雑さ、典型的な負荷ピークを考慮に入れています。コンテンツがシンプルであればあるほど、攻撃的な可能性が高くなります。 キャッシング.非常に動的なコンテンツには、特定の例外と短いTTLを使う傾向がある。
| 基準 | アパッチ | Nginx |
|---|---|---|
| ソフトウェア・アーキテクチャ | プロセス&スレッドベース | イベント制御(非同期) |
| 静的コンテンツ | グッド | 非常に速い |
| ダイナミック・コンテンツ | 非常に柔軟(モジュール) | PHP-FPM/アップストリームについて |
| キャッシュ機能 | mod_cache, mod_file_cache | FastCGIキャッシュ、プロキシキャッシュ |
| 構成 | 集中管理&.htaccess経由 | nginx.confの中央 |
Nginxを設定する:FastCGI キャッシュのステップバイステップ
まず キャッシュパス と名前付きゾーンを作成し、Nginxが構造化された方法でコンテンツを保存できるようにした。その後、PHPアップストリーム(PHP-FPMなど)を接続し、適切な場所でfastcgi_cacheを有効にする。動的アプリの場合は キャッシュバイパス PHPSESSIDのようなクッキーや、ログインしているユーザのために、パーソナライズされたページが新鮮さを保てるようにします。fastcgi_cache_validを使って、ステータスコードにTTLを割り当て、コンテンツのエイジングを制御しています。X-FastCGI-Cacheヘッダを使うことで、リクエストがHIT、MISS、BYPASSのどれであったかを見ることができ、それに応じてルールを改良することができます。
Apacheの設定:mod_cacheを安全に使用する
Apacheでは、mod_cacheとmod_cache_disk、または共有メモリーバックエンドを有効にしています。 ゴール.vHostの設定では、特にCacheEnableをオンにし、Expires値を定義し、コンテンツを公開したままにする場合はSet-Cookieなどのヘッダーを無視するようにしています。より細かく制御するために、ファイルとパスのスコープを使って、適切な リソース キャッシュに入る。アプリが許可しているところでは、キャッシュ・コントロールを適切に設定し、アプリケーションとサーバーの間に明確な相互作用を生み出している。ディレクトリ・レベルのルールについては、次のようなコンパクトなものが役立っている。 .htaccessガイド.
キャッシュルールとエッジケース:クッキー、セッション、クエリー文字列
パーソナル・ブロック 回答 例えばセッションクッキーを使うなど、一貫してキャッシュから。クエリー文字列については、本当のバリアント(ページネーションなど)とトラッキングパラメーターを区別し、それらは削除するか無視する。APIや検索結果については、誤検出を避けるために短いTTLを割り当てたり、完全にNO-CACHEに設定したりします。 ヒット数 を避ける。ファイルのダウンロードやフォームのPOSTはキャッシュしないが、サムネイルやアセットは積極的にキャッシュする。キャンペーンが殺到するランディングページでは、短いが効果的なTTLを計画し、変更が加えられた場合は素早く無効にする。
モニタリングとデバッグ:キャッシュ・ヒット率の把握
でX-CacheまたはX-FastCGI-Cacheを確認しています。 返信ヘッダー そして、時間の経過とともにヒット率を測定する。ログファイルとステータス・モジュールは、利用率、待ち時間、エラー状況を示してくれる。変更後の短いテスト実行で、ミスがヒットに変わるかどうか、また、機密性の高いレスポンスが キャッシュ の土地。負荷テストはホットパスを明らかにし、特定のルールを改良するのに役立つ。これによって、ボトルネックを早い段階で認識し、実際の負荷ピークの下でも応答性の高い環境を維持することができる。
キャッシュキーの設計と変化戦略
きれいなキャッシュキーは、異なるバリアントがきれいに分離されているか、不注意に混在しているかを決定します。私は意識的にキーを定義し、スキーマ、ホスト、パス、関連するパラメータを考慮します。トラッキングパラメータは除外し、本当のバリアント (ページネーション、ソート、言語など) を含めます。Nginxレベルでは変数とマップ、Apacheでは特定のルールと 可変-ヘッダー
- ホストとプロトコルの分離: http/httpsとドメインの両方が存在する場合は、キーに明示的に含める。
- クエリ文字列を正規化する: シーケンスを標準化し、無関係なパラメータを破棄し、関連するパラメータをホワイトリストに登録する。
- デバイスと言語のバリエーション: きれいに分離されている場合(サブドメイン、パス、明示的なクッキーなど)のみキャッシュする。そうでない場合は、キーが爆発する危険性がある。
- Varyヘッダを正しく設定する: Accept-Encoding for Gzip/Brotli, optional Accept-Language, never Vary:*
- クッキーは控えめに: 決定に含めるクッキーは、表示に本当に影響を与えるものだけにしましょう(ログイン状態など)。
これにより、キャッシュポイズニングを防ぎ、オブジェクトのバリアントの数を制御下に保つことができる。バリアントが少ないということは、ヒット率が高く、ストレージコストが低いということです。
鮮度、再検証、陳腐化した戦略
コンバイン TTL コンテンツの鮮度と安定性を同時に保つために、再バリデーションを行う。共有キャッシュでは、s-maxageとキャッシュ・コントロールが重要だ。加えて、上流の問題に対して高速なレスポンスを提供し続けるために、ステール戦略を使っている。
- s-maxageとmax-ageの比較: s-maxageは共有キャッシュ(プロキシ、CDN)、max-ageはブラウザをコントロールする。HTMLの場合は、s-maxageを数分、max-ageを短いかゼロに設定することが多い。
- stale-while-revalidate: バックグラウンドで更新が行われている間、ユーザーは古いレスポンスを受け取る。これにより、負荷のピークが大幅に緩和されます。
- stale-if-error: 5xxエラーの場合、私は失敗を隠すためにキャッシュからサービスを続ける。
- use_stale/Background-Update: Nginxではuse_staleとバックグラウンド更新を使い、ApacheではCacheStaleOnErrorなどのオプションを使う。
- ETag/Last-Modified: クライアントがIf-None-Match/If-Modified-Sinceを送信し、サーバーが304を返した場 合、再検証は帯域幅を節約する。
この組み合わせにより、短期間のアップストリーム遅延が発生しても、短いレスポンスタイムと堅牢なサービスを実現することができます。
マイクロキャッシュと負荷ピークの遮断
頻繁にクエリが実行され、同じような結果が得られるような動的なページでは、次のようにします。 マイクロキャッシング を使っています。HTMLの結果を1~10秒間キャッシュすることで、同じようなクエリが1,000件同時にアプリケーションに入力されるのを防いでいます。
- 短いが効果的だ: TTLを3~5秒にすることで、ユーザーが古いコンテンツに気づくことなく、ピーク時の負荷を大幅に減らすことができる。
- 粒状: グローバルではなく、ホットスポット(スタートページ、カテゴリーページ、検索サジェスト)でのみ有効。
- パーソナライゼーションのためのバイパス: セッション、カート、ログインクッキーはマイクロキャッシュの対象外です。
マイクロキャッシングは、バーストトラフィック下でのコスト削減と安定性向上のために有利な手段である。
キャッシュの大混乱を避けるロックと制限
を使って カミナリ・ストーブ 期限切れのオブジェクトに対して多くの同時リクエストが実行される。新しいコピーが作成される間、リクエストをブロックすることでこれを防いでいる。
- Nginx: プロキシとFastCGIキャッシュのcache_lockを有効にし、タイムアウトを適切に選択する。
- アパッチだ: すべてのワーカーが同時にアプリケーションをヒットしないように、CacheLockを使用します。
- 資源を制限する: 同時アップストリーム接続数、ワーカー数、キューの深さを適切に調整する。
さらに、少し長めのs-maxageと再バリデーションは、オブジェクトが同期的にキャッシュから落ちることがほとんどないことを保証するのに役立つ。
決断いつNginxを使うか、いつApacheを使うか、いつVarnishを使うか?
静的コンテンツやPHPアプリケーションでキャッシュルールが明確な場合は、通常、次のようにします。 Nginx をFastCGIキャッシュと一緒に使っている。多くのモジュールや書き換えチェーン、異なるスクリプト言語の混在操作など、複雑なアプリのセットアップには、私はよく アパッチ.追加のエッジキャッシュや拡張ポリシーが必要な場合は、その前にリバースプロキシを置いている。このガイドは、これを設定するための良い出発点を提供してくれる: リバースプロキシの設定.優先順位を正しくつけることが重要である:まず正しいアプリヘッダー、次にサーバーサイドキャッシング、最後にオプションのプロキシレイヤー。
セキュリティとコンプライアンス:キャッシュに何が許されるか?
敏感 データ プロフィール、ショッピングバスケット、注文概要、チケット、患者情報、管理エリアなどです。プロキシやブラウザが機密コンテンツを保存しないように、クリアキャッシュコントロールヘッダを設定しています。クッキーについては、SameSite、HttpOnly、Secureを使用し、一貫してパーソナライズされたパスを分けています。また、設定ミスを素早く認識するために、通常とは異なるアクセスのログも取っています。これにより、機密性を損なうことなく、高いパフォーマンスを維持しています。
ヘッダー政策の実際
私は、すべてのレベルが同じように行動し、矛盾した指示を送らないように、一貫したヘッダーセットを定義する。
- HTML(公開されたが、短命だった): Cache-Control: public, s-maxage a few minutes, max-age rather 0-60s, must-revalidate if necessary; ETag/Last-Modified active.
- 資産(長期性): Cache-Control: public, max-age 1 year, immutable; バージョンのファイル名(フィンガープリント)なので、Purgeなしでデプロイできます。
- パーソナライズされたページ: Cache-Control: no-store, private; Set-Cookieは必要な場合のみ。Authorisationヘッダーを共有しない。
- リダイレクトと404 301は長期間、302/307は短期間だけ、404はエラーが修正されないように短期間キャッシュする。
- 圧縮: Gzip/Brotli を有効にし、Vary: Accept-Encoding を設定して、バリアントが正しく分離されるようにします。
これにより、ブラウザ、プロキシ、サーバーキャッシュのいずれに対しても、透過的な動作を保つことができる。
CDNやブラウザのキャッシュとの相互作用
サーバーサイドの キャッシング 静的アセットを長いTTLで配信するCDNを使う。HTMLについては、サーバー上でより短いTTLを設定し、CDNで差別化ルールを指定している。ブラウザでは、Expires、ETags、Cache-Controlを制御して、リピーターがリロードする必要があまりないようにしている。バージョン管理されたファイル名(アセットフィンガープリント)により、不正確なファイル名を使用することなく、長い実行時間を可能にする。 内容.私はキャッシュパージや新しいアセットバージョンを介して変更をロールアウトする。
キャパシティ・プランニングとストレージ・チューニング
キャッシュがうまく機能するのは、サイズ、メモリレイアウト、スワッピングルールが適切な場合だけだ。私は、TTLごとのユニークなオブジェクトの数とその平均サイズに基づいて必要な容量を見積もり、ピーク用のバッファを計画する。Nginxでは、keys_zone(RAM上のインデックス)、inactive(ヒットしないプロセス)、max_size(ディスク上)を決定する。Apacheでは、キャッシュパスと最大サイズをチェックし、クリーニングのためのツールを使用する。
- 専用メモリ: IO競合を減らすため、キャッシュ用にボリューム/パーティションを分離。
- ファイルシステムのパラメータ: noatimeなどのオプションは、IOのオーバーヘッドを削減する。大きなinode/ブロックは、より効率的に多くの小さなファイルを保持することができる。
- 立ち退き: LRU戦略を受け入れ、ホットオブジェクトが残るようにTTLを選択する。
- 予熱: デプロイ後に重要なパスにPingを送信し、ユーザーがすぐに恩恵を受けられるようにする。
- htcacheclean/Manager: Apacheの場合は定期的にクリーニングを行い、Nginxの場合はキャッシュ・マネージャー・プロセスを妨害しないようにする。
メモリとコンフィギュレーションは、サイトが大きくなるにつれて増えていく。
操作、無効化、メンテナンス
私は明確な計画を立てている。 プロセス デプロイメント、コンテンツ更新、構造変更後のキャッシュ検証のため。自動化されたフックは、キャッシュ全体を削除する代わりに、影響を受けたパスを特別にクリアします。ヘルスチェックとアラームが異常なミス率やエラーコードを報告するので、すぐに対応できます。私は、一貫した結果を保証するために、ルール、責任、典型的な例外を文書化しています。これにより、システムは予測可能で、速く、チームのメンテナンスが容易になります。
無効化方法とパージ・パターン
パージ・オプションはスタックによって異なる。私は完全削除を必要とせず、リスクを最小限に抑える戦略を好む。
- 時間ベースの無効化: HTMLの短いs-maxage/TTLと再バリデーション; アセットはバージョン管理されているため、長いままです。
- キーバージョニング: バージョン・トークン(ビルドIDなど)をキャッシュ・キーに統合する。デプロイ中にバージョンが変わると、古いオブジェクトはパージされずに失効する。
- 標的を絞った粛清: 利用可能な場合は、API/PURGE経由で選択的に削除する。そうでない場合は、キャッシュファイルを選択的に削除し、ウォームアップする。
- アプリレベルでのタグ付け: ページをグループ/タグに割り当て、コンテンツを更新する際にグループを無効にします。
- エッジでのアプローチ禁止: 専用のリバースプロキシが上流に接続されている場合、パターンベースのブロッキングを行う。
私はCI/CDプロセスのステップを自動化し、コンテンツがいつ、なぜ無効化されたかを追跡するためのログを記録している。
テストと品質保証
ルールが稼動する前に、私は機能とセキュリティが正しいことを確認します。ステージング環境で作業し、明確に定義されたテストを実施します。
- ヘッダーチェック Cache-Control、Vary、ETag/Last-Modifiedは各リソースタイプで正しいか?
- ヒット/ミス分析 変更によってヒット率が上がるのか?機密性の高いページが誤ってキャッシュに入ってしまうことはありますか?
- 負荷とエラーのケース: ピーク負荷、アップストリーム・タイムアウト、5xxでの動作 - stale-if-errorは有効か?
- デバイス/言語のバリエーション: バリアントは正しく分離され、正しく返されていますか?
- SEOに関連するパス: 301/302の処理、カノニカル、ページネーション、検索ページが正しくキャッシュされない。
私は、最適化がリグレッションにつながらないことを確認するために、合成チェックと実際のユーザーメトリクスを使用しています。
簡単にまとめると
サーバーサイドの キャッシングレスポンスタイムの短縮、サーバー負荷の軽減、ピーク負荷への対応が容易になります。Nginxは高速なFastCGIとプロキシキャッシュで、Apacheは可変モジュールロジックときめ細かな制御で印象的です。パーソナライズされたコンテンツを保護するTTL、バイパス、パージの正確なルールは非常に重要です。意味のあるモニタリング ヘッダー は、ルールが機能しているか、どこを調整する必要があるかを示してくれる。クリーンなコンフィギュレーション、明確な例外、計画的な無効化により、どのサイトも高速で信頼性が高く、スケーラブルであり続ける。

