Управление nginx
nginx можно управлять с помощью сигналов. Идентификатор процесса главного процесса по умолчанию записывается в файл /usr/local/nginx/logs/nginx.pid. Это имя может быть изменено во время конфигурации или в nginx.conf с помощью директивы pid. Главный процесс поддерживает следующие сигналы:
| TERM, INT | быстрое завершение |
| QUIT | плавное завершение |
| HUP | изменение конфигурации, привязка к изменённой временной зоне (только для FreeBSD и Linux), запуск новых рабочих процессов с новой конфигурацией, плавное завершение старых рабочих процессов |
| USR1 | переоткрытие лог-файлов |
| USR2 | обновление файла исполняемого кода |
| WINCH | плавное завершение рабочих процессов |
Отдельными рабочими процессами также можно управлять с помощью сигналов, хотя это необязательно. Поддерживаемые сигналы:
| TERM, INT | быстрое завершение |
| QUIT | плавное завершение |
| USR1 | переоткрытие лог-файлов |
| WINCH | аварийное завершение для отладки (требует включения debug_points) |
Изменение конфигурации
Для того чтобы nginx перечитал файл конфигурации, необходимо отправить сигнал HUP главному процессу. Главный процесс сначала проверяет синтаксическую корректность, затем пытается применить новую конфигурацию, то есть открыть лог-файлы и новые сокеты прослушивания. Если это не удаётся, он откатывает изменения и продолжает работу со старой конфигурацией. Если это удаётся, он запускает новые рабочие процессы и отправляет сообщения старым рабочим процессам с запросом о плавном завершении. Старые рабочие процессы закрывают сокеты прослушивания и продолжают обслуживание старых клиентов. После обслуживания всех клиентов старые рабочие процессы завершаются.
Проиллюстрируем это на примере. Представьте, что nginx запущен на FreeBSD и команда
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
выводит следующий результат:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx) 33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx) 33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
Если отправить сигнал HUP главному процессу, вывод станет следующим:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 33129 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx) 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
Один из старых рабочих процессов с PID 33129 по-прежнему продолжает работу. Через некоторое время он завершается:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
Вращение лог-файлов
Для вращения лог-файлов их сначала необходимо переименовать. После этого нужно отправить сигнал USR1 главному процессу. Главный процесс затем повторно откроет все текущие открытые лог-файлы и назначит их непривилегированному пользователю, под которым работают рабочие процессы, как владельца. После успешного переоткрытия главный процесс закрывает все открытые файлы и отправляет сообщение рабочим процессам с просьбой переоткрытия файлов. Рабочие процессы также открывают новые файлы и сразу закрывают старые. В результате старые файлы почти сразу доступны для последующей обработки, например, сжатия.
Обновление исполняемого файла в динамическом режиме
Для обновления исполняемого файла сервера сначала необходимо поместить новый исполняемый файл вместо старого. После этого нужно отправить сигнал USR2 главному процессу. Главный процесс сначала переименовывает свой файл с идентификатором процесса в новый файл с добавленным суффиксом .oldbin, например, /usr/local/nginx/logs/nginx.pid.oldbin, затем запускает новый исполняемый файл, который в свою очередь запускает новые рабочие процессы:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx) 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
После этого все рабочие процессы (старые и новые) продолжают принимать запросы. Если отправить сигнал WINCH первому главному процессу, он отправит сообщения своим рабочим процессам с просьбой о плавном завершении, и они начнут завершаться:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx) 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
Через некоторое время только новые рабочие процессы будут обрабатывать запросы:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
Следует отметить, что старый главный процесс не закрывает свои сокеты прослушивания, и его можно управлять, чтобы запустить его рабочие процессы снова при необходимости. Если по какой-либо причине новый исполняемый файл работает неприемлемо, можно сделать следующее:
-
Отправить сигнал HUP старому главному процессу. Старый главный процесс запустит новые рабочие процессы без повторного чтения конфигурации. После этого все новые процессы можно плавно завершить, отправив сигнал QUIT новому главному процессу.
-
Отправить сигнал TERM новому главному процессу. Он затем отправит сообщение своим рабочим процессам с просьбой об немедленном завершении, и они все завершатся практически мгновенно. (Если новые процессы по какой-либо причине не завершаются, необходимо отправить им сигнал KILL, чтобы принудительно завершить их). Когда новый главный процесс завершится, старый главный процесс автоматически запустит новые рабочие процессы.
Если новый главный процесс завершается, старый главный процесс удаляет суффикс .oldbin из имени файла с идентификатором процесса.
Если обновление прошло успешно, необходимо отправить сигнал QUIT старому главному процессу, и останутся только новые процессы:
PID PPID USER %CPU VSZ WCHAN COMMAND 36264 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
© 2002-2021 Igor Sysoev
© 2011-2024 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/control.html