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