Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/ru/docs/control.xml
1 views
1
<!--
2
Copyright (C) Igor Sysoev
3
Copyright (C) Nginx, Inc.
4
-->
5
6
<!DOCTYPE article SYSTEM "../../../dtd/article.dtd">
7
8
<article name="Управление nginx"
9
link="/ru/docs/control.html"
10
lang="ru"
11
rev="7">
12
13
<section>
14
15
<para>
16
Управлять nginx можно с помощью сигналов. Номер главного процесса по умолчанию
17
записывается в файл <path>/usr/local/nginx/logs/nginx.pid</path>.
18
Изменить имя этого файла можно при конфигурации сборки или же в
19
<path>nginx.conf</path> директивой
20
<link doc="ngx_core_module.xml" id="pid"/>.
21
Главный процесс поддерживает следующие сигналы:
22
<note>
23
<table>
24
25
<tr><td width="20%">TERM, INT</td><td>быстрое завершение</td></tr>
26
<tr><td width="20%">QUIT</td><td>плавное завершение</td></tr>
27
<tr><td width="20%">HUP</td><td>изменение конфигурации,
28
обновление изменившейся временной зоны (только для FreeBSD и Linux),
29
запуск новых рабочих процессов с новой конфигурацией,
30
плавное завершение старых рабочих процессов</td></tr>
31
<tr><td width="20%">USR1</td><td>переоткрытие лог-файлов</td></tr>
32
<tr><td width="20%">USR2</td><td>обновление исполняемого файла</td></tr>
33
<tr><td width="20%">WINCH</td><td>плавное завершение рабочих процессов</td></tr>
34
35
</table>
36
</note>
37
</para>
38
39
<para>
40
Управлять рабочими процессами по отдельности не нужно.
41
Тем не менее, они тоже поддерживают некоторые сигналы:
42
<note>
43
<table>
44
45
<tr><td width="20%">TERM, INT</td><td>быстрое завершение</td></tr>
46
<tr><td width="20%">QUIT</td><td>плавное завершение</td></tr>
47
<tr><td width="20%">USR1</td><td>переоткрытие лог-файлов</td></tr>
48
<tr><td width="20%">WINCH</td><td>аварийное завершение для отладки
49
(требует включения <link doc="ngx_core_module.xml" id="debug_points"/>)
50
</td></tr>
51
52
</table>
53
</note>
54
</para>
55
56
</section>
57
58
59
<section id="reconfiguration" name="Изменение конфигурации">
60
61
<para>
62
Для того чтобы nginx перечитал файл конфигурации, нужно послать
63
главному процессу сигнал HUP. Главный процесс сначала проверяет
64
синтаксическую правильность конфигурации, а затем пытается применить
65
новую конфигурацию, то есть, открыть лог-файлы и новые listen сокеты.
66
Если ему это не удаётся, то он откатывает изменения и продолжает работать
67
со старой конфигурацией.
68
Если же удаётся, то он запускает новые рабочие процессы, а старым
69
шлёт сообщение о плавном выходе. Старые рабочие процессы закрывают listen
70
сокеты и продолжают обслуживать старых клиентов. После обслуживания всех
71
клиентов старые рабочие процессы завершаются.
72
</para>
73
74
<para>
75
Предположим, на FreeBSD команда
76
<programlisting>
77
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
78
</programlisting>
79
показывает примерно такую картину:
80
<programlisting>
81
PID PPID USER %CPU VSZ WCHAN COMMAND
82
33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
83
33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
84
33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
85
33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
86
</programlisting>
87
</para>
88
89
<para>
90
Если послать сигнал HUP главному процессу, то картина может быть такой:
91
<programlisting>
92
PID PPID USER %CPU VSZ WCHAN COMMAND
93
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
94
33129 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
95
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
96
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
97
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
98
</programlisting>
99
</para>
100
101
<para>
102
Один старый рабочий процесс 33129 всё ещё продолжает работать. По истечении
103
некоторого времени он завершается:
104
<programlisting>
105
PID PPID USER %CPU VSZ WCHAN COMMAND
106
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
107
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
108
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
109
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
110
</programlisting>
111
</para>
112
113
</section>
114
115
116
<section id="logs" name="Ротация лог-файлов">
117
118
<para>
119
Лог-файлы нужно переименовать, а затем послать сигнал USR1 главному процессу.
120
Он откроет заново все текущие открытые файлы и назначит им
121
в качестве владельца непривилегированного пользователя, под которым
122
работают рабочие процессы. После успешного открытия главный процесс
123
закрывает все открытые файлы и посылает сообщение о переоткрытии файлов
124
рабочим процессам.
125
Они также открывают новые файлы и сразу же закрывают старые.
126
В результате старые файлы практически сразу же готовы для дальнейшей
127
обработки, например, их можно сжимать.
128
</para>
129
130
</section>
131
132
133
<section id="upgrade" name="Обновление исполняемого файла на лету">
134
135
<para>
136
Для обновления исполняемого файла сервера вначале нужно записать
137
на место старого файла новый.
138
Затем нужно послать сигнал USR2 главному процессу&mdash;он
139
переименует свой файл с номером процесса в файл
140
с суффиксом <path>.oldbin</path>, например,
141
<path>/usr/local/nginx/logs/nginx.pid.oldbin</path>,
142
после чего запустит новый исполняемый файл, а тот в свою
143
очередь&mdash;свои рабочие процессы:
144
<programlisting>
145
PID PPID USER %CPU VSZ WCHAN COMMAND
146
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
147
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
148
33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
149
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
150
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
151
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
152
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
153
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
154
</programlisting>
155
</para>
156
157
<!--
158
159
<para>
160
Процесс с новым исполняемым файлом 36264 создаёт свой файл с номером процесса
161
с суффиксом <path>.newbin</path>, например,
162
<path>/usr/local/nginx/logs/nginx.pid.newbin</path>.
163
</para>
164
165
-->
166
167
<para>
168
Теперь все рабочие процессы наравне принимают запросы.
169
Если послать сигнал WINCH первому главному процессу, то он пошлёт своим
170
рабочим процессам сообщение о плавном выходе, и они будут постепенно выходить:
171
<programlisting>
172
PID PPID USER %CPU VSZ WCHAN COMMAND
173
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
174
33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
175
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
176
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
177
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
178
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
179
</programlisting>
180
</para>
181
182
<para>
183
По истечении времени запросы будут обрабатывать только новые рабочие процессы:
184
<programlisting>
185
PID PPID USER %CPU VSZ WCHAN COMMAND
186
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
187
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
188
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
189
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
190
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
191
</programlisting>
192
</para>
193
194
<para>
195
Нужно заметить, что старый процесс не закрывает свои listen сокеты и при
196
необходимости ему можно сказать, чтобы он снова запустил свои рабочие процессы.
197
Если работа нового исполняемого файла по каким-то причинам не устраивает,
198
можно проделать одно из следующих действий:
199
<list type="bullet">
200
201
<listitem>
202
<para>
203
Послать старому главному процессу сигнал HUP.
204
Старый главный процесс, не перечитывая конфигурации,
205
запустит новые рабочие процессы.
206
После этого можно плавно завершить все новые процессы,
207
послав новому главному процессу сигнал QUIT.
208
</para>
209
</listitem>
210
211
<listitem>
212
<para>
213
Послать новому главному процессу сигнал TERM.
214
В ответ на это он пошлёт сообщение о немедленном выходе своим
215
рабочим процессам, и все они практически сразу же завершатся.
216
(Если новые процессы по каким-то причинам не завершаются,
217
нужно послать им сигнал KILL, который заставит их завершиться.)
218
По завершению нового главного процесса старый главный процесс
219
автоматически запустит новые рабочие процессы.
220
</para>
221
</listitem>
222
223
</list>
224
225
</para>
226
227
<para>
228
Если новый главный процесс выходит, то старый главный процесс убирает
229
суффикс <path>.oldbin</path> из имени файла с номером процесса.
230
</para>
231
232
<para>
233
Если же обновление прошло удачно, то старому процессу нужно послать сигнал
234
QUIT, и останутся только новые процессы:
235
<programlisting>
236
PID PPID USER %CPU VSZ WCHAN COMMAND
237
36264 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
238
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
239
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
240
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
241
</programlisting>
242
</para>
243
244
<!--
245
246
<para>
247
После этого остаётся только переименовать
248
<path>/usr/local/nginx/logs/nginx.pid.newbin</path> в
249
<path>/usr/local/nginx/logs/nginx.pid</path> и обновление можно считать
250
завершённым.
251
</para>
252
253
-->
254
255
</section>
256
257
</article>
258
259