定義在 src\http\ngx_http_core_module.c
static char *
ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
{ngx_http_core_srv_conf_t *prev = parent;ngx_http_core_srv_conf_t *conf = child;ngx_str_t name;ngx_http_server_name_t *sn;/* TODO: it does not merge, it inits only */ngx_conf_merge_size_value(conf->connection_pool_size,prev->connection_pool_size, 64 * sizeof(void *));ngx_conf_merge_size_value(conf->request_pool_size,prev->request_pool_size, 4096);ngx_conf_merge_msec_value(conf->client_header_timeout,prev->client_header_timeout, 60000);ngx_conf_merge_size_value(conf->client_header_buffer_size,prev->client_header_buffer_size, 1024);ngx_conf_merge_bufs_value(conf->large_client_header_buffers,prev->large_client_header_buffers,4, 8192);if (conf->large_client_header_buffers.size < conf->connection_pool_size) {ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,"the \"large_client_header_buffers\" size must be ""equal to or greater than \"connection_pool_size\"");return NGX_CONF_ERROR;}ngx_conf_merge_value(conf->ignore_invalid_headers,prev->ignore_invalid_headers, 1);ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1);ngx_conf_merge_value(conf->underscores_in_headers,prev->underscores_in_headers, 0);if (conf->server_names.nelts == 0) {/* the array has 4 empty preallocated elements, so push cannot fail */sn = ngx_array_push(&conf->server_names);
#if (NGX_PCRE)sn->regex = NULL;
#endifsn->server = conf;ngx_str_set(&sn->name, "");}sn = conf->server_names.elts;name = sn[0].name;#if (NGX_PCRE)if (sn->regex) {name.len++;name.data--;} else
#endifif (name.data[0] == '.') {name.len--;name.data++;}conf->server_name.len = name.len;conf->server_name.data = ngx_pstrdup(cf->pool, &name);if (conf->server_name.data == NULL) {return NGX_CONF_ERROR;}return NGX_CONF_OK;
}
函數作用
合并 HTTP 核心模塊的父級配置 (
parent
,通常來自http
塊)和子級配置 (child
,通常來自server
塊),處理默認值、約束條件和server_name
的規范化。
ngx_http_core_srv_conf_t *prev = parent;
ngx_http_core_srv_conf_t *conf = child;
ngx_str_t name;
ngx_http_server_name_t *sn;
prev
和conf
分別指向父級和子級的配置結構體。name
用于臨時存儲處理后的server_name
。sn
是指向server_names
數組元素的指針。
ngx_conf_merge_size_value(conf->connection_pool_size, prev->connection_pool_size, 64 * sizeof(void *));
- 作用 :合并
connection_pool_size
(連接內存池大小)。- 邏輯 :如果子配置未設置,繼承父配置;若父配置也未設置,使用默認值
64 * sizeof(void *)
。- 意義 :確保每個連接的內存池大小合理,避免內存浪費或不足。
ngx_conf_merge_size_value-CSDN博客
conf->connection_pool_size=-1
prev->connection_pool_size=-1執行后
conf->connection_pool_size=512
ngx_conf_merge_size_value(conf->request_pool_size, prev->request_pool_size, 4096);
- 作用 :合并
request_pool_size
(請求內存池大小)- 默認值 :4096
conf->request_pool_size=-1
prev->request_pool_size=-1執行后
conf->request_pool_size=4096
?
ngx_conf_merge_msec_value(conf->client_header_timeout, prev->client_header_timeout, 60000);
- 作用 :合并
client_header_timeout
(客戶端頭超時時間)- 默認值 :60,000 毫秒(60 秒)
ngx_conf_merge_msec_value-CSDN博客
?
conf->client_header_timeout=18446744073709551615? ?(無符號長整型 -1,表示未設置)
prev->client_header_timeout=18446744073709551615
執行后
conf->client_header_timeout=60000
ngx_conf_merge_size_value(conf->client_header_buffer_size, prev->client_header_buffer_size, 1024);
- 作用 :合并
client_header_buffer_size
(客戶端頭緩沖區大小)。- 默認值 :1024
?conf->client_header_buffer_size=-1
prev->client_header_buffer_size=-1
執行后
conf->client_header_buffer_size=1024
ngx_conf_merge_bufs_value(conf->large_client_header_buffers, prev->large_client_header_buffers, 4, 8192);
- 作用 :合并
large_client_header_buffers
(大頭緩沖區配置)。- 默認值 :4 個緩沖區,每個 8KB。
ngx_conf_merge_bufs_value-CSDN博客
conf->large_client_header_buffers.num=0
conf->large_client_header_buffers.size=0
prev->large_client_header_buffers.num=0
prev->large_client_header_buffers.size=0
執行后
conf->large_client_header_buffers.num=4
conf->large_client_header_buffers.size=8192
?
if (conf->large_client_header_buffers.size < conf->connection_pool_size) {ngx_conf_log_error(...);return NGX_CONF_ERROR;
}
作用 :檢查
large_client_header_buffers
的大小是否 ≥connection_pool_size
。邏輯 :若不滿足,記錄錯誤并終止配置合并。
意義 :確保大頭緩沖區足夠容納連接內存池,避免內存越界。
conf->large_client_header_buffers.size=8192
conf->connection_pool_size=512條件不成立
ngx_conf_merge_value(conf->ignore_invalid_headers, prev->ignore_invalid_headers, 1);
作用 :合并
ignore_invalid_headers
(是否忽略無效頭)默認值 :1(啟用)
ngx_conf_merge_value-CSDN博客
conf->ignore_invalid_headers=-1
prev->ignore_invalid_headers=-1
執行后
conf->ignore_invalid_headers=1
?
ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1);
作用 :合并 merge_slashes(是否合并連續斜杠)。
默認值 :1(啟用)。conf->merge_slashes=-1
prev->merge_slashes=-1
執行后
conf->merge_slashes=1
ngx_conf_merge_value(conf->underscores_in_headers, prev->underscores_in_headers, 0);
作用 :合并
underscores_in_headers
(是否允許頭字段包含下劃線)默認值 :0(禁用)
conf->underscores_in_headers=-1
prev->underscores_in_headers=-1
執行后
conf->underscores_in_headers=0
?
if (conf->server_names.nelts == 0) {/* the array has 4 empty preallocated elements, so push cannot fail */sn = ngx_array_push(&conf->server_names);
#if (NGX_PCRE)sn->regex = NULL;
#endifsn->server = conf;ngx_str_set(&sn->name, "");}
作用 :若未配置
server_name
,添加默認空名稱。邏輯 :向
server_names
數組添加一個元素,名稱設為空字符串。意義 :確保每個虛擬主機至少有一個
server_name
(即使為空)。此時
conf->server_names.nelts=1
條件不成立
sn = conf->server_names.elts;name = sn[0].name;
- 作用 :獲取第一個
server_name
的名稱。此時
name.data=localhost
#if (NGX_PCRE)if (sn->regex) {name.len++;name.data--;} else
#endif
作用 :如果使用正則表達式(PCRE),調整名稱指針和長度。
邏輯 :正則表達式匹配的名稱可能以特殊字符(如
~
)開頭,需跳過。此時
sn->regex=(nil)
條件不成立
if (name.data[0] == '.') {name.len--;name.data++;}
作用 :處理通配符域名(如
.example.com
)。邏輯 :去掉開頭的點,轉換為
example.com
,避免重復匹配。此時
?name.data=localhost
條件不成立
conf->server_name.len = name.len;conf->server_name.data = ngx_pstrdup(cf->pool, &name);if (conf->server_name.data == NULL) {return NGX_CONF_ERROR;}
作用 :規范化后的
server_name
存入配置。邏輯 :使用
ngx_pstrdup
復制字符串到內存池新分配的內存意義 :主
server_name
用于日志、錯誤信息等場景。conf->server_name.len=9
conf->server_name.data=localhost
return NGX_CONF_OK;
?返回 NGX_CONF_OK