Nginxをキャッシングリバースプロキシとして設定する方法は?


143

最近、Nginxがリバースプロキシ機能にキャッシュを追加したと聞きました。私は周りを見回したが、それについて多くの情報を見つけることができなかった。

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

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

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

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


テストされていませんが、gumroad.com / l / ngx_purge から:「ngx_purgeは、ユーザーがnginxキャッシュからオブジェクトをパージできるようにするNginx用の純粋なLuaモジュールです。」
ハイメハブルツェル

回答:


97

キャッシュされたアイテムを明示的に無効にする方法はないと思いますが、残りの方法の例を次に示します。更新: Piotrが別の回答で述べたように、使用できるキャッシュパージモジュールがあります。nginxのproxy_cache_bypassを使用して、キャッシュされたアイテムを強制的に更新することもできます-詳細については、Cherianの回答を参照してください。

この構成では、キャッシュされていないアイテムは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;
    }
  }
}

7
これは、20k / req / sを持たない新しいアプリの合理的な最初のステップです。

5
@Barry 2番目のステップは何ですか?
ユルゲンポール

42
@Legit-わかりませんが、伝統的に最後のステップは「利益」です:
スティーブンC

悲しいことに、nginx 1.11では動作しません。最後の更新は約3年前であったため、これはもはや解決策ではないようです。
izogfif

どういうinactive=600m意味ですか?inactive時間だと思いませんか?`[inactive=time]
NeverEndingQueue

47

キャッシュされたページを具体的に無効にすることができます

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ページがキャッシュにあるかどうかを確認するために使用できます。


これは、新しいページがキャッシュ可能な場合にのみキャッシュされたページを更新できます。ページを削除した場合(404またはその他のエラーがバックエンドによって処理されるようになりました)、ページはSet-Cookieまたは「Content-Control:private」ヘッダーを送信するようになり、キャッシュされたコンテンツは「無効化」されません。
-rbu

36

ワニスを試してみることをお勧めします。Varnishは特にリバースプロキシキャッシュとして設計されています。オリジンサーバーから送信するすべてのキャッシュ制御ヘッダーを尊重し、最初の要求を満たします。

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


「ファイルの名前を変更するか、何らかの形式のクエリ文字列キャッシュバスターを使用する」とはどういう意味ですか?PURGEのような操作を使用するのが良い考えではない理由を理解できません。
継続

5
ニスの+1。仕事に適切なツールを使用することは常にずっと良いことです。
トム・オコナー

4
@below:パフォーマンスと汎用性の分野では、ワニスに触れる希望はほとんどありません。これは、FreeBSDの主要なカーネル開発者の1人とヨーロッパに拠点を置く専任チームによって支えられています。Varnishはtwitter、herokuなどで制作中です。

2
キャッシュ無効化の最も簡単な例は、クエリ文字列のバージョン番号を静的リソースに追加することです。したがって、style.cssはstyle.css?123になります。ファイルの新しいバージョンをプッシュする場合、リソースのurlをstyle.css?124に変更すると、キャッシュが完全に新しいアセットとしてそれをピックアップし、個別にキャッシュされます。Apacheは、クエリ文字列が追加されたファイルstyle.cssを提供するため、実際のファイルを変更する必要はありません。
chmac

3
可能であれば、style.v123.css一部のキャッシュはクエリ文字列を持つリクエストをキャッシュしないなどの理由で、キャッシュバスターをファイル名自体に入れるのが最善です。
ノアマチルライス

8

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

こちらから入手できます


8

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



4

NginxHttpProxyModuleはhttpリクエストをキャッシュできると信じています。次で始まるディレクティブを探します。

proxy_cache

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

proxy_cache_valid

3

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



2

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


本当に?ngnixはetagに一致し、更新されたetagがあるかどうかを確認するためにアプリケーションと通信することはないようです。
ジョンネーグル

2

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

  • proxy_cache_valid 200 302 10m;
  • 以下のHTTPヘッダーのいずれかを追加します(優先順位が重要です- 私のブログ投稿をチェックしください):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • ディレクティブのinactiveパラメーターproxy_cache_path

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

Nginxキャッシングについて詳しく知りたい場合は、ブログ投稿をお勧めします。

この機能はNginx Plus(Nginxの商用版)にのみ存在するため、パージのトピックは非常に興味深いものです。@ randy-wallaceの回答が本当に好きです。しかし、ngx_cache_purgeモジュールのような他の可能性もあります

最も簡単な方法は、キャッシュファイルを手動で削除することです。

  • ハッシュキーを生成します:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • ファイルシステムからファイルを削除します。

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    

1

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

構文:proxy_cache zone | オフ;

デフォルト:proxy_cache off;

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

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


こんにちはTarik、質問は達成する必要があるものに非常に具体的であり、「キャッシュを有効にする」だけではありません。
asdmin

0
fastcgi_cache_path / opt / nginx-cache levels = 2:2 keys_zone = img:50m;

    場所/ img / {
        fastcgi_pass $ backend;
        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で可能になるかもしれません。


元の質問は、nginxによって処理されるfastcgiアプリケーションの前ではなく、Apacheの前でnginxを使用することに関するものでした。
グラハムダンプルトン2009

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.