# конспект · шаг 5 из 5
Конспект: отказы, backup, keepalive
Что происходит, когда бэкенд падает, и как выложить обновление без простоя.
Пассивные проверки
upstream app {
server app-1:8000 max_fails=3 fail_timeout=15s;
server app-2:8000;
}
max_fails неудач за fail_timeout - и сервер считается недоступным на тот же
fail_timeout. Активных проверок (health checks) в открытой сборке нет: nginx
узнаёт о проблеме, только пробуя отправить запрос.
Что считается неудачей
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 2;
proxy_next_upstream_timeout 10s;
По умолчанию - error и timeout. Коды 5xx засчитываются, только если их
перечислить явно.
Вывод сервера и резерв
upstream app {
server app-1:8000 down; # выведен на обслуживание осознанно
server app-2:8000;
server maintenance:8080 backup; # включится, только если остальные легли
}
Keepalive к бэкенду
upstream app {
server app-1:8000;
keepalive 32; # с 1.29.7 включён по умолчанию
}
Замер портов на приёмной стороне, шесть запросов: у литерального адреса в
proxy_pass - шесть разных соединений, у того же адреса внутри upstream -
одно. Keepalive работает только в группе.
Имена бэкендов и DNS
upstream app {
zone app 64k; # без неё конфиг не соберётся
resolver 127.0.0.11 valid=5s; # именно ВНУТРИ группы
server a1:8000 resolve;
}
Обычная запись резолвит имя при загрузке конфига - на старте и на каждом
reload, - и больше никогда. Пересоздал контейнер: до перезагрузки трафик идёт
на старый адрес (замер: 502 без reload, 200 после). С resolve группа
перечитывает имя по TTL сама; в открытой версии это работает с ветки 1.27.
Ловушки джокера
non_idempotentбездумно. Разрешает повторять POST на другом сервере: первый бэкенд успел провести платёж и умер до ответа - повтор проведёт его второй раз. Безопасно только при идемпотентности по ключу операции.- Без
zoneсчётчики отказов у каждого воркера свои. Замер: четыре процесса открыли одно и то же падение четырьмя отдельными неудачными запросами; соzoneстрока в логе одна. http_502вproxy_next_upstreamвыключает группу. Бэкенд, штатно отвечающий 502, будет помечен мёртвым - иno live upstreamsпридёт даже на те запросы, которые работали.- Имя группы вместо адреса в
$upstream_addr- это и естьno live upstreams. Единственный сервер группы nginx мёртвым не считает никогда. - Мёртвый контейнер блокирует reload и старт всего nginx:
host not found in upstream. Правка соседнего сайта не применится, пока имя не резолвится. - Выкладка без
down. Порядок: пометитьdown→reload→ обновить → дождаться/health→ вернуть →reload. Приstickyвместоdownберутdrain. least_timeоткрыт для всех с 1.31.0, аslow_startв открытой версии нет вовсе.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий