最近、Nginxがリバースプロキシ機能にキャッシングを追加したと聞きました。周りを見回しましたが、それに関する情報はあまり見つかりませんでした。
Apache/Djangoの前にNginxをキャッシングリバースプロキシとして設定したい:一部(すべてではない)の動的ページに対するNginxプロキシリクエストをApacheに送信し、生成されたページをキャッシュして、それらのページに対する後続のリクエストをキャッシュから提供します。
理想的には、2つの方法でキャッシュを無効にしたいと思います。
それを行うようにNginxを設定することは可能ですか?どうやって?
キャッシュされたアイテムを明示的に無効にする方法はないと思いますが、残りの方法の例を次に示します。 更新:Piotrが別の回答で述べたように、使用できる キャッシュパージモジュール があります。 nginxのproxy_cache_bypassを使用して、キャッシュされたアイテムを強制的に更新することもできます。詳細は Cherian's answer を参照してください。
この構成では、キャッシュされないアイテムはexample.netから取得され、保存されます。キャッシュされたバージョンは、有効でなくなるまで(60分)将来のクライアントに提供されます。
Cache-ControlヘッダーとExpires HTTPヘッダーが受け入れられるため、有効期限を明示的に設定したい場合は、プロキシする対象に正しいヘッダーを設定することでそれを行うことができます。
調整できるパラメーターはたくさんあります。さまざまな設定/パラメーターの意味の詳細など、このすべての詳細については、nginxプロキシモジュールのドキュメントをご覧ください。 http://nginx.org/r/proxy_cache_path
http {
proxy_cache_path /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
proxy_temp_path /var/www/cache/tmp;
server {
location / {
proxy_pass http://example.net;
proxy_cache my-cache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
}
}
}
具体的には キャッシュを無効にする ページから
proxy_cache_bypass
ページをキャッシュしたいとします、このようにキャッシュを設定します
location = /pageid {
proxy_pass http://localhost:82;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ignore_headers Set-Cookie;
proxy_ignore_headers Cache-Control;
proxy_cache_bypass $http_secret_header;
add_header X-Cache-Status $upstream_cache_status;
}
今、あなたがしたいときそのページを無効にして再度キャッシュします
ヘッダーでシークレットカールコールを行う
curl "www.site.com/pageid" -s -I -H "secret_header:true"
無効化してキャッシュします。
Nginx 0.7から動作します。
追加のボーナスとしてadd_header X-Cache-Status
を使用して、ページがキャッシュからのものかどうかを確認できます。
ワニス を試してみることをお勧めします。 Varnishは、特にリバースプロキシキャッシュとして設計されています。これは、最初のリクエストを満たす、Originサーバーから送信するすべてのキャッシュ制御ヘッダーを受け入れます。
2番目のリクエストでは、明示的な無効化。私が強く推奨するのは、ファイルの名前を変更するか、なんらかの形式のクエリ文字列キャッシュバスターを使用して、無効にするリソースのURLの名前を変更することです。 Varnishには、リソースをVarnishのキャッシュから削除するPURGE
操作がありますが、ユーザーとユーザーの間の他のキャッシュを制御することはできません。リソースを明示的にパージする必要があると述べたように、標準のhttpコントロールヘッダーは役に立ちません。その場合、リソースのキャッシュを無効にする最も簡単な方法は、名前を変更することです。
選択したページを無効化するには、nginx-0.8.xの「cache_purge」パッチを使用できます。
利用可能です こちら 。
ほとんどのキャッシュツール(Citrix)では、強制更新(Ctrl + r)でキャッシュページを再生成できます。
これがnginxで同様のことをするために見つけたトリックです。
server {
# Other settings
proxy_pass_header Set-Cookie; # I want to cache logged-in users
proxy_ignore_headers X-Accel-Redirect;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
if ($http_cache_control ~ "max-age=0") {set $eac 1;}
proxy_cache_bypass $eac;
}
これは、ブラウザーでCtrl + rを実行すると、その要求にCache-Controlヘッダーのmax-age = 0があることを前提としています。 Chromeはこれを実行しますが、他のブラウザでは試していません。$eac
変数を1に設定するifステートメントを追加するだけで、ヘッダーフィールドを簡単に追加できます。
キャッシングはnginxのかなり新しい機能です(現時点では十分に文書化されていません)が、本番環境で使用するのに十分安定しています。
使用 英語のドキュメント
質問する メーリングリスト
翻訳 ロシア語のドキュメント Google翻訳のようなもので
ワニス を使用します
NginxHttpProxyModule は、httpリクエストを修正できると思います。次で始まるディレクティブを探します。
proxy_cache
はい、次のようなディレクティブを使用してキャッシュの動作を制御できます。
proxy_cache_valid
あなたがそれにドキュメントを見つけることができないという事実に基づいて、私は本番環境でそれを信頼することに少し警戒するでしょう。ワニスを検討しましたか?それは私の「リバースプロキシのnginx」であり、小さく、軽量で、1つの仕事をし、それをうまくやっています。
アプリケーションでeTagを使用し、nginxをその前に配置すると、eTagが変更されるとキャッシュが無効になるため、有効期限が管理されます。
Nginxのキャッシュの有効期限は、複数のディレクティブ/パラメーターで制御できます。
proxy_cache_valid 200 302 10m;
Expires
Cache-Control
X-Accel-Expires
proxy_cache_path
ディレクティブのinactive
パラメータ:
proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;
Nginxキャッシングについて詳しく知りたい場合は、 私のブログ投稿 をお勧めします。
この機能はNginx Plus(Nginxの商用版)にのみ存在するため、パージのトピックは本当に興味深いものです。 @ randy-wallaceの回答が本当に好きです。しかし ngx_cache_purge module のような他の可能性もあります。
あなたができる最も簡単なことは手動でキャッシュされたファイルを取り除くことです:
ハッシュキーを生成します。
echo -n ‘httpczerasz.com/time.php’ | md5sum
ファイルシステムからファイルを削除します。
rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
将来の訪問者向け:一方、nginxリバースプロキシにはキャッシュが統合されており、ドキュメントは次の場所で入手できます。
構文:proxy_cacheゾーン|オフ;
デフォルト:proxy_cache off;
コンテキスト:http、サーバー、場所
キャッシングに使用される共有メモリゾーンを定義します。同じゾーンを複数の場所で使用できます。パラメータ値には変数を含めることができます(1.7.9)。 offパラメータは、前の構成レベルから継承されたキャッシュを無効にします。
fastcgi_cache_path/opt/nginx-cache levels = 2:2 keys_zone = img:50m; location/img/{ fastcgi_pass $ backend; include fcgi_params; fastcgi_intercept_errors off; fastcgi_cache_key $ server_addr $ request_uri; fastcgi_cache img; fastcgi_cache_valid any 1m; fastcgi_hide_header Set-Cookie; }
これにより、/ img /の場所のキャッシュが作成されます。/opt/nginx-cacheにあります。オブジェクトは1分間キャッシュされます。
任意の代わりに別の応答コードを書き込むことができます。
これで、選択したページのキャッシュを無効にできなくなりました。多分0.8.xでそれは可能になるでしょう。
ncache と呼ばれるnginxプラグインがあり、これは「nginx WebサーバーをベースとするWebキャッシュシステムです。Squidよりも高速で効率的です。」