多数のバックエンドサーバーを使用して、nginxをリバースプロキシとして設定しようとしています。バックエンドをオンデマンドで(最初のリクエストで)起動したいので、受信したリクエストに応じてバックエンドを起動する制御プロセス(HTTPリクエストによって制御される)があります。
私の問題は、nginxを設定することです。ここに私が持っているものがあります:
server {
listen 80;
server_name $DOMAINS;
location / {
# redirect to named location
#error_page 418 = @backend;
#return 418; # doesn't work - error_page doesn't work after redirect
try_files /nonexisting-file @backend;
}
location @backend {
proxy_pass http://$BACKEND-IP;
error_page 502 @handle_502; # Backend server down? Try to start it
}
location @handle_502 { # What to do when the backend server is not up
# Ping our control server to start the backend
proxy_pass http://127.0.0.1:82;
# Look at the status codes returned from control server
proxy_intercept_errors on;
# Fallback to error page if control server is down
error_page 502 /fatal_error.html;
# Fallback to error page if control server ran into an error
error_page 503 /fatal_error.html;
# Control server started backend successfully, retry the backend
# Let's use HTTP 451 to communicate a successful backend startup
error_page 451 @backend;
}
location = /fatal_error.html {
# Error page shown when control server is down too
root /home/nginx/www;
internal;
}
}
これは機能しません-nginxは、コントロールサーバーから返されたステータスコードを無視するようです。ロケーションerror_page
内のディレクティブはいずれも機能せ@handle_502
ず、451コードはそのままクライアントに送信されます。
私はこれに内部nginxリダイレクトを使用しようとしてあきらめ、同じ場所に307リダイレクトを送信するように制御サーバーを変更しようとしました(クライアントが同じリクエストを再試行するようになりましたが、今はバックエンドサーバーが起動しています)。ただし、nginxは、コントロールサーバーが "Location"ヘッダーを送信しているにもかかわらず、バックエンド要求の試行から取得したステータスコード(502)でステータスコードを愚かに上書きしています。error_pageの行をerror_page 502 =307 @handle_502;
、したがって、すべての制御サーバーの応答が307コードでクライアントに送り返されます。1)制御サーバーの応答に応じて、nginxが次に何をすべきかを制御できない(理想的には、制御サーバーが成功を報告した場合にのみバックエンドを再試行したい)、2)すべてのHTTPではないためクライアントはHTTPリダイレクトをサポートします(curlユーザーとlibcurlを使用するアプリケーションは、明示的に次のリダイレクトを有効にする必要があります)。
nginxが上位サーバーA、B、Aの順にプロキシしようとする適切な方法は何ですか(理想的には、Bが特定のステータスコードを返す場合のみ)。
proxy_next_upstream
これ私が追加する必要がありました、(よく私のシナリオはあなたのような複雑なものではなかった)、私はちょうど、エラーが発生した場合は次のサーバを試してみnginxの望んでいたトリックをしましたproxy_next_upstream error timeout invalid_header non_idempotent;
(non_idempotent
私は主に楽しみたいので、POST
リクエスト)。