Здесь — как nginx делит запросы между копиями и где видно, какая копия ответила.
Копии приложения nginx собирает в группу — блок upstream. В proxy_pass вместо адреса одной копии стоит имя группы:
Каждая строка server — одна копия, бэкенд. Запросы nginx раздаёт по кругу: первый — 8081, второй — 8082, третий — снова 8081. Поэтому больная копия из двух портит каждый второй ответ.
Какая копия ответила, nginx знает: адрес копии лежит в переменной $upstream_addr, её код — в $upstream_status. На этом сервере они записаны в журнал /var/log/nginx/lb-access.log (поля upstream= и ustatus=) и в заголовок ответа X-Upstream.
В upstream три копии — 8081, 8082 и 8083, больна 8083: отвечает 500. Какие из шести запросов подряд получат 500?
-
Круг теперь из трёх копий: на больную приходится каждый третий запрос.
-
Первый запрос получает первая строка
server— 8081. 8083 стоит третьей: её запросы — третий и шестой. -
Второй запрос уходит к здоровой 8082. По кругу 8083 достаются третий и шестой.
nginx раздаёт запросы по кругу в порядке строк server: 8081, 8082, 8083, снова 8081. На третью копию приходятся третий и шестой запросы. Проверить — поле upstream= в tail -n 6 /var/log/nginx/lb-access.log.
Главное в шаге
-
Блок
upstreamсобирает копии приложения под одним именем,proxy_passотправляет запросы этому имени. - Копии получают запросы по кругу: одна больная копия из двух портит каждый второй ответ.
-
Кто ответил — в
$upstream_addrи$upstream_status: по журналу балансировщика видно, какая копия больна.