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

может ли nginx повторить запрос, если единорог перегружен и возвращает 502?

Возможно ли, чтобы 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 не пробовал несколько серверов, если вы обнаружите, что в журнале две строки, он сделал .