nginxでHTMLブロックをキャッシュする

サイトのコンテンツが1年に1回よりも頻繁に更新される場合、ユーザーが気に入っていることは周知の事実です。 動的ページに対するユーザーのこの愛は、検索エンジンによって共有されます。 たとえば、Googleはページ上の更新されたブロックの存在を判断し、それに小さなカルマを追加できます(読み取り、PR)。



ただし、動的コンテンツと高負荷の組み合わせは不十分です。 Webサーバーの場合、静的ページを返すことは、このページを動的に生成するコードを実行するよりもはるかに簡単なタスクです。 場合によっては、可能なすべてのページオプションの再生成が役立ちますが、それらが多すぎる場合やページが頻繁に更新される場合、これは保存されません。







簡単な例-nginxによって毎秒2000回の速度で配信されたすばらしい静的HTMLがあるとします(これは問題なく達成できます)。 そして、親切なデザイナーがページの新しいバージョンを描きました。そこでは、ログインしたユーザーのために、ログイン、名、ミドルネーム、そして例えばアバターを含むmaaaalenkyブロックがあります。



これで終わりです。 ここでは静的な処理を行うことができません。つまり、リクエストごとにPHP(Perl / Python)を起動し、セッションをチェックし、SIDによってログインやその他のユーザー情報を見つけるためにファイルシステム(さらに悪いことにデータベース)をクロールします。 パフォーマンスが10倍低下する。 かどうか。 :)



この問題は、nginx Webサーバーが提供する2つの便利な機能を使用すれば、非常に簡単に解決できます。



太古の昔からその中にあった機能回数はSSIです。 これを使用するために、Cookieからセッション識別子を受け入れ、ユーザーに関する情報を含む非常に小さなブロックのみを提供できる小さなスクリプトを作成します。 つまり、 GET /get_user_info.php



という形式のリクエストは、<div class = "login"> Hello、Vasily Pupkin </ div>という形式のHTMLフラグメントをGET /get_user_info.php







したがって、ページ自体にSSI-include: <!--# include virtual="/get_user_info/" -->



ます。



この構成が機能するためには、対応する場所をnginx構成ファイルに記述する必要があります。



location /get_user_info/ {

proxy_pass 127.0.0.1:12345/get_user_info.php;

proxy_pass_header Cookie; # sid Cookie

}









ただし、おそらく既にお気付きのように、このような設計ではコードのパフォーマンスの問題は解決されず、動的部分を別のスクリプトに配置することしかできません。 さて、これには機能番号2-プロキシリクエストのキャッシュが必要です。 実稼働ブランチでは、比較的最近登場しましたが、すでに多くのことができます。 :)



まず、キャッシュを保存するnginxについて考えてみましょう。

proxy_cache_path /var/nginx/cache

levels=1:2 keys_zone=my_cache:64m max_size=1024m

inactive=1d;









この行は、my_cacheというキャッシュ用の新しいゾーンを作成していることを意味します。キャッシュファイルは/ var / nginx / cacheにあり、1ギガバイト以下を占有し、1日以内に保存されます。



ここで、リクエストをロケーションにキャッシュすることをnginxに伝えます。



location /get_user_info/ {

proxy_pass 127.0.0.1:12345/get_user_info.php;

proxy_pass_header Cookie; # sid Cookie



proxy_cache my_cache;

proxy_cache_valid 200 3h; # :)

proxy_cache_valid any 0; # 500 400

proxy_cache_use_stale updating error timeout invalid_header http_500 http_502 http_503 http_504 http_404; # , , ,

proxy_cache_key "$scheme$proxy_host$uri$is_args$args$cookie_sid";

}









最後の行に注意してください。 キャッシュされたブロックの正しいバージョンを個々のユーザーに提供できるのは彼女です。 より正確には、最後のパラメーターが重要です。$ cookie_sid変数は、値が常に「sid」という名前のCookieの値と等しくなり、ユーザーが指定する必要があります。



それだけです これで、nginx自体が必要に応じてスクリプトにアクセスし、作業結果をキャッシュします。 同時に、パフォーマンスはほとんど低下せず、サーバーの負荷はそれほど増加しません。



詳細に興味のある人はすべて、ドキュメントの作者であるsysoev.ru/nginx/docsのnginxウェブサイトに送信します。



UPD:設定を理解し、nginxブログに移動しました。



All Articles