diff src/http/ngx_http.c @ 7478:4f9b72a229c1

Multiple addresses in "listen". Previously only one address was used by the listen directive handler even if host name resolved to multiple addresses. Now a separate listening socket is created for each address.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 15 Mar 2019 15:45:56 +0300
parents e7b2b907c0f8
children 7e0719fb528b 7999d3fbb765
line wrap: on
line diff
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -1157,7 +1157,7 @@ ngx_http_add_listen(ngx_conf_t *cf, ngx_
         }
     }
 
-    sa = &lsopt->sockaddr.sockaddr;
+    sa = lsopt->sockaddr;
     p = ngx_inet_get_port(sa);
 
     port = cmcf->ports->elts;
@@ -1209,8 +1209,8 @@ ngx_http_add_addresses(ngx_conf_t *cf, n
 
     for (i = 0; i < port->addrs.nelts; i++) {
 
-        if (ngx_cmp_sockaddr(&lsopt->sockaddr.sockaddr, lsopt->socklen,
-                             &addr[i].opt.sockaddr.sockaddr,
+        if (ngx_cmp_sockaddr(lsopt->sockaddr, lsopt->socklen,
+                             addr[i].opt.sockaddr,
                              addr[i].opt.socklen, 0)
             != NGX_OK)
         {
@@ -1239,7 +1239,8 @@ ngx_http_add_addresses(ngx_conf_t *cf, n
 
             if (addr[i].opt.set) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                        "duplicate listen options for %s", addr[i].opt.addr);
+                                   "duplicate listen options for %V",
+                                   &addr[i].opt.addr_text);
                 return NGX_ERROR;
             }
 
@@ -1252,7 +1253,8 @@ ngx_http_add_addresses(ngx_conf_t *cf, n
 
             if (default_server) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                        "a duplicate default server for %s", addr[i].opt.addr);
+                                   "a duplicate default server for %V",
+                                   &addr[i].opt.addr_text);
                 return NGX_ERROR;
             }
 
@@ -1305,8 +1307,8 @@ ngx_http_add_address(ngx_conf_t *cf, ngx
     if (lsopt->http2 && lsopt->ssl) {
         ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
                            "nginx was built with OpenSSL that lacks ALPN "
-                           "and NPN support, HTTP/2 is not enabled for %s",
-                           lsopt->addr);
+                           "and NPN support, HTTP/2 is not enabled for %V",
+                           &lsopt->addr_text);
     }
 
 #endif
@@ -1354,7 +1356,8 @@ ngx_http_add_server(ngx_conf_t *cf, ngx_
         for (i = 0; i < addr->servers.nelts; i++) {
             if (server[i] == cscf) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                                   "a duplicate listen %s", addr->opt.addr);
+                                   "a duplicate listen %V",
+                                   &addr->opt.addr_text);
                 return NGX_ERROR;
             }
         }
@@ -1471,15 +1474,15 @@ ngx_http_server_names(ngx_conf_t *cf, ng
 
             if (rc == NGX_DECLINED) {
                 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
-                              "invalid server name or wildcard \"%V\" on %s",
-                              &name[n].name, addr->opt.addr);
+                              "invalid server name or wildcard \"%V\" on %V",
+                              &name[n].name, &addr->opt.addr_text);
                 return NGX_ERROR;
             }
 
             if (rc == NGX_BUSY) {
                 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
-                              "conflicting server name \"%V\" on %s, ignored",
-                              &name[n].name, addr->opt.addr);
+                              "conflicting server name \"%V\" on %V, ignored",
+                              &name[n].name, &addr->opt.addr_text);
             }
         }
     }
@@ -1700,8 +1703,7 @@ ngx_http_add_listening(ngx_conf_t *cf, n
     ngx_http_core_loc_conf_t  *clcf;
     ngx_http_core_srv_conf_t  *cscf;
 
-    ls = ngx_create_listening(cf, &addr->opt.sockaddr.sockaddr,
-                              addr->opt.socklen);
+    ls = ngx_create_listening(cf, addr->opt.sockaddr, addr->opt.socklen);
     if (ls == NULL) {
         return NULL;
     }
@@ -1791,7 +1793,7 @@ ngx_http_add_addrs(ngx_conf_t *cf, ngx_h
 
     for (i = 0; i < hport->naddrs; i++) {
 
-        sin = &addr[i].opt.sockaddr.sockaddr_in;
+        sin = (struct sockaddr_in *) addr[i].opt.sockaddr;
         addrs[i].addr = sin->sin_addr.s_addr;
         addrs[i].conf.default_server = addr[i].default_server;
 #if (NGX_HTTP_SSL)
@@ -1856,7 +1858,7 @@ ngx_http_add_addrs6(ngx_conf_t *cf, ngx_
 
     for (i = 0; i < hport->naddrs; i++) {
 
-        sin6 = &addr[i].opt.sockaddr.sockaddr_in6;
+        sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr;
         addrs6[i].addr6 = sin6->sin6_addr;
         addrs6[i].conf.default_server = addr[i].default_server;
 #if (NGX_HTTP_SSL)