単一の上流サーバーを再試行するようにnginxを構成する


14

nginxをリバースプロキシとして使用していますが、上流サーバーが応答しない場合は、数秒待ってリクエストを再試行します。この方法でアップストリームサーバーを再起動すると、ユーザーに502の不正なゲートウェイが表示される代わりに、ブラウザーが数秒間ハングします(再起動プロセスには3秒または4秒かかります)。私はいくつかのことを試しましたが、これを私のサーバーブロックに入れました:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

しかし、それは何もしなかったようです。これを上流ブロックに追加してみました:

server 127.0.0.1:3001 fail_timeout=10s;

繰り返しますが、私が欲しかったものではありません。

これは可能ですか?何が欠けていますか?

回答:


1

あなたが試みたディレクティブはあなたが望むものとは異なるもののためのものです。彼らのドキュメントを読んでください。

upstream上流のブロックがどのように機能するかを指示文書は、徹底的に説明しています。

サーバーとの通信中にエラーが発生した場合、要求は次のサーバーに渡され、機能しているすべてのサーバーが試行されるまで繰り返されます。どのサーバーからも成功した応答を取得できなかった場合、クライアントは最後のサーバーとの通信の結果を受け取ります。

すべてがそこに言った。

ただし、バックエンドから返されたエラーコードをインターセプトして処理し、元のクライアントに代わってそれを処理する特別なスクリプトにをproxy_intercept_errors送信できる場合があり$request_uriます。

ベースラインは、クライアント側(またはフロントエンド側)を再試行するためのコード/アプリケーションロジックが必要です。


0

別の答えで述べたように、nginxにこれを実行させる組み込みの方法はありません。可能な解決策は、現在のサーバーと、すべての要求に対して次のことを行うバックアップサーバーで構成される負荷分散セットアップを使用することです。

  • 現在のサーバーがオンラインになるまでポーリングする
  • 次に、302またはその他のリダイレクトで応答して、ブラウザが再試行するようにします

このサーバーは「バックアップ」フラグでマークされるため、他のすべてのサーバーがオフラインのときにのみ試行されます([ HTTP負荷分散]> [サーバーの重み])。

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