nginx-0.8.39
Maxim Dounin
mdounin на mdounin.ru
Ср Июн 2 21:49:34 MSD 2010
Hello!
On Tue, Jun 01, 2010 at 06:44:35PM -0700, Konstantin Svist wrote:
[...]
> проблема:
> * запрашиваем curl localhost:4321 - работает
> * редактируем конфиг - убираем listen unix:/tmp/nginx.sock, делаем SIGUSR1
> * запрашиваем curl localhost:4321 - не работает (правильно)
> * смотрим на /tmp/nginx.sock - всё ещё существует (не правильно)
> * редактируем конфиг - добавляем обратно listen unix:/tmp/nginx.sock,
> делаем SIGUSR1
> * запрашиваем curl localhost:4321 - не работает (не правильно)
Вероятно, всё-таки имелся ввиду HUP, ибо USR1 - это переоткрытие
логфайлов, никаких действий с сокетами по нему не делается. Патч
прилагается.
Есть ещё проблема при binary upgrade совмещённом с аналогичным
изменением конфига. Но тут ничего не сделаешь, ибо старый мастер
не знает ничего о новом конфиге (и не может знать, это вообще
может быть конфиг несовместимого формата), а новый - не знает
ничего о старом мастере (а тот ещё может работать неопределённое
время и вообще обратно стать единственным). Workaround - не
делайте так (c). Ну или чистить руками.
Maxim Dounin
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1275500761 -14400
# Node ID bba765034a82f4206188c2d57f82957187c796f1
# Parent 6ad548c0b830b13e9940f6ec81060843898c13a8
Fix reconfigure with unix sockets.
1. Delete unix sockets no longer used.
2. Correctly compare unix sockets.
See here for details:
http://nginx.org/pipermail/nginx-ru/2010-June/034560.html
http://nginx.org/pipermail/nginx-ru/2010-June/034581.html
Reported by: Konstantin Svist, Alex Vorona
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -666,6 +666,23 @@ old_shm_zone_done:
ngx_close_socket_n " listening socket on %V failed",
&ls[i].addr_text);
}
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+
+ if (ls[i].sockaddr->sa_family == AF_UNIX) {
+ u_char *name = ls[i].addr_text.data + sizeof("unix:") - 1;
+
+ ngx_log_error(NGX_LOG_WARN, cycle->log, 0,
+ "closing listening socket %s", name);
+
+ if (ngx_delete_file(name) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
+ ngx_delete_file_n " %s failed", name);
+ }
+ }
+
+#endif
+
}
@@ -835,6 +852,9 @@ ngx_cmp_sockaddr(struct sockaddr *sa1, s
#if (NGX_HAVE_INET6)
struct sockaddr_in6 *sin61, *sin62;
#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+ struct sockaddr_un *saun1, *saun2;
+#endif
if (sa1->sa_family != sa2->sa_family) {
return NGX_DECLINED;
@@ -858,6 +878,20 @@ ngx_cmp_sockaddr(struct sockaddr *sa1, s
break;
#endif
+#if (NGX_HAVE_UNIX_DOMAIN)
+ case AF_UNIX:
+ saun1 = (struct sockaddr_un *) sa1;
+ saun2 = (struct sockaddr_un *) sa2;
+
+ if (ngx_memcmp(&saun1->sun_path, &saun2->sun_path,
+ sizeof(saun1->sun_path)) != 0)
+ {
+ return NGX_DECLINED;
+ }
+
+ break;
+#endif
+
default: /* AF_INET */
sin1 = (struct sockaddr_in *) sa1;
Подробная информация о списке рассылки nginx-ru