Mercurial > hg > nginx
comparison src/http/ngx_http.c @ 3217:a22bf524a456
refactor http listen code:
*) add listen's to the global cmcf->ports array instead of server's one
*) rename ngx_http_listen_conf_t to ngx_http_listen_opt_t
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 21 Oct 2009 08:19:46 +0000 |
parents | 98e288c6dac3 |
children | 022a7662b4ed |
comparison
equal
deleted
inserted
replaced
3216:79ae445ec57b | 3217:a22bf524a456 |
---|---|
15 static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf, | 15 static ngx_int_t ngx_http_init_headers_in_hash(ngx_conf_t *cf, |
16 ngx_http_core_main_conf_t *cmcf); | 16 ngx_http_core_main_conf_t *cmcf); |
17 static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf, | 17 static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf, |
18 ngx_http_core_main_conf_t *cmcf); | 18 ngx_http_core_main_conf_t *cmcf); |
19 | 19 |
20 static ngx_int_t ngx_http_init_server_lists(ngx_conf_t *cf, | |
21 ngx_array_t *servers, ngx_array_t *ports); | |
22 static ngx_int_t ngx_http_add_ports(ngx_conf_t *cf, | |
23 ngx_http_core_srv_conf_t *cscf, ngx_array_t *ports, | |
24 ngx_http_listen_t *listen); | |
25 static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf, | 20 static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf, |
26 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port, | 21 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port, |
27 ngx_http_listen_t *listen); | 22 ngx_http_listen_t *listen); |
28 static ngx_int_t ngx_http_add_address(ngx_conf_t *cf, | 23 static ngx_int_t ngx_http_add_address(ngx_conf_t *cf, |
29 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port, | 24 ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port, |
120 ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | 115 ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
121 { | 116 { |
122 char *rv; | 117 char *rv; |
123 ngx_uint_t mi, m, s; | 118 ngx_uint_t mi, m, s; |
124 ngx_conf_t pcf; | 119 ngx_conf_t pcf; |
125 ngx_array_t ports; | |
126 ngx_http_module_t *module; | 120 ngx_http_module_t *module; |
127 ngx_http_conf_ctx_t *ctx; | 121 ngx_http_conf_ctx_t *ctx; |
128 ngx_http_core_loc_conf_t *clcf; | 122 ngx_http_core_loc_conf_t *clcf; |
129 ngx_http_core_srv_conf_t **cscfp; | 123 ngx_http_core_srv_conf_t **cscfp; |
130 ngx_http_core_main_conf_t *cmcf; | 124 ngx_http_core_main_conf_t *cmcf; |
360 if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) { | 354 if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) { |
361 return NGX_CONF_ERROR; | 355 return NGX_CONF_ERROR; |
362 } | 356 } |
363 | 357 |
364 | 358 |
365 /* | |
366 * create the lists of ports, addresses and server names | |
367 * to find quickly the server core module configuration at run-time | |
368 */ | |
369 | |
370 if (ngx_http_init_server_lists(cf, &cmcf->servers, &ports) != NGX_OK) { | |
371 return NGX_CONF_ERROR; | |
372 } | |
373 | |
374 | |
375 /* optimize the lists of ports, addresses and server names */ | 359 /* optimize the lists of ports, addresses and server names */ |
376 | 360 |
377 if (ngx_http_optimize_servers(cf, cmcf, &ports) != NGX_OK) { | 361 if (ngx_http_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) { |
378 return NGX_CONF_ERROR; | 362 return NGX_CONF_ERROR; |
379 } | 363 } |
380 | 364 |
381 return NGX_CONF_OK; | 365 return NGX_CONF_OK; |
382 | 366 |
1107 | 1091 |
1108 return node; | 1092 return node; |
1109 } | 1093 } |
1110 | 1094 |
1111 | 1095 |
1112 static ngx_int_t | 1096 ngx_int_t |
1113 ngx_http_init_server_lists(ngx_conf_t *cf, ngx_array_t *servers, | 1097 ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, |
1114 ngx_array_t *ports) | 1098 ngx_http_listen_t *listen) |
1115 { | 1099 { |
1116 ngx_uint_t s, i; | 1100 in_port_t p; |
1117 ngx_http_listen_t *listen; | 1101 ngx_uint_t i; |
1118 ngx_http_core_srv_conf_t **cscfp; | 1102 struct sockaddr *sa; |
1119 | 1103 struct sockaddr_in *sin; |
1120 if (ngx_array_init(ports, cf->temp_pool, 2, sizeof(ngx_http_conf_port_t)) | 1104 ngx_http_conf_port_t *port; |
1121 != NGX_OK) | 1105 ngx_http_core_main_conf_t *cmcf; |
1122 { | |
1123 return NGX_ERROR; | |
1124 } | |
1125 | |
1126 /* "server" directives */ | |
1127 | |
1128 cscfp = servers->elts; | |
1129 for (s = 0; s < servers->nelts; s++) { | |
1130 | |
1131 /* "listen" directives */ | |
1132 | |
1133 listen = cscfp[s]->listen.elts; | |
1134 for (i = 0; i < cscfp[s]->listen.nelts; i++) { | |
1135 | |
1136 if (ngx_http_add_ports(cf, cscfp[s], ports, &listen[i]) != NGX_OK) { | |
1137 return NGX_ERROR; | |
1138 } | |
1139 } | |
1140 } | |
1141 | |
1142 return NGX_OK; | |
1143 } | |
1144 | |
1145 | |
1146 static ngx_int_t | |
1147 ngx_http_add_ports(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, | |
1148 ngx_array_t *ports, ngx_http_listen_t *listen) | |
1149 { | |
1150 in_port_t p; | |
1151 ngx_uint_t i; | |
1152 struct sockaddr *sa; | |
1153 struct sockaddr_in *sin; | |
1154 ngx_http_conf_port_t *port; | |
1155 #if (NGX_HAVE_INET6) | 1106 #if (NGX_HAVE_INET6) |
1156 struct sockaddr_in6 *sin6; | 1107 struct sockaddr_in6 *sin6; |
1157 #endif | 1108 #endif |
1109 | |
1110 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); | |
1111 | |
1112 if (cmcf->ports == NULL) { | |
1113 cmcf->ports = ngx_array_create(cf->temp_pool, 2, | |
1114 sizeof(ngx_http_conf_port_t)); | |
1115 if (cmcf->ports == NULL) { | |
1116 return NGX_ERROR; | |
1117 } | |
1118 } | |
1158 | 1119 |
1159 sa = (struct sockaddr *) &listen->sockaddr; | 1120 sa = (struct sockaddr *) &listen->sockaddr; |
1160 | 1121 |
1161 switch (sa->sa_family) { | 1122 switch (sa->sa_family) { |
1162 | 1123 |
1171 sin = (struct sockaddr_in *) sa; | 1132 sin = (struct sockaddr_in *) sa; |
1172 p = sin->sin_port; | 1133 p = sin->sin_port; |
1173 break; | 1134 break; |
1174 } | 1135 } |
1175 | 1136 |
1176 port = ports->elts; | 1137 port = cmcf->ports->elts; |
1177 for (i = 0; i < ports->nelts; i++) { | 1138 for (i = 0; i < cmcf->ports->nelts; i++) { |
1178 | 1139 |
1179 if (p != port[i].port || sa->sa_family != port[i].family) { | 1140 if (p != port[i].port || sa->sa_family != port[i].family) { |
1180 continue; | 1141 continue; |
1181 } | 1142 } |
1182 | 1143 |
1185 return ngx_http_add_addresses(cf, cscf, &port[i], listen); | 1146 return ngx_http_add_addresses(cf, cscf, &port[i], listen); |
1186 } | 1147 } |
1187 | 1148 |
1188 /* add a port to the port list */ | 1149 /* add a port to the port list */ |
1189 | 1150 |
1190 port = ngx_array_push(ports); | 1151 port = ngx_array_push(cmcf->ports); |
1191 if (port == NULL) { | 1152 if (port == NULL) { |
1192 return NGX_ERROR; | 1153 return NGX_ERROR; |
1193 } | 1154 } |
1194 | 1155 |
1195 port->family = sa->sa_family; | 1156 port->family = sa->sa_family; |
1248 return NGX_ERROR; | 1209 return NGX_ERROR; |
1249 } | 1210 } |
1250 | 1211 |
1251 /* check the duplicate "default" server for this address:port */ | 1212 /* check the duplicate "default" server for this address:port */ |
1252 | 1213 |
1253 if (listen->conf.default_server) { | 1214 if (listen->opt.default_server) { |
1254 | 1215 |
1255 if (addr[i].default_server) { | 1216 if (addr[i].default_server) { |
1256 ngx_log_error(NGX_LOG_ERR, cf->log, 0, | 1217 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
1257 "the duplicate default server in %s:%ui", | 1218 "the duplicate default server"); |
1258 listen->file_name, listen->line); | |
1259 | |
1260 return NGX_ERROR; | 1219 return NGX_ERROR; |
1261 } | 1220 } |
1262 | 1221 |
1263 addr[i].core_srv_conf = cscf; | 1222 addr[i].core_srv_conf = cscf; |
1264 addr[i].default_server = 1; | 1223 addr[i].default_server = 1; |
1265 #if (NGX_HTTP_SSL) | 1224 #if (NGX_HTTP_SSL) |
1266 addr[i].ssl = listen->conf.ssl; | 1225 addr[i].ssl = listen->opt.ssl; |
1267 #endif | 1226 #endif |
1268 addr[i].listen_conf = &listen->conf; | 1227 addr[i].opt = listen->opt; |
1269 } | 1228 } |
1270 | 1229 |
1271 return NGX_OK; | 1230 return NGX_OK; |
1272 } | 1231 } |
1273 | 1232 |
1300 addr = ngx_array_push(&port->addrs); | 1259 addr = ngx_array_push(&port->addrs); |
1301 if (addr == NULL) { | 1260 if (addr == NULL) { |
1302 return NGX_ERROR; | 1261 return NGX_ERROR; |
1303 } | 1262 } |
1304 | 1263 |
1305 addr->sockaddr = (struct sockaddr *) &listen->sockaddr; | 1264 ngx_memcpy(addr->sockaddr, listen->sockaddr, listen->socklen); |
1306 addr->socklen = listen->socklen; | 1265 addr->socklen = listen->socklen; |
1307 addr->hash.buckets = NULL; | 1266 addr->hash.buckets = NULL; |
1308 addr->hash.size = 0; | 1267 addr->hash.size = 0; |
1309 addr->wc_head = NULL; | 1268 addr->wc_head = NULL; |
1310 addr->wc_tail = NULL; | 1269 addr->wc_tail = NULL; |
1312 #if (NGX_PCRE) | 1271 #if (NGX_PCRE) |
1313 addr->nregex = 0; | 1272 addr->nregex = 0; |
1314 addr->regex = NULL; | 1273 addr->regex = NULL; |
1315 #endif | 1274 #endif |
1316 addr->core_srv_conf = cscf; | 1275 addr->core_srv_conf = cscf; |
1317 addr->default_server = listen->conf.default_server; | 1276 addr->default_server = listen->opt.default_server; |
1318 addr->bind = listen->conf.bind; | 1277 addr->bind = listen->opt.bind; |
1319 addr->wildcard = listen->conf.wildcard; | 1278 addr->wildcard = listen->opt.wildcard; |
1320 #if (NGX_HTTP_SSL) | 1279 #if (NGX_HTTP_SSL) |
1321 addr->ssl = listen->conf.ssl; | 1280 addr->ssl = listen->opt.ssl; |
1322 #endif | 1281 #endif |
1323 addr->listen_conf = &listen->conf; | 1282 addr->opt = listen->opt; |
1324 | 1283 |
1325 return ngx_http_add_names(cf, cscf, addr); | 1284 return ngx_http_add_names(cf, cscf, addr); |
1326 } | 1285 } |
1327 | 1286 |
1328 | 1287 |
1468 } | 1427 } |
1469 | 1428 |
1470 if (rc == NGX_DECLINED) { | 1429 if (rc == NGX_DECLINED) { |
1471 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | 1430 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, |
1472 "invalid server name or wildcard \"%V\" on %s", | 1431 "invalid server name or wildcard \"%V\" on %s", |
1473 &name[s].name, addr->listen_conf->addr); | 1432 &name[s].name, addr->opt.addr); |
1474 return NGX_ERROR; | 1433 return NGX_ERROR; |
1475 } | 1434 } |
1476 | 1435 |
1477 if (rc == NGX_BUSY) { | 1436 if (rc == NGX_BUSY) { |
1478 ngx_log_error(NGX_LOG_WARN, cf->log, 0, | 1437 ngx_log_error(NGX_LOG_WARN, cf->log, 0, |
1479 "conflicting server name \"%V\" on %s, ignored", | 1438 "conflicting server name \"%V\" on %s, ignored", |
1480 &name[s].name, addr->listen_conf->addr); | 1439 &name[s].name, addr->opt.addr); |
1481 } | 1440 } |
1482 } | 1441 } |
1483 | 1442 |
1484 hash.key = ngx_hash_key_lc; | 1443 hash.key = ngx_hash_key_lc; |
1485 hash.max_size = cmcf->server_names_hash_max_size; | 1444 hash.max_size = cmcf->server_names_hash_max_size; |
1719 ls->post_accept_buffer_size = cscf->client_header_buffer_size; | 1678 ls->post_accept_buffer_size = cscf->client_header_buffer_size; |
1720 } | 1679 } |
1721 } | 1680 } |
1722 #endif | 1681 #endif |
1723 | 1682 |
1724 ls->backlog = addr->listen_conf->backlog; | 1683 ls->backlog = addr->opt.backlog; |
1725 ls->rcvbuf = addr->listen_conf->rcvbuf; | 1684 ls->rcvbuf = addr->opt.rcvbuf; |
1726 ls->sndbuf = addr->listen_conf->sndbuf; | 1685 ls->sndbuf = addr->opt.sndbuf; |
1727 | 1686 |
1728 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) | 1687 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) |
1729 ls->accept_filter = addr->listen_conf->accept_filter; | 1688 ls->accept_filter = addr->opt.accept_filter; |
1730 #endif | 1689 #endif |
1731 | 1690 |
1732 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) | 1691 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) |
1733 ls->deferred_accept = addr->listen_conf->deferred_accept; | 1692 ls->deferred_accept = addr->opt.deferred_accept; |
1734 #endif | 1693 #endif |
1735 | 1694 |
1736 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) | 1695 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) |
1737 ls->ipv6only = addr->listen_conf->ipv6only; | 1696 ls->ipv6only = addr->opt.ipv6only; |
1738 #endif | 1697 #endif |
1739 | 1698 |
1740 return ls; | 1699 return ls; |
1741 } | 1700 } |
1742 | 1701 |