comparison xml/ru/docs/control.xml @ 76:4a4caa566120

Russian documentation import. Changes in module.dtd: <example> now allowed to contain <value> and <emphasis> elements (we need this to show important parts in examples), less strict checking of <directive> syntax (we don't want to fully document some directives, notably deprecated ones). Known issues: 1. <syntax> elements are preserved as is, they will require manual conversion (likely to some not-yet-existed format a la DocBook cmdsynopsis, as currently used one seems to be incomplete); 2. <value> no longer corresponds to replaceable content, and it's use in examples isn't correct; 3. <link doc="document#fragment"> doesn't work with current xslt, either should be supported or changed to <link doc="document" id="fragment">. The following files are intentionally omitted: maillists.xml (support.xml should be used instead), experimental.xml (obsolete), faq.xml (conflicts with existing one, needs discussion). Not yet linked to site.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 11 Oct 2011 12:57:50 +0000
parents
children 0a45870d0160
comparison
equal deleted inserted replaced
75:2bf4cd2787c5 76:4a4caa566120
1 <!DOCTYPE article SYSTEM "../../../dtd/article.dtd">
2
3 <article title="Управление nginx"
4 link="/ru/docs/control.html"
5 lang="ru">
6
7 <section>
8
9 <para>
10 Управлять nginx можно с помощью сигналов. Номер главного процесса по умолчанию
11 записывается в файл <command>/usr/local/nginx/logs/nginx.pid</command>.
12 Изменить имя этого файла можно при конфигурации сборки или же в
13 <command>nginx.conf</command> директивой
14 <link doc="ngx_core_module.xml#pid">pid</link>.
15 Главный процесс поддерживает следующие сигналы:
16 <note>
17 <table>
18
19 <tr><td width="20%">TERM, INT</td><td>быстрое завершение</td></tr>
20 <tr><td width="20%">QUIT</td><td>плавное завершение</td></tr>
21 <tr><td width="20%">HUP</td><td>изменение конфигурации,
22 обновление изменившейся временной зоны (только для FreeBSD и Linux),
23 запуск новых рабочих процессов с новой конфигурацией,
24 плавное завершение старых рабочих процессов</td></tr>
25 <tr><td width="20%">USR1</td><td>переоткрытие лог-файлов</td></tr>
26 <tr><td width="20%">USR2</td><td>обновление исполняемого файла</td></tr>
27 <tr><td width="20%">WINCH</td><td>плавное завершение рабочих процессов</td></tr>
28
29 </table>
30 </note>
31 </para>
32
33 <para>
34 Управлять рабочими процессами по отдельности не нужно.
35 Тем не менее, они тоже поддерживают некоторые сигналы:
36 <note>
37 <table>
38
39 <tr><td width="20%">TERM, INT</td><td>быстрое завершение</td></tr>
40 <tr><td width="20%">QUIT</td><td>плавное завершение</td></tr>
41 <tr><td width="20%">USR1</td><td>переоткрытие лог-файлов</td></tr>
42
43 </table>
44 </note>
45 </para>
46
47 </section>
48
49
50 <section name="Изменение конфигурации" id="reconfiguration">
51
52 <para>
53 Для того, чтобы nginx перечитал файл конфигурации, нужно послать
54 главному процессу сигнал HUP. Главный процесс сначала проверяет
55 синтаксическую правильность конфигурации, а затем пытается применить
56 новую конфигурацию, то есть, открыть лог-файлы и новые listen сокеты.
57 Если ему это не удаётся, то он откатывает изменения и продолжает работать
58 со старой конфигурацией.
59 Если же удаётся, то он запускает новые рабочие процессы, а старым
60 шлёт сообщение о плавном выходе. Старые рабочие процессы закрывают listen
61 сокеты и продолжают обслуживать старых клиентов. После обслуживания всех
62 клиентов старые рабочие процессы завершаются.
63 </para>
64
65 <para>
66 Предположим, на FreeBSD 4.x команда
67 <programlisting>
68 ps ax -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
69 </programlisting>
70 показывает примерно такую картину:
71 <programlisting>
72 PID PPID USER %CPU VSZ WCHAN COMMAND
73 33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sb
74 33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
75 33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
76 33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
77 </programlisting>
78 </para>
79
80 <para>
81 Если послать сигнал HUP главному процессу, то картина может быть такой:
82 <programlisting>
83 PID PPID USER %CPU VSZ WCHAN COMMAND
84 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sb
85 33129 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (n
86 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
87 33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
88 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
89 </programlisting>
90 </para>
91
92 <para>
93 Один старый рабочий процесс 33129 всё ещё продолжает работать. По истечении
94 некоторого времени он завершается:
95 <programlisting>
96 PID PPID USER %CPU VSZ WCHAN COMMAND
97 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sb
98 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
99 33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
100 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
101 </programlisting>
102 </para>
103
104 </section>
105
106
107 <section name="Ротация лог-файлов" id="logs">
108
109 <para>
110 Лог-файлы нужно переименовать, а затем послать сигнал USR1 главному процессу.
111 Он откроет заново все текущие открытые файлы и назначит им
112 в качестве владельца непривилегированного пользователя, под которым
113 работают рабочие процессы. После успешного открытия главный процесс
114 закрывает все открытые файлы и посылает сообщение о переоткрытии файлов
115 рабочим процессам.
116 Они также открывают новые файлы и сразу же закрывают старые.
117 В результате старые файлы практически сразу же готовы для дальнейшей
118 обработки, например, их можно сжимать.
119 </para>
120
121 </section>
122
123
124 <section name="Обновление сервера на лету" id="upgrade">
125
126 <para>
127 Для обновления сервера нужно записать на место старого исполняемого файла новый.
128 Затем нужно послать сигнал USR2 главному процессу&mdash;он
129 переименует свой файл с номером процесса в файл
130 с суффиксом <command>.oldbin</command>, например,
131 <command>/usr/local/nginx/logs/nginx.pid.oldbin</command>,
132 после чего запустит новый исполняемый файл, а тот в свою
133 очередь&mdash;свои рабочие процессы:
134 <programlisting>
135 PID PPID USER %CPU VSZ WCHAN COMMAND
136 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sb
137 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
138 33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
139 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
140 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sb
141 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
142 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
143 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
144 </programlisting>
145 </para>
146
147 <!--
148
149 <para>
150 Процесс с новым исполняемым файлом 36264 создаёт свой файл с номером процесса
151 с суффиксом <command>.newbin</command>, например,
152 <command>/usr/local/nginx/logs/nginx.pid.newbin</command>.
153 </para>
154
155 -->
156
157 <para>
158 Теперь все рабочие процессы наравне принимают запросы.
159 Если послать сигнал WINCH первому главному процессу, то он пошлёт своим
160 рабочим процессам сообщение о плавном выходе, и они будут постепенно выходить:
161 <programlisting>
162 PID PPID USER %CPU VSZ WCHAN COMMAND
163 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sb
164 33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (n
165 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sb
166 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
167 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
168 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
169 </programlisting>
170 </para>
171
172 <para>
173 <note>
174 При использовании метода rtsig новые процессы могут не принимать соединения
175 даже после того, как старому главному процессу послан сигнал WINCH.
176 В этом случае новому главному процессу нужно посылать сигнал USR1 до тех пор,
177 пока новые процессы не начнут принимать соединения.
178 </note>
179 </para>
180
181 <para>
182 По истечении времени запросы будут обрабатывать только новые рабочие процессы:
183 <programlisting>
184 PID PPID USER %CPU VSZ WCHAN COMMAND
185 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sb
186 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sb
187 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
188 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
189 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
190 </programlisting>
191 </para>
192
193 <para>
194 Нужно заметить, что старый процесс не закрывает свои listen сокеты и при
195 необходимости ему можно сказать, чтобы он снова запустил свои рабочие процессы.
196 Если работа нового исполняемого файла по каким-то причинам не устраивает,
197 то можно сделать следующее:
198 <list>
199
200 <listitem>
201 <para>
202 Послать старому главному процессу сигнал HUP. Старый процесс, не перечитывая
203 конфигурации, запустит новые рабочие процессы. После этого можно
204 плавно завершить новые процессы, послав их главному процессу QUIT.
205 </para>
206 </listitem>
207
208 <listitem>
209 <para>
210 Послать новому главному процессу сигнал TERM, он пошлёт сообщение о
211 немедленном выходе рабочим процессам и все они практически сразу же завершатся.
212 По выходу нового главного процесса старый запустит новые рабочие процессы.
213 </para>
214 </listitem>
215
216 <listitem>
217 <para>
218 Если же новые процессы не завершаются, то нужно послать им сигнал KILL.
219 По выходу нового главного процесса старый запустит свои рабочие процессы.
220 </para>
221 </listitem>
222
223 </list>
224
225 </para>
226
227 <para>
228 Если новый главный процесс выходит, то старый процесс убирает
229 суффикс <command>.oldbin</command> из имени файла с номером процесса.
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/sb
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 <command>/usr/local/nginx/logs/nginx.pid.newbin</command> в
249 <command>/usr/local/nginx/logs/nginx.pid</command> и обновление можно считать
250 завершённым.
251 </para>
252
253 -->
254
255 </section>
256
257 </article>