バックエンドがダウンしている場合、nginxはプロキシキャッシュを使用します


11

バックエンドサーバーがダウンした場合、nginxプロキシはキャッシュを使用する必要があります。

これが私の構成です。しかし、バックエンドサーバーをチェックせずにnginxがキャッシュを使用しているようです。

http {

  # ...

  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_cache_path /tmp/nginx levels=1:2 keys_zone=tmpzone:10m inactive=60m;
  proxy_cache_key "$scheme$request_method$host$request_uri";


  server {
    server_name _;

    location / {
      proxy_connect_timeout 5s;
      proxy_read_timeout 5s;
      proxy_cache tmpzone;
      proxy_cache_valid      200 304 1d;
      proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host 'www.example.com';
      proxy_pass http://www.example.com;
    }
  }
}

質問は、バックエンドサーバーが稼働している場合、どのようにプロキシキャッシュをバイパスできますか?また、バックエンドサーバーが稼働している場合、プロキシサーバーはキャッシュをまったく使用しません。


質問は何ですか?
ジェニーD

質問は、バックエンドサーバーが稼働している場合、どのようにプロキシキャッシュをバイパスできますか?
sweb

すぐに使えるソリューションの1つは、2つの「サーバー」を実行し、1つをキャッシュ付き、もう1つをキャッシュなしにし、アップストリームモジュールnginx.org/en/docs/http/ngx_http_upstream_module.htmlを使用すること です。おそらく、バックエンドが存在するかどうかをチェックしてproxy_cache_bypassを使用できるのが最善の解決策でしょう...動作させる方法がわかりませんが...興味深いケースです。
SvennD

XY問題のこのインスタンスに対する解決策をすることができSO上にわたりた
だよ

回答:


8

これの複製のようです:

/programming/16756271/how-to-configure-nginx-to-serve-cached-content-only-when-backend-is-down-5xx-re

要するに、proxy_cache_use_staleを使用します

更新として、これをテストし、正常に動作します。私がいるワークステーションでテストを行いました(完全性のため):

SSLターミネーター+キャッシュ+ポート80でリッスンするように構成されたリバースプロキシApache 2.4.18として構成されたFedora 23 nginx 1.8.1

アップストリームとして機能するApacheで、静的ファイルだけを提供してこのテストを行いました:

  1. Apacheが起動し、nginxが起動し、nginxが提供する逆プロキシされたURLをブラウザにポイントすると、Apacheからプロキシされたコンテンツが表示されます。この時点で、nginxはこれをキャッシュに保持します。
  2. 停止したApache
  3. nginxに接続すると、Apacheによって以前に提供されたキャッシュファイルが表示されます。

私が使用したnginx設定は次のとおりです(興味深い部分のみ):

nginx.conf:

http {
[...]
location
    proxy_cache_path        /var/lib/nginx/tmp/proxy/ levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/local.conf:

upstream localhost {
    server 127.0.0.1:80;
[...]
}


server {
    listen       127.0.0.1:443 ssl;

[...]

    location /be/ {
        proxy_pass              http://localhost;
        proxy_cache             STATIC;
        proxy_cache_valid       200 1d;
        proxy_cache_use_stale   error;
}

まったく動作しないので試してみてください。
sweb

バグをnginxチームに報告する必要がある場合に備えて。ところで何を試しましたか?私がそれを再現しようとする場合
フレディ

わかりました、私はテストをし、それはうまく働きました。テストの詳細で回答を更新しました。
フレディ

swebの最初の質問の私の読書は、Apacheとnginxの両方の状態で、すべてのリクエストはApacheバックエンドに送られるべきだということでした。Apacheがダウンしている場合、リクエストはNginXキャッシュからのみ提供されるべきです
-abhishekmukherg

@abhishekmukherg、あなたはあなたが言うことをすることができますが、なぜですか?両方が稼働し、ファイルが静的な場合(jpg / css / htmlを考えてください)、実際のフロントエンドがあるときに、より多くのnetwork / cpu / eccリソースを使用してバックエンドに行くのはなぜですか?ところで、これは別の質問の問題です
フレディ

0

proxy_intercept_errorsおよびproxy 500sを、キャッシュが有効になっているサーバーに使用します。

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