Повторная попытка прокси-сервера nginx при перезапуске сервера


16

Nginx возвращает 502, пока сервер перезапускается. Как я могу заставить Nginx повторить попытку N раз с M секундной задержкой? Есть ли плагин или что-то еще?

Ответы:


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, он будет пытаться постоянно зацикливать запрос вокруг Nginx до тех пор, пока localhost: 8080 не ответит. Т.е. повторите бесконечное (?) Количество раз с нулевой задержкой.

Я вернусь к своей мягкой камере сейчас ....


Не приведет ли второй подход к рекурсивному циклу и падению сервера?
Seun Osewa

@SeunOsewa Это в значительной степени зависит от того, сколько времени потребуется, чтобы бэкэнд ответил, но да, в какой-то момент это переполнится.
Оли

2

Если ваша установка nginx имеет поддержку Lua, вы можете некоторое время удерживать клиента с помощью метода sleep. Операция неблокирующая и не блокирует работника. Имейте в виду, что пользователь не может удерживаться бесконечно, так как некоторые другие связанные с сетью тайм-ауты сокетов / брандмауэров могут, наконец, возникнуть.

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модуль в nginx на Ubuntu 17.04, запустите:sudo apt-get install libnginx-mod-http-lua
Евгений Мала

1

Ближайшая вещь, которую я знаю, это этот проект , но я никогда не использовал. Я знаю, что у лака есть проверка бэкэнда, может быть, вы захотите взглянуть на него.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.