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

# конспект · шаг 4 из 4

Конспект: reload и обновления

выжимка - её можно унести в заметки

Reload, обновление бинарника и что с этим делает systemd.

Что делает reload

$  команда
nginx -t && nginx -s reload      # или systemctl reload nginx

Мастер читает новый конфиг, поднимает новых воркеров, старым говорит доработать текущие запросы и уйти. Битый конфиг не применяется - работает старый.

Чего reload не делает:

  • не перерезолвит имена бэкендов САМ, между перезагрузками (на самом reload они спрашиваются заново; постоянное обновление даёт resolve у сервера группы);
  • не чистит кеш ответов и не сбрасывает счётчики лимитов;
  • не меняет user, загруженные модули и сам бинарник.

Что переживает reload, а что нет - замер на limit_req с rate=1r/m: второй запрос 503, после reload всё ещё 503, после смены размера зоны снова 200 (зона создаётся заново).

Старые воркеры, которые не уходят

↳  выводps -o args
nginx: worker process is shutting down

Замер: с живым соединением к бэкенду старый воркер на месте и через семнадцать секунд. По умолчанию ждёт бесконечно - а WebSocket не кончается.

worker_shutdown_timeout 30s;

С ней воркер уходит по таймеру, обрывая долгие соединения. Директива достаётся воркеру при старте, поэтому уже уходящих не догоняет: первый reload после правки ещё не помогает.

Ротация логов

$  команда
nginx -s reopen        # переоткрыть файлы после переименования

Замер: после mv новый файл не создаётся, строки идут в переименованный; после reopen появляется новый и запись идёт в него.

Замена бинарника без простоя

USR2   → мастер запускает новый бинарник рядом (nginx.pid.oldbin)
WINCH  → старым воркерам: доработать и уйти, мастер остаётся
QUIT   → старому мастеру: завершиться
HUP    → откат: старый мастер поднимает воркеров обратно

Замер всего цикла: два мастера после USR2, старый без воркеров после WINCH, откат возвращает один мастер - и сайт отвечал 200 на каждом шаге.

QUIT против TERM в цифрах: при QUIT клиент получил 100 байт из 100 и код curl 0, при TERM - 40 из 100 и код 18.

С systemd это плохо дружит: меняется главный PID, и юнит перестаёт понимать, кем управляет. В мире systemd обновляются перезапуском службы, а без простоя - выводом сервера из балансировки.

Ловушки джокера

  • Успешный код возврата reload ничего не доказывает. Замер: порт занят, команда вернула ноль, сайт остался на старом конфиге, правда только в логе - bind() to 0.0.0.0:9090 failed (98: Address in use). Слова системной ошибки зависят от libc (на debian - Address already in use), номер одинаков.
  • nginx -t проверяет не всё: синтаксис - да, существование файла сертификата, права и занятость порта - уже при применении.
  • USR2 без абсолютного пути не работает. Запущенный как nginx, он даёт [alert] execve() failed ... "nginx" (2: No such file or directory), и мастер не меняется. execve не ищет по PATH.
  • Ротация без reopen - логи пишутся в переименованный файл.

Комментарии

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

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

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