web-dev-qa-db-ja.com

キャッシングプロキシとしてのNginx:最初に404が返された場合に2番目のアップストリームを試行します

Nginxをキャッシングプロキシとして使用する場合、2つのアップストリームサーバーが404を返さない限り、常に最初のサーバーを試行し、その場合にのみ2番目のアップストリームを試行するように構成する方法はありますか?

アップストリーム構成ブロックのbackupオプションを知っていますが、最初のサーバーが使用できない場合にのみそのサーバーを試行します。最初のサーバーが利用可能かどうかについて話しているのですが、その特定の要求されたファイルだけが404を返します。

3
user779159

タイムアウトが必要な理由や50X応答を有効なものと言う理由はわかりませんが、本当に404が必要な場合は、Nginxのドキュメントで次のように説明されています。

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

max_fails = number

fail_timeoutパラメーターで設定された期間にサーバーとの通信に失敗した回数を設定し、fail_timeoutパラメーターで設定された期間サーバーが使用できないと見なします。デフォルトでは、失敗した試行の数は1に設定されています。ゼロの値は、試行のアカウンティングを無効にします。

これがキッカーです:

失敗した試行と見なされるものは、proxy_next_upstream、fastcgi_next_upstream、uwsgi_next_upstream、scgi_next_upstream、およびmemcached_next_upstreamディレクティブによって定義されます。

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream

構文:proxy_next_upstreamエラー|タイムアウト| invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 |オフ...;

http_404サーバーがコード404で応答を返しました。

同様の投稿に対するこの回答は、構成のベースを形成する可能性があります。

https://stackoverflow.com/a/12878310/4995465

1
JayMcTee

はい、アップストリームグループ内の1台のサーバーのweightを増やし、proxy_next_upstreamで遊んで、スイッチオーバーが発生したくないコードを含めたり除外したりできます。このように、より大きな重みを持つサーバーがほとんどの要求を処理します(多数派/少数派は重みの量に依存しますが、一部の要求はとにかく2番目の要求によって処理されます)。

それでも、backupを使用するのが適切です。常にすべてのデータを含むサーバーを使用しない理由は想像できません。

0
drookie