# конспект · шаг 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
(зона создаётся заново).
Старые воркеры, которые не уходят
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- логи пишутся в переименованный файл.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий