/* add the server core module configuration to the address:port */
static ngx_int_t
ngx_http_add_server(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
ngx_http_conf_addr_t *addr)
{
ngx_uint_t i;
ngx_http_core_srv_conf_t **server;
if (addr->servers.elts == NULL) {
if (ngx_array_init(&addr->servers, cf->temp_pool, 4,
sizeof(ngx_http_core_srv_conf_t *))
!= NGX_OK)
{
return NGX_ERROR;
}
} else {
server = addr->servers.elts;
for (i = 0; i < addr->servers.nelts; i++) {
if (server[i] == cscf) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"a duplicate listen %V",
&addr->opt.addr_text);
return NGX_ERROR;
}
}
}
server = ngx_array_push(&addr->servers);
if (server == NULL) {
return NGX_ERROR;
}
*server = cscf;
return NGX_OK;
}
ngx_http_add_server
函数的作用是将一个 HTTP 服务器配置 (ngx_http_core_srv_conf_t
) 添加到指定的监听地址配置 (ngx_http_conf_addr_t
) 的服务器列表中,并确保同一配置不会被重复添加
if (addr->servers.elts == NULL) {
if (ngx_array_init(&addr->servers, cf->temp_pool, 4,
sizeof(ngx_http_core_srv_conf_t *))
!= NGX_OK)
{
return NGX_ERROR;
}
}
初始化存储服务器配置的动态数组 ,确保后续可以安全地将新的服务器配置 (
cscf
) 添加到监听地址 (addr
) 的服务器列表中检查数组是否已初始化
通过判断addr->servers.elts
是否为NULL
,确定该地址的服务器列表是否已经初始化
addr->servers
是 Nginx 中用于 关联监听地址与虚拟主机配置 的核心数据结构,其本质是一个动态数组(ngx_array_t
),存储了指向ngx_http_core_srv_conf_t
类型(虚拟主机配置)的指针
此时 addr->servers.elts 是 NULL
server = ngx_array_push(&addr->servers);
if (server == NULL) {
return NGX_ERROR;
}
*server = cscf;
将当前的 HTTP 服务器配置(
cscf
)添加到监听地址(addr
)的服务器列表(addr->servers
)中
return NGX_OK;
返回 NGX_OK