ngx_http_add_listening

张开发
2026/4/6 19:56:12 15 分钟阅读

分享文章

ngx_http_add_listening
1 定义ngx_http_add_listening 函数 定义在 ./nginx-1.24.0/src/http/ngx_http.cstaticngx_listening_t*ngx_http_add_listening(ngx_conf_t*cf,ngx_http_conf_addr_t*addr){ngx_listening_t*ls;ngx_http_core_loc_conf_t*clcf;ngx_http_core_srv_conf_t*cscf;lsngx_create_listening(cf,addr-opt.sockaddr,addr-opt.socklen);if(lsNULL){returnNULL;}ls-addr_ntop1;ls-handlerngx_http_init_connection;cscfaddr-default_server;ls-pool_sizecscf-connection_pool_size;clcfcscf-ctx-loc_conf[ngx_http_core_module.ctx_index];ls-logpclcf-error_log;ls-log.datals-addr_text;ls-log.handlerngx_accept_log_error;#if(NGX_WIN32){ngx_iocp_conf_t*iocpcfNULL;if(ngx_get_conf(cf-cycle-conf_ctx,ngx_events_module)){iocpcfngx_event_get_conf(cf-cycle-conf_ctx,ngx_iocp_module);}if(iocpcfiocpcf-acceptex_read){ls-post_accept_buffer_sizecscf-client_header_buffer_size;}}#endifls-backlogaddr-opt.backlog;ls-rcvbufaddr-opt.rcvbuf;ls-sndbufaddr-opt.sndbuf;ls-keepaliveaddr-opt.so_keepalive;#if(NGX_HAVE_KEEPALIVE_TUNABLE)ls-keepidleaddr-opt.tcp_keepidle;ls-keepintvladdr-opt.tcp_keepintvl;ls-keepcntaddr-opt.tcp_keepcnt;#endif#if(NGX_HAVE_DEFERRED_ACCEPTdefined SO_ACCEPTFILTER)ls-accept_filteraddr-opt.accept_filter;#endif#if(NGX_HAVE_DEFERRED_ACCEPTdefined TCP_DEFER_ACCEPT)ls-deferred_acceptaddr-opt.deferred_accept;#endif#if(NGX_HAVE_INET6)ls-ipv6onlyaddr-opt.ipv6only;#endif#if(NGX_HAVE_SETFIB)ls-setfibaddr-opt.setfib;#endif#if(NGX_HAVE_TCP_FASTOPEN)ls-fastopenaddr-opt.fastopen;#endif#if(NGX_HAVE_REUSEPORT)ls-reuseportaddr-opt.reuseport;#endifreturnls;}ngx_http_add_listening 函数的作用是 将 HTTP 模块解析出的一个监听地址配置ngx_http_conf_addr_t转换为 Nginx 核心的监听管理对象ngx_listening_t 并为其设置连接初始化处理函数、内存池大小、日志 及各种 socket 选项如 backlog、keepalive、延迟接受、端口复用等 最终返回该监听管理对象供事件机制使用。2 详解1 函数签名staticngx_listening_t*ngx_http_add_listening(ngx_conf_t*cf,ngx_http_conf_addr_t*addr)返回值 回指向有效 ngx_listening_t 的指针 该对象已加入 cf-cycle-listening 动态数组参数 ngx_conf_t *cf 指向配置解析上下文 ngx_http_conf_addr_t *addr 一个已解析完成的监听地址及其关联的服务器配置 本次需要处理的输入数据2 逻辑流程1 局部变量 2 创建监听管理结构体 3 设置结构体的各个字段 4 返回结构体指针1 局部变量{ngx_listening_t*ls;ngx_http_core_loc_conf_t*clcf;ngx_http_core_srv_conf_t*cscf;2 创建监听管理结构体lsngx_create_listening(cf,addr-opt.sockaddr,addr-opt.socklen);if(lsNULL){returnNULL;}#1 调用 函数 ngx_create_listening 创建并初始化一个监听管理对象ngx_listening_t 并将其加入到当前 cycle 的监听数组 cf-cycle-listening 中。 参数详解 cf 配置解析上下文。 addr-opt.sockaddr 指向一个已填充好的地址结构 包含要监听的 IP 地址和端口。 该地址来源于 listen 指令解析结果存储在 addr-opt 中。 addr-opt.socklen 上述地址结构的长度ls 是局部变量 ngx_listening_t* 类型。 接收 ngx_create_listening 返回的指针。 如果创建成功ls 指向一个有效的监听对象 如果失败返回 NULL。3 设置结构体的各个字段ls-addr_ntop1;将 addr_ntop 设置为 1真值 含义标记 “需要地址文本化转换”ls-handlerngx_http_init_connection;将该监听套接字的新连接处理入口绑定为 ngx_http_init_connection 即当操作系统通知此端口有 TCP 连接完成三次握手后 Nginx 事件循环将统一调用 ngx_http_init_connection 来接管该连接的生命周期。cscfaddr-default_server;ls-pool_sizecscf-connection_pool_size;将默认服务器的配置指针保存到局部变量 cscf 中 将默认服务器的 连接内存池大小 配置值复制到监听管理结构的 pool_size 字段中。clcfcscf-ctx-loc_conf[ngx_http_core_module.ctx_index];从默认服务器的配置上下文中 提取出 HTTP 核心模块的 location 级别配置ls-logpclcf-error_log;ls-log.datals-addr_text;ls-log.handlerngx_accept_log_error;#1 将 clcf-error_log 指针赋值给 ls-logp 使监听管理对象与默认服务器的错误日志配置绑定 #2 将 ls-addr_text 的地址ls-addr_text赋给 ls-log.data 使日志处理函数能够访问到该监听地址的字符串。 #3 将 ngx_accept_log_error 函数的地址赋给 ls-log.handler 使得该监听管理对象的日志使用此专用格式化函数。 三行代码共同完成了监听对象的日志配置#if(NGX_WIN32){ngx_iocp_conf_t*iocpcfNULL;if(ngx_get_conf(cf-cycle-conf_ctx,ngx_events_module)){iocpcfngx_event_get_conf(cf-cycle-conf_ctx,ngx_iocp_module);}if(iocpcfiocpcf-acceptex_read){ls-post_accept_buffer_sizecscf-client_header_buffer_size;}}#endif条件编译指令。只有当编译目标为 Windows 系统时预处理器才会包含这段代码块ls-backlogaddr-opt.backlog;ls-rcvbufaddr-opt.rcvbuf;ls-sndbufaddr-opt.sndbuf;将 listen 指令中配置的 TCP 协议相关参数backlog、接收缓冲区、发送缓冲区 从地址选项结构复制到监听管理对象中。 后续当 Nginx 实际创建并绑定监听 socket 时 会使用这些值调用 setsockopt 进行设置。ls-keepaliveaddr-opt.so_keepalive;#if(NGX_HAVE_KEEPALIVE_TUNABLE)ls-keepidleaddr-opt.tcp_keepidle;ls-keepintvladdr-opt.tcp_keepintvl;ls-keepcntaddr-opt.tcp_keepcnt;#endif将 listen 指令解析出的 TCP 保活开关 及三要素空闲阈值、探测间隔、最大重试次数缓存至监听管理结构体#if(NGX_HAVE_DEFERRED_ACCEPTdefined SO_ACCEPTFILTER)ls-accept_filteraddr-opt.accept_filter;#endif#if(NGX_HAVE_DEFERRED_ACCEPTdefined TCP_DEFER_ACCEPT)ls-deferred_acceptaddr-opt.deferred_accept;#endif#if(NGX_HAVE_INET6)ls-ipv6onlyaddr-opt.ipv6only;#endif#if(NGX_HAVE_SETFIB)ls-setfibaddr-opt.setfib;#endif#if(NGX_HAVE_TCP_FASTOPEN)ls-fastopenaddr-opt.fastopen;#endif#if(NGX_HAVE_REUSEPORT)ls-reuseportaddr-opt.reuseport;#endif将 listen 指令中声明的操作系统级网络优化选项缓存至 ngx_listening_t 结构体。4 返回结构体指针returnls;}

更多文章