Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Переоткрытие лог-ф айлов (баг)
On Mon, May 19, 2008 at 08:52:24PM +1100, Konstantin G. wrote:
> Igor Sysoev пишет:
> > On Mon, May 19, 2008 at 04:51:50PM +1100, Konstantin G. wrote:
> >
> >> Igor Sysoev пишет:
> >>> On Sat, May 17, 2008 at 07:45:18PM +1100, Konstantin G. wrote:
> >>>
> >>>> $ kill -USR1 31539
> >>>> 2008/05/17 19:33:23 [notice] 31539#0: signal 10 (SIGUSR1) received,
> >>>> reopening logs
> >>>> 2008/05/17 19:33:23 [notice] 31539#0: reopening logs
> >>>> 2008/05/17 19:33:23 [notice] 30815#0: reopening logs
> >>>>
> >>>> Второй воркер логи не переоткрыл.
> >>> А можно собрать nginx с отладочным логом и прислать его в районе USR1 ?
> >> На этот раз оба воркера не переоткрыли логи (см. вложение).
> >
> > А если попробовать прилагаемый патч ?
> >
>
> А этот патч для какой версии? У меня 0.5.35
> Могу поставить 0.5.36 если надо, только ветку 0.6.x
> пока не хотелось бы...
>
> $ patch -p0 -i patch.channel
> patching file src/os/unix/ngx_process_cycle.c
> Hunk #1 FAILED at 1054.
> 1 out of 1 hunk FAILED -- saving rejects to file
> src/os/unix/ngx_process_cycle.c.rej
>
>
> PS. Похоже, что и на HUP он у меня не всегда конфигурацию обновляет. По
> крайней мере когда я изменил error_log на notice, в лог продолжали
> сыпаться debug'и (пока снова не послал HUP). Прислать кусок лога?
>
> И ещё такой симптом - когда я только настраивал nginx, то делал 5
> рабочих процессов. При перечитке конфига по HUP, один из старых воркеров
> иногда оставался висеть и продолжал обрабатывать соединения (судя по
> тому, что изменения в конфиге не отражались на поведении сервера).
> Лечилось повторным SIGHUP. Тогда я списал это на кривые руки, а при
> уменьшении воркеров до 2 - глюк исчез.
Вот патч для 0.5.36.
--
Игорь Сысоев
http://sysoev.ru
Index: src/os/unix/ngx_process_cycle.c
===================================================================
--- src/os/unix/ngx_process_cycle.c (revision 1317)
+++ src/os/unix/ngx_process_cycle.c (working copy)
@@ -1055,65 +1055,69 @@
ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler");
- n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log);
+ for ( ;; ) {
- ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n);
+ n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log);
- if (n == NGX_ERROR) {
- ngx_close_connection(c);
- return;
- }
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n);
- if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {
- if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {
+ if (n == NGX_ERROR) {
+ ngx_close_connection(c);
return;
}
- }
- if (n == NGX_AGAIN) {
- return;
- }
+ if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {
+ if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {
+ return;
+ }
+ }
- ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,
- "channel command: %d", ch.command);
+ if (n == NGX_AGAIN) {
+ return;
+ }
- switch (ch.command) {
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,
+ "channel command: %d", ch.command);
- case NGX_CMD_QUIT:
- ngx_quit = 1;
- break;
+ switch (ch.command) {
- case NGX_CMD_TERMINATE:
- ngx_terminate = 1;
- break;
+ case NGX_CMD_QUIT:
+ ngx_quit = 1;
+ break;
- case NGX_CMD_REOPEN:
- ngx_reopen = 1;
- break;
+ case NGX_CMD_TERMINATE:
+ ngx_terminate = 1;
+ break;
- case NGX_CMD_OPEN_CHANNEL:
+ case NGX_CMD_REOPEN:
+ ngx_reopen = 1;
+ break;
- ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,
- "get channel s:%i pid:%P fd:%d", ch.slot, ch.pid,
ch.fd);
+ case NGX_CMD_OPEN_CHANNEL:
- ngx_processes[ch.slot].pid = ch.pid;
- ngx_processes[ch.slot].channel[0] = ch.fd;
- break;
+ ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,
+ "get channel s:%i pid:%P fd:%d",
+ ch.slot, ch.pid, ch.fd);
- case NGX_CMD_CLOSE_CHANNEL:
+ ngx_processes[ch.slot].pid = ch.pid;
+ ngx_processes[ch.slot].channel[0] = ch.fd;
+ break;
- ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,
- "close channel s:%i pid:%P our:%P fd:%d",
- ch.slot, ch.pid, ngx_processes[ch.slot].pid,
- ngx_processes[ch.slot].channel[0]);
+ case NGX_CMD_CLOSE_CHANNEL:
- if (close(ngx_processes[ch.slot].channel[0]) == -1) {
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
- "close() channel failed");
+ ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,
+ "close channel s:%i pid:%P our:%P fd:%d",
+ ch.slot, ch.pid, ngx_processes[ch.slot].pid,
+ ngx_processes[ch.slot].channel[0]);
+
+ if (close(ngx_processes[ch.slot].channel[0]) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
+ "close() channel failed");
+ }
+
+ ngx_processes[ch.slot].channel[0] = -1;
+ break;
}
-
- ngx_processes[ch.slot].channel[0] = -1;
- break;
}
}
|