ngx_http_create_request
1 定义ngx_http_create_request 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cngx_http_request_t*ngx_http_create_request(ngx_connection_t*c){ngx_http_request_t*r;ngx_http_log_ctx_t*ctx;ngx_http_core_loc_conf_t*clcf;rngx_http_alloc_request(c);if(rNULL){returnNULL;}c-requests;clcfngx_http_get_module_loc_conf(r,ngx_http_core_module);ngx_set_connection_log(c,clcf-error_log);ctxc-log-data;ctx-requestr;ctx-current_requestr;#if(NGX_STAT_STUB)(void)ngx_atomic_fetch_add(ngx_stat_reading,1);r-stat_reading1;(void)ngx_atomic_fetch_add(ngx_stat_requests,1);#endifreturnr;}ngx_http_create_request 函数 负责为给定连接分配并初始化一个 ngx_http_request_t 结构体 将其与连接及日志上下文绑定更新连接请求计数和全局统计信息 作为 HTTP 请求处理生命周期的起点。2 详解1 函数签名ngx_http_request_t*ngx_http_create_request(ngx_connection_t*c)返回值 一个指向 ngx_http_request_t 的 HTTP 请求结构体指针参数 ngx_connection_t *c ngx_connection_t 是 nginx 对网络连接的抽象 代表一个已经建立好的客户端 TCP 连接2 逻辑流程1 局部变量 2 分配请求结构体 3 设置连接的日志对象 4 统计桩更新 5 返回指针1 局部变量{ngx_http_request_t*r;ngx_http_log_ctx_t*ctx;ngx_http_core_loc_conf_t*clcf;2 分配请求结构体rngx_http_alloc_request(c);if(rNULL){returnNULL;}c-requests;分配并初始化请求结构体。 ngx_http_alloc_request(c) 从连接 c 的内存池中分配 ngx_http_request_t并执行大量基础初始化 成功时返回请求指针失败时返回 NULL。 连接请求计数递增。 连接 c 可以处理多个 HTTP 请求keep-alive。 每创建一个新请求该计数器加 1 用于监控和管理连接的生命周期如判断是否超过最大请求数。3 设置连接的日志对象clcfngx_http_get_module_loc_conf(r,ngx_http_core_module);ngx_set_connection_log(c,clcf-error_log);ctxc-log-data;ctx-requestr;ctx-current_requestr;#1 获取核心模块的位置配置。 在请求处理早期尚未匹配具体 location 此处获取的是默认 server 级别的配置继承自主配置。 clcf-error_log 将决定连接日志的详细信息输出目标。 #2 设置连接的日志对象 #3 获取连接日志中的上下文指针 将主请求指针写入日志上下文 将当前活跃请求指针也设为主请求4 统计桩更新#if(NGX_STAT_STUB)(void)ngx_atomic_fetch_add(ngx_stat_reading,1);r-stat_reading1;(void)ngx_atomic_fetch_add(ngx_stat_requests,1);#endif#1 条件编译开始 当 nginx 编译时启用了统计桩模块会定义 NGX_STAT_STUB 从而启用以下全局统计更新。 否则这些代码不会被编译避免无谓的性能开销。 #2 原子增加“正在读取”连接计数。 ngx_stat_reading 是全局原子变量 表示当前处于读取客户端请求状态的连接数。 新请求刚创建时即处于“读取请求头”阶段故加 1。 #3 在请求结构中标记“正在读取”状态 #4 r-stat_reading 标志位用于跟踪请求是否仍处于 reading 状态。 当请求后续转入其他阶段如处理、响应或结束时 会检查该标志并原子减少 ngx_stat_reading从而准确维护全局统计。 #5 原子增加全局请求总数。 ngx_stat_requests 统计自服务器启动以来创建的所有 HTTP 请求数无论最终是否成功。 该数字对外体现服务器吞吐量。同样忽略返回值。5 返回指针returnr;}返回新创建的请求结构体指针。 调用者获得完全初始化并已绑定连接、日志与统计信息的请求对象 接下来便进入请求行与请求头的解析阶段。