昔、nginx の fastcgi_cache は誰からも無視されてきた金鉱であると言って、私は海外サーバーに穴を掘りましたが、今日この穴を埋め、皆さんに良い新年をお祈りします。
変更頻度の低いデータの場合は、データベースの読み取りを減らすために Memcached を保存することを誰もが好みますが、それでも言語の解析と実行 (PHP、Python の実行など) が消費されます。もちろん、この時間は非常に短いです。 「クラスメートは P で始まる言語を話します」という OP を思い出してください。これはあまり効率的ではありませんが、省略できるのであれば、それが最適です。 (すでにSquidなどを使っている方はこの記事は無視していただいて構いません)。
もう 1 つの問題は、ページの速度を向上させるために、ページが複数のデータ フラグメントで構成されていることが多く、それを個別にキャッシュするか、全体としてキャッシュするか (いわゆるページ キャッシュ) する場合です。データフラグメントを追加または削減すると、ほとんどのデータフラグメントを調整する必要があります。
最後の質問は、すべてのデータを Memcached に保存するのが経済的かということです。サーバー リソースが不足している場合は、もちろん、静的ページを生成することも検討する必要があります。メンテナンスが必要ですが、それでもかなり疲れます。
さて、nginx の fastcgi_cache は、Squid と比較して、シンプルで別のシステムを維持する必要がないという利点があり、小規模な Web サイトに適しています。
Nginx fastcgi_cache に関する基本情報については、Nginx の公式ドキュメント http://wiki.nginx.org/HttpFcgiModule を参照してください。以下は典型的なアプローチです:
fastcgi_temp_path /data/ngx_fcgi_tmp<span style="color: rgb(102, 102, 102); font-style: italic; ">;</span> fastcgi_cache_path /data/ngx_fcgi_cache levels<span style="color: rgb(0, 0, 102); font-weight: bold; ">=</span><span style="color: rgb(102, 0, 102); ">2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g</span><span style="color: rgb(102, 102, 102); font-style: italic; ">;</span> fastcgi_cache_valid 200 301 302 1d<span style="color: rgb(102, 102, 102); font-style: italic; ">;</span> fastcgi_cache_use_stale error timeout invalid_header http_500<span style="color: rgb(102, 102, 102); font-style: italic; ">;</span> fastcgi_cache_key $request_method://$host$request_uri<span style="color: rgb(102, 102, 102); font-style: italic; ">;</span>
キャッシュ キーとして $request_method を追加する必要があることに注意してください。そうしないと、HEAD タイプのリクエストが最初に行われた場合、後続の GET リクエストは空を返します。設定ファイル名は fastcgi_cache.conf で、それを追加します。仮想ホスト構成:
fastcgi_cache ngx_fcgi_cache<span style="color: rgb(102, 102, 102); font-style: italic; ">;</span> include fastcgi.conf<span style="color: rgb(102, 102, 102); font-style: italic; ">;</span>
各パラメータの意味の簡単な説明:
fastcgi_temp_path: fastcgi_cache 一時ファイル ディレクトリを生成します
fastcgi_cache_path: fastcgi_cache キャッシュ ディレクトリ。ディレクトリ ハッシュ レベルを設定できます。たとえば、2:2 では 256*256 ワードのディレクトリが生成されます。keys_zone はこのキャッシュ スペースの名前で、キャッシュに使用されるメモリの量です (このように) 、人気のコンテンツ nginx はメモリを直接配置し、アクセス速度を向上させます)、inactive はデフォルトの有効期限を表し、max_size は使用されるハードディスク容量の最大量を表します。fastcgi_cache キャッシュは最初に fastcgi_temp_path に書き込まれ、その後 fastcgi_cache_path に移動されることに注意してください。したがって、これら 2 つのディレクトリは同じパーティションに置くのが最適です。0.8.9 以降は、後で別のパーティションに置くこともできますが、同じパーティションに置くことをお勧めします。
fastcgi_cache_valid: キャッシュする http ヘッダーを定義します
fastcgi_cache_use_stale: 期限切れのキャッシュが使用される状況を定義します
fastcgi_cache_key: fastcgi_cache のキーを定義します。この例では、キャッシュ ハッシュ ディレクトリが設定されている場合、Nginx はこのキーの md5 を取得します。ディレクトリの後ろから前の数字。
fastcgi_cache: 使用するキャッシュスペース
基本的には機能しますが、まだ終わっていません。キャッシュを手動でクリアするにはどうすればよいでしょうか。これを行うのに役立つサードパーティの拡張機能があります (https://github.com/FRiCKLE/ngx_cache_purge/)。最初のほとんどの場合、サードパーティの拡張機能は必要ありません。PHP を例に挙げると、クリーンアップ スクリプトを作成するのは非常に簡単です。
<span style="color: rgb(0, 0, 0); font-weight: bold; "><?php</span> <span style="color: rgb(0, 0, 0); font-weight: bold; ">function</span> purgeCache<span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(0, 153, 0); ">{</span> <span style="color: rgb(0, 0, 136); ">$url</span> <span style="color: rgb(51, 153, 51); ">=</span> <span style="color: rgb(0, 0, 136); ">$this</span><span style="color: rgb(51, 153, 51); ">-></span><span style="color: rgb(0, 64, 0); ">post</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">'url'</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(177, 177, 0); ">if</span> <span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(153, 0, 0); ">empty</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 136); ">$url</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(51, 153, 51); "></span> <span style="color: rgb(51, 153, 51); ">!</span>Cola_Com_Validate<span style="color: rgb(51, 153, 51); ">::</span><span style="color: rgb(0, 64, 0); ">url</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 136); ">$url</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(0, 153, 0); ">{</span> <span style="color: rgb(153, 0, 0); ">exit</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">'请输入正确的URL。'</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(0, 153, 0); ">}</span> <span style="color: rgb(0, 0, 136); ">$md5</span> <span style="color: rgb(51, 153, 51); ">=</span> <span style="color: rgb(153, 0, 0); ">md5</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 136); ">$url</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(0, 0, 136); ">$cacheFile</span> <span style="color: rgb(51, 153, 51); ">=</span> <span style="color: rgb(0, 0, 136); ">$this</span><span style="color: rgb(51, 153, 51); ">-></span>_cacheRoot <span style="color: rgb(51, 153, 51); ">.</span> <span style="color: rgb(0, 0, 255); ">'/'</span> <span style="color: rgb(51, 153, 51); ">.</span> <span style="color: rgb(153, 0, 0); ">substr</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 136); ">$md5</span><span style="color: rgb(51, 153, 51); ">,</span> <span style="color: rgb(51, 153, 51); ">-</span><span style="color: rgb(204, 102, 204); ">2</span><span style="color: rgb(51, 153, 51); ">,</span> <span style="color: rgb(204, 102, 204); ">2</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(51, 153, 51); ">.</span> <span style="color: rgb(0, 0, 255); ">'/'</span> <span style="color: rgb(51, 153, 51); ">.</span> <span style="color: rgb(153, 0, 0); ">substr</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 136); ">$md5</span><span style="color: rgb(51, 153, 51); ">,</span> <span style="color: rgb(51, 153, 51); ">-</span><span style="color: rgb(204, 102, 204); ">4</span><span style="color: rgb(51, 153, 51); ">,</span> <span style="color: rgb(204, 102, 204); ">2</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(51, 153, 51); ">.</span> <span style="color: rgb(0, 0, 255); ">'/'</span> <span style="color: rgb(51, 153, 51); ">.</span> <span style="color: rgb(0, 0, 136); ">$md5</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(177, 177, 0); ">if</span> <span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(51, 153, 51); ">!</span><span style="color: rgb(153, 0, 0); ">file_exists</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 136); ">$cacheFile</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(0, 153, 0); ">{</span> <span style="color: rgb(153, 0, 0); ">exit</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">'缓存不存在。'</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(0, 153, 0); ">}</span> <span style="color: rgb(177, 177, 0); ">if</span> <span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(51, 153, 51); ">@</span><span style="color: rgb(153, 0, 0); ">unlink</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 136); ">$cacheFile</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(0, 153, 0); ">{</span> <span style="color: rgb(177, 177, 0); ">echo</span> <span style="color: rgb(0, 0, 255); ">'清除缓存成功。'</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(0, 153, 0); ">}</span> <span style="color: rgb(177, 177, 0); ">else</span> <span style="color: rgb(0, 153, 0); ">{</span> <span style="color: rgb(177, 177, 0); ">echo</span> <span style="color: rgb(0, 0, 255); ">'清除缓存失败。'</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(0, 153, 0); ">}</span> <span style="color: rgb(0, 153, 0); ">}</span>
コアは 11 行目です。キャッシュ ファイルを見つけて削除するだけです。このスクリプトには副作用があり、手動でクリアするとキャッシュが無効になりますが、後で Nginx が自動的にキャッシュをクリアし、リンク解除の失敗ログを報告します。それは問題ではありません。 。
落ち着いてください。記事はまだ完成していません。そうしないと、Nginx の fastcgi_cache キャッシュは非常に優れていますが、特定のページでのみ fastcgi_cache を使用したいのです。 1 つは、fastcgi_cache を定義する方法です。特定のルールを満たす URL のみがキャッシュを使用し、その他の URL はキャッシュしないようにするため、ColaPHP を使用している場合は、キャッシュする必要のないページのヘッダー情報を直接出力します。 this->response->disableBrowserCache(); 特定のコード:
<span style="color: rgb(153, 0, 0); ">header</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">"Expires: Mon, 26 Jul 1997 05:00:00 GMT"</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(153, 0, 0); ">header</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">"Last-Modified: "</span> <span style="color: rgb(51, 153, 51); ">.</span> <span style="color: rgb(153, 0, 0); ">gmdate</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">"D, d M Y H:i:s"</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(51, 153, 51); ">.</span> <span style="color: rgb(0, 0, 255); ">" GMT"</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(153, 0, 0); ">header</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">"Cache-Control: no-store, no-cache, must-revalidate"</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(153, 0, 0); ">header</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">"Cache-Control: post-check=0, pre-check=0"</span><span style="color: rgb(51, 153, 51); ">,</span> <span style="color: rgb(0, 153, 0); font-weight: bold; ">false</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(153, 0, 0); ">header</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 0, 255); ">"Pragma: no-cache"</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span>
これにより、このページをキャッシュする必要がないことが Nginx に伝えられます。
最後に質問が 1 つあります。たとえば、コンテンツ ページの一部だけをキャッシュできない場合、Nginx fastcgi_cache を使用できますか?コンテンツはキャッシュできますが、ユーザーのログイン情報が更新されたものをキャッシュしたいとします。答えは「はい」です。ログインしていないユーザーのページ スタイルを直接出力でき、ページが読み込まれた後、ユーザー情報は ajax を通じて非同期で更新されます。
$<span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 153, 0); ">)</span>.<span style="color: rgb(102, 0, 102); ">ready</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 51, 102); font-weight: bold; ">function</span><span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 153, 0); ">)</span> <span style="color: rgb(0, 153, 0); ">{</span> initUser<span style="color: rgb(0, 153, 0); ">(</span><span style="color: rgb(0, 153, 0); ">)</span><span style="color: rgb(51, 153, 51); ">;</span> <span style="color: rgb(0, 153, 0); ">}</span><span style="color: rgb(0, 153, 0); ">)</span>