Spec-Zone.ru › nginx

Управление 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API