web-dev-qa-db-ja.com

Nginxをキャッシングリバースプロキシとして設定するにはどうすればよいですか?

最近、Nginxがリバースプロキシ機能にキャッシングを追加したと聞きました。周りを見回しましたが、それに関する情報はあまり見つかりませんでした。

Apache/Djangoの前にNginxをキャッシングリバースプロキシとして設定したい:一部(すべてではない)の動的ページに対するNginxプロキシリクエストをApacheに送信し、生成されたページをキャッシュして、それらのページに対する後続のリクエストをキャッシュから提供します。

理想的には、2つの方法でキャッシュを無効にしたいと思います。

  1. キャッシュされたアイテムに有効期限を設定する
  2. キャッシュされたアイテムを明示的に無効にします。例えば。私のDjangoバックエンドが特定のデータを更新した場合、影響を受けるページのキャッシュを無効にするようにNginxに指示したいと思います

それを行うようにNginxを設定することは可能ですか?どうやって?

145
Continuation

キャッシュされたアイテムを明示的に無効にする方法はないと思いますが、残りの方法の例を次に示します。 更新: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;
    }
  }
}
97
Casey

具体的には キャッシュを無効にする ページから

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を使用して、ページがキャッシュからのものかどうかを確認できます。

47
Cherian

ワニス を試してみることをお勧めします。 Varnishは、特にリバースプロキシキャッシュとして設計されています。これは、最初のリクエストを満たす、Originサーバーから送信するすべてのキャッシュ制御ヘッダーを受け入れます。

2番目のリクエストでは、明示的な無効化。私が強く推奨するのは、ファイルの名前を変更するか、なんらかの形式のクエリ文字列キャッシュバスターを使用して、無効にするリソースのURLの名前を変更することです。 Varnishには、リソースをVarnishのキャッシュから削除するPURGE操作がありますが、ユーザーとユーザーの間の他のキャッシュを制御することはできません。リソースを明示的にパージする必要があると述べたように、標準のhttpコントロールヘッダーは役に立ちません。その場合、リソースのキャッシュを無効にする最も簡単な方法は、名前を変更することです。

36
Dave Cheney

選択したページを無効化するには、nginx-0.8.xの「cache_purge」パッチを使用できます。

利用可能です こちら

8
Piotr Sikora

ほとんどのキャッシュツール(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ステートメントを追加するだけで、ヘッダーフィールドを簡単に追加できます。

8
Randy Wallace

キャッシングはnginxのかなり新しい機能です(現時点では十分に文書化されていません)が、本番環境で使用するのに十分安定しています。

5
SaveTheRbtz

NginxHttpProxyModule は、httpリクエストを修正できると思います。次で始まるディレクティブを探します。

proxy_cache

はい、次のようなディレクティブを使用してキャッシュの動作を制御できます。

proxy_cache_valid
4
Taras Chuhay

あなたがそれにドキュメントを見つけることができないという事実に基づいて、私は本番環境でそれを信頼することに少し警戒するでしょう。ワニスを検討しましたか?それは私の「リバースプロキシのnginx」であり、小さく、軽量で、1つの仕事をし、それをうまくやっています。

3
womble

アプリケーションでeTagを使用し、nginxをその前に配置すると、eTagが変更されるとキャッシュが無効になるため、有効期限が管理されます。

2
Martin Murphy

Nginxのキャッシュの有効期限は、複数のディレクティブ/パラメーターで制御できます。

  • proxy_cache_valid 200 302 10m;
  • 以下のHTTPヘッダーの1つを追加します(優先度は重要です-チェックアウト 私のブログ投稿 ):
    • 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
    
2
czerasz

将来の訪問者向け:一方、nginxリバースプロキシにはキャッシュが統合されており、ドキュメントは次の場所で入手できます。

構文:proxy_cacheゾーン|オフ;

デフォルト:proxy_cache off;

コンテキスト:http、サーバー、場所

キャッシングに使用される共有メモリゾーンを定義します。同じゾーンを複数の場所で使用できます。パラメータ値には変数を含めることができます(1.7.9)。 offパラメータは、前の構成レベルから継承されたキャッシュを無効にします。

2
Tarik Huclaslun
 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でそれは可能になるでしょう。

0
lexsys

ncache と呼ばれるnginxプラグインがあり、これは「nginx WebサーバーをベースとするWebキャッシュシステムです。Squidよりも高速で効率的です。」

0
sajal