comparison 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
comparison
equal deleted inserted replaced
7477:c74904a17021 7478:4f9b72a229c1
1155 if (cmcf->ports == NULL) { 1155 if (cmcf->ports == NULL) {
1156 return NGX_ERROR; 1156 return NGX_ERROR;
1157 } 1157 }
1158 } 1158 }
1159 1159
1160 sa = &lsopt->sockaddr.sockaddr; 1160 sa = lsopt->sockaddr;
1161 p = ngx_inet_get_port(sa); 1161 p = ngx_inet_get_port(sa);
1162 1162
1163 port = cmcf->ports->elts; 1163 port = cmcf->ports->elts;
1164 for (i = 0; i < cmcf->ports->nelts; i++) { 1164 for (i = 0; i < cmcf->ports->nelts; i++) {
1165 1165
1207 1207
1208 addr = port->addrs.elts; 1208 addr = port->addrs.elts;
1209 1209
1210 for (i = 0; i < port->addrs.nelts; i++) { 1210 for (i = 0; i < port->addrs.nelts; i++) {
1211 1211
1212 if (ngx_cmp_sockaddr(&lsopt->sockaddr.sockaddr, lsopt->socklen, 1212 if (ngx_cmp_sockaddr(lsopt->sockaddr, lsopt->socklen,
1213 &addr[i].opt.sockaddr.sockaddr, 1213 addr[i].opt.sockaddr,
1214 addr[i].opt.socklen, 0) 1214 addr[i].opt.socklen, 0)
1215 != NGX_OK) 1215 != NGX_OK)
1216 { 1216 {
1217 continue; 1217 continue;
1218 } 1218 }
1237 1237
1238 if (lsopt->set) { 1238 if (lsopt->set) {
1239 1239
1240 if (addr[i].opt.set) { 1240 if (addr[i].opt.set) {
1241 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 1241 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1242 "duplicate listen options for %s", addr[i].opt.addr); 1242 "duplicate listen options for %V",
1243 &addr[i].opt.addr_text);
1243 return NGX_ERROR; 1244 return NGX_ERROR;
1244 } 1245 }
1245 1246
1246 addr[i].opt = *lsopt; 1247 addr[i].opt = *lsopt;
1247 } 1248 }
1250 1251
1251 if (lsopt->default_server) { 1252 if (lsopt->default_server) {
1252 1253
1253 if (default_server) { 1254 if (default_server) {
1254 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 1255 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1255 "a duplicate default server for %s", addr[i].opt.addr); 1256 "a duplicate default server for %V",
1257 &addr[i].opt.addr_text);
1256 return NGX_ERROR; 1258 return NGX_ERROR;
1257 } 1259 }
1258 1260
1259 default_server = 1; 1261 default_server = 1;
1260 addr[i].default_server = cscf; 1262 addr[i].default_server = cscf;
1303 && !defined TLSEXT_TYPE_next_proto_neg) 1305 && !defined TLSEXT_TYPE_next_proto_neg)
1304 1306
1305 if (lsopt->http2 && lsopt->ssl) { 1307 if (lsopt->http2 && lsopt->ssl) {
1306 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, 1308 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
1307 "nginx was built with OpenSSL that lacks ALPN " 1309 "nginx was built with OpenSSL that lacks ALPN "
1308 "and NPN support, HTTP/2 is not enabled for %s", 1310 "and NPN support, HTTP/2 is not enabled for %V",
1309 lsopt->addr); 1311 &lsopt->addr_text);
1310 } 1312 }
1311 1313
1312 #endif 1314 #endif
1313 1315
1314 addr = ngx_array_push(&port->addrs); 1316 addr = ngx_array_push(&port->addrs);
1352 } else { 1354 } else {
1353 server = addr->servers.elts; 1355 server = addr->servers.elts;
1354 for (i = 0; i < addr->servers.nelts; i++) { 1356 for (i = 0; i < addr->servers.nelts; i++) {
1355 if (server[i] == cscf) { 1357 if (server[i] == cscf) {
1356 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 1358 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1357 "a duplicate listen %s", addr->opt.addr); 1359 "a duplicate listen %V",
1360 &addr->opt.addr_text);
1358 return NGX_ERROR; 1361 return NGX_ERROR;
1359 } 1362 }
1360 } 1363 }
1361 } 1364 }
1362 1365
1469 return NGX_ERROR; 1472 return NGX_ERROR;
1470 } 1473 }
1471 1474
1472 if (rc == NGX_DECLINED) { 1475 if (rc == NGX_DECLINED) {
1473 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, 1476 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
1474 "invalid server name or wildcard \"%V\" on %s", 1477 "invalid server name or wildcard \"%V\" on %V",
1475 &name[n].name, addr->opt.addr); 1478 &name[n].name, &addr->opt.addr_text);
1476 return NGX_ERROR; 1479 return NGX_ERROR;
1477 } 1480 }
1478 1481
1479 if (rc == NGX_BUSY) { 1482 if (rc == NGX_BUSY) {
1480 ngx_log_error(NGX_LOG_WARN, cf->log, 0, 1483 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
1481 "conflicting server name \"%V\" on %s, ignored", 1484 "conflicting server name \"%V\" on %V, ignored",
1482 &name[n].name, addr->opt.addr); 1485 &name[n].name, &addr->opt.addr_text);
1483 } 1486 }
1484 } 1487 }
1485 } 1488 }
1486 1489
1487 hash.key = ngx_hash_key_lc; 1490 hash.key = ngx_hash_key_lc;
1698 { 1701 {
1699 ngx_listening_t *ls; 1702 ngx_listening_t *ls;
1700 ngx_http_core_loc_conf_t *clcf; 1703 ngx_http_core_loc_conf_t *clcf;
1701 ngx_http_core_srv_conf_t *cscf; 1704 ngx_http_core_srv_conf_t *cscf;
1702 1705
1703 ls = ngx_create_listening(cf, &addr->opt.sockaddr.sockaddr, 1706 ls = ngx_create_listening(cf, addr->opt.sockaddr, addr->opt.socklen);
1704 addr->opt.socklen);
1705 if (ls == NULL) { 1707 if (ls == NULL) {
1706 return NULL; 1708 return NULL;
1707 } 1709 }
1708 1710
1709 ls->addr_ntop = 1; 1711 ls->addr_ntop = 1;
1789 1791
1790 addrs = hport->addrs; 1792 addrs = hport->addrs;
1791 1793
1792 for (i = 0; i < hport->naddrs; i++) { 1794 for (i = 0; i < hport->naddrs; i++) {
1793 1795
1794 sin = &addr[i].opt.sockaddr.sockaddr_in; 1796 sin = (struct sockaddr_in *) addr[i].opt.sockaddr;
1795 addrs[i].addr = sin->sin_addr.s_addr; 1797 addrs[i].addr = sin->sin_addr.s_addr;
1796 addrs[i].conf.default_server = addr[i].default_server; 1798 addrs[i].conf.default_server = addr[i].default_server;
1797 #if (NGX_HTTP_SSL) 1799 #if (NGX_HTTP_SSL)
1798 addrs[i].conf.ssl = addr[i].opt.ssl; 1800 addrs[i].conf.ssl = addr[i].opt.ssl;
1799 #endif 1801 #endif
1854 1856
1855 addrs6 = hport->addrs; 1857 addrs6 = hport->addrs;
1856 1858
1857 for (i = 0; i < hport->naddrs; i++) { 1859 for (i = 0; i < hport->naddrs; i++) {
1858 1860
1859 sin6 = &addr[i].opt.sockaddr.sockaddr_in6; 1861 sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr;
1860 addrs6[i].addr6 = sin6->sin6_addr; 1862 addrs6[i].addr6 = sin6->sin6_addr;
1861 addrs6[i].conf.default_server = addr[i].default_server; 1863 addrs6[i].conf.default_server = addr[i].default_server;
1862 #if (NGX_HTTP_SSL) 1864 #if (NGX_HTTP_SSL)
1863 addrs6[i].conf.ssl = addr[i].opt.ssl; 1865 addrs6[i].conf.ssl = addr[i].opt.ssl;
1864 #endif 1866 #endif