1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# конспект · шаг 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. Порядок: пометить downreload → обновить → дождаться /health → вернуть → reload. При sticky вместо down берут drain.
  • least_time открыт для всех с 1.31.0, а slow_start в открытой версии нет вовсе.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.