Назад | Перейти на главную страницу

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

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

Я обнаружил, что 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 не ответит. Т.е. повторите попытку бесконечное (?) количество раз с задержкой в ​​ноль секунд.

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

Если ваша установка 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;

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