バックエンドの再起動中にnginxプロキシを再試行


16

バックエンドの再起動中にNginxは502を返します。Mginの遅延でnginxプロキシをN回再試行させるにはどうすればよいですか?プラグインなどがありますか?

回答:


5

同じバックエンドの何百ものインスタンスを指定した場合、Nginxが試行を終了するまでに約2秒かかることがわかりました。

    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;

(....えー、必要に応じて繰り返します!)

はい、恐ろしいクラッジ-しかし、それはある程度の粘り強さを追加します...

それよりもさらに悪いことには、次のものを使用できます。

    server  localhost:8080 max_fails=0;     
    server  localhost:80 backup;        

Nginxがポート80で実行されていると仮定すると、localhost:8080が応答するまでNginxの周りでリクエストを継続的にループしようとします。つまり、ゼロ秒の遅延で無限(?)回再試行します。

パッド入りのセルに戻ります。


2番目のアプローチでは、再帰ループが発生してサーバーがクラッシュしませんか?
スンオセワ

@SeunOsewaバックエンドが応答するのにかかる時間に大きく依存しますが、ええ、それはある時点でオーバーフローするでしょう。
オリ

2

nginxインストールにLuaがサポートされている場合、スリープメソッドを使用してクライアントをしばらく保持できます。操作は非ブロッキングであり、ワーカーをロックしません。他のネットワーク関連のソケット/ファイアウォールのタイムアウトが最終的に発生する可能性があるため、ユーザーを無限に保持することはできません。

server {
    listen 8502;
    location / {
        #25 seconds sleep
        content_by_lua_block {
             ngx.sleep(25); 
             ngx.exit(ngx.HTTP_BAD_GATEWAY);
        }
    }
}

次に、アップストリームリストで、クライアントを保持するためのバックアップとして上記のサーバーを追加する必要があります。

upstream backend {
    server 127.0.0.1:3001 fail_timeout=2s; #The backend
    server 127.0.0.1:8502 backup; #Lua holding server in the event backend is restarting
}

そして、これはプロキシされた場所の仕様に含める必要があります。

proxy_read_timeout         30;  #Value must be higher than sleep in Lua
proxy_next_upstream error timeout http_502 http_504;

インストールするにはlua:Ubuntuの17.04の実行でnginxのにモジュールをsudo apt-get install libnginx-mod-http-lua
ユージン・マラ

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