Nginx源码剖析--ngx_cycle_s结构体分析

本文详细剖析了Nginx的核心结构ngx_cycle_t,重点关注其conf_ctx组件,这是一个多维指针,用于存储模块配置信息。conf_ctx的双重数组设计反映了配置文件的层级嵌套特性,允许不同配置块对同一模块配置结构体产生影响。ngx_cycle_t不仅管理模块配置,还涉及nginx运行时资源的管理。
前言

Nginx框架是围绕着ngx_cycle_t结构体运行的。ngx_cycle_t结构体中包含的信息主要可以分为以下部分:

  1. 所有模块的配置信息
  2. Nginx运行时所需要的一些资源,包括连接池,内存池,打开文件,操作目录等等

本文将详细介绍ngx_cycle_t结构体所包含的内容。

ngx_cycle_t结构体的内容
struct ngx_cycle_s { 
    //保存所有模块的配置结构体
    void                  ****conf_ctx;
    //内存池
    ngx_pool_t               *pool;

    //日志信息
    ngx_log_t                *log;
    ngx_log_t                 new_log;

    ngx_uint_t                log_use_stderr;  /* unsigned  log_use_stderr:1; */

    ngx_connection_t        **files;
    //连接池
    ngx_connection_t         *free_connecti
### `ngx_create_listening` 函数的作用 `ngx_create_listening` 是 Nginx 源码中的关键函数之一,用于创建监听套接字并初始化相关的监听结构体 `ngx_listening_t`。该函数的主要作用是为 HTTP 服务配置监听地址和端口,并为每个监听套接字分配对应的事件处理机制,确保 Nginx 能够接收客户端连接请求[^1]。 ### `ngx_create_listening` 的实现原理 `ngx_create_listening` 函数在 Nginx 启动过程中被调用,通常由 `ngx_http_core_module` 模块中的 `ngx_http_core_listen` 函数触发。该函数负责为每个 `listen` 配置项创建一个 `ngx_listening_t` 结构体实例,并设置其属性,包括监听地址、端口、协议类型(如 TCP 或 UNIX 域套接字)等。 ```c ngx_listening_t * ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen) { ngx_listening_t *ls; struct sockaddr_un *un; ls = ngx_array_push(&cf->cycle->listening); if (ls == NULL) { return NULL; } ngx_memzero(ls, sizeof(ngx_listening_t)); ls->sockaddr = ngx_palloc(cf->pool, socklen); if (ls->sockaddr == NULL) { return NULL; } ngx_memcpy(ls->sockaddr, sockaddr, socklen); ls->socklen = socklen; if (sockaddr->sa_family == AF_UNIX) { un = (struct sockaddr_un *) sockaddr; ls->addr_text.len = sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path) - 1; ls->addr_text.data = ngx_pnalloc(cf->pool, ls->addr_text.len); if (ls->addr_text.data == NULL) { return NULL; } ngx_memcpy(ls->addr_text.data, un->sun_path, ls->addr_text.len); } ls->fd = (ngx_socket_t) -1; ls->type = SOCK_STREAM; ls->handler = ngx_http_init_connection; return ls; } ``` 上述代码片段展示了 `ngx_create_listening` 的核心逻辑。该函数首先从 `ngx_cycle_t` 的 `listening` 数组中分配一个新的监听项,并初始化其地址信息。如果是 UNIX 域套接字,则进一步设置地址文本。此外,函数将监听套接字的文件描述符初始化为 `-1`,表示尚未绑定,同时将连接处理函数设置为 `ngx_http_init_connection`,用于后续处理客户端连接请求。 ### `ngx_listening_t` 结构的作用 `ngx_listening_t` 是 Nginx 中用于管理监听套接字的核心结构体,其主要字段包括: - `sockaddr`:监听地址信息; - `socklen`:地址长度; - `addr_text`:地址文本表示; - `fd`:监听套接字的文件描述符; - `handler`:连接处理函数指针,通常指向 `ngx_http_init_connection`; - `type`:套接字类型,如 `SOCK_STREAM`。 在 Nginx 初始化过程中,每个监听项都会被加入到 `ngx_cycle_t` 的 `listening` 数组中,以便后续统一管理和绑定监听套接字[^2]。 ### 监听套接字的绑定与事件注册 在调用 `ngx_create_listening` 创建监听项之后,Nginx 会进一步调用 `ngx_open_listening_sockets` 函数,依次绑定每个监听项的套接字,并设置为非阻塞模式。绑定成功后,Nginx 将监听套接字加入事件驱动模型中,注册读事件处理函数,以便在有客户端连接时触发 `ngx_http_init_connection` 处理逻辑。 ### `ngx_http_init_connection` 的作用 当客户端连接到达时,Nginx 会调用 `ngx_http_init_connection` 函数,该函数负责初始化客户端连接结构 `ngx_connection_t`,并注册后续的读写事件处理函数。该函数还会调用 `ngx_http_create_request` 创建 HTTP 请求结构,并设置相应的回调函数,以便处理完整的 HTTP 请求流程。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值