Мы настроили Nginx в качестве обратного прокси-сервера к ферме серверов Apache, но у меня возникают проблемы с тайм-аутом шлюза.
Наша цель в удобочитаемой форме: «Доставить запрос в течение одной секунды, но если это действительно займет больше времени, доставить все равно», что для меня означает «Попробуйте первый сервер Apache в восходящем потоке не более 500 мсек. Если мы получим тайм-аут / ошибка, попробуйте следующую и так далее, пока мы, наконец, не добьемся успеха ».
Теперь наша соответствующая конфигурация такова:
location @proxy {
proxy_pass http://apache$request_uri;
proxy_connect_timeout 1s;
proxy_read_timeout 2s;
}
[...]
upstream apache {
server 127.0.0.1:8001 max_fails=1 fail_timeout=10s;
server 10.1.x.x:8001 max_fails=1 fail_timeout=10s backup;
server 10.1.x.x:8001 max_fails=1 fail_timeout=10s backup;
server 10.1.x.x:8001 max_fails=1 fail_timeout=10s backup;
}
Проблема здесь в том, что nginx, похоже, неправильно понимает это как «Попытайтесь получить ответ от всего вышестоящего кластера в течение одной секунды и выдать 50-кратную ошибку, если мы этого не сделаем - без каких-либо ограничений на то, как долго пробовать любой восходящий сервер», явно не то, что мы имели в виду.
Есть ли способ заставить nginx делать то, что мы хотим?
Я думаю, что вам нужно:
max_fails=0
и
proxy_next_upstream = timeout
согласно документации:
max_fails= число
устанавливает количество неудачных попыток связи с сервером, которые должны произойти в течение периода, установленного параметром fail_timeout, чтобы считать сервер недоступным в течение периода, также установленного параметром fail_timeout. По умолчанию количество неудачных попыток равно 1. Нулевое значение отключает учет попыток. То, что считается неудачной попыткой, определяется директивами proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream и memcached_next_upstream.
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
и:
Синтаксис: proxy_next_upstream ошибка | тайм-аут | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | non_idempotent | выкл ...; По умолчанию: время ожидания ошибки proxy_next_upstream;
Контекст: http, сервер, местоположение Указывает, в каких случаях запрос должен быть передан следующему серверу:
ошибка
произошла ошибка при установлении соединения с сервером, передаче ему запроса или чтении заголовка ответа;
тайм-аут
истекло время ожидания при установлении соединения с сервером, передаче ему запроса или чтении заголовка ответа;
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream