Mercurial > hg > nginx
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 |