Возможно ли, чтобы nginx повторил второй бэкэнд перед возвратом 502 клиенту?
Хотелось бы, чтобы это сработало?
Внешний интерфейс:
# haproxy:85 => [a few app servers]:8000
# more specifically:
# haproxy => [nginx => unicorn (502 when busy)]
# Will this try a second app server when the first returns 502?
upstream haproxy {
server 127.0.0.1:85;
server 127.0.0.1:85 backup;
}
server {
listen 80;
proxy_pass http://haproxy;
proxy_next_upstream http_502;
}
Бэкэнд:
upstream unicorn {
server unix:/tmp/unicorn.sock fail_timeout=0;
}
server {
listen 8000;
proxy_pass http://unicorn;
}
Во всяком случае, мне просто любопытно. На самом деле это, вероятно, довольно глупо, потому что повторная попытка может привести к тому, что попадет на тот же перегруженный сервер и все равно вернет 502 ...
Насколько мне известно, Nginx автоматически пробует каждый доступный сервер - и если все вернут ошибку, он вернет код ошибки последнего ответа.
proxy_next_upstream
просто, кажется, предлагает более тонкий контроль над тем, какие ошибки будут обрабатываться, а какие будут игнорироваться (но по умолчанию уже есть любая «ошибка» при подключении, отправке или получении - с, я полагаю, таймаутом 60 секунд).
Согласно документации (формулировка может потребовать некоторой доработки):
«Если при попытке работы с сервером произошла ошибка, то запрос будет передан на следующий сервер, а затем до тех пор, пока не будут протестированы все рабочие сервера. Если успешный ответ не удастся получить со всех серверов, то клиенту будет возвращен результат работы с последним сервером. "
Вы можете проверить это поведение с помощью скрипта, который записывает время (или любые данные) в файл и возвращает 502. Если вы обнаружите, что в журнале была записана только 1 строка, значит, nginx не пробовал несколько серверов, если вы обнаружите, что в журнале две строки, он сделал .