1 定义ngx_http_process_request 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cvoidngx_http_process_request(ngx_http_request_t*r){ngx_connection_t*c;cr-connection;#if(NGX_HTTP_SSL)if(r-http_connection-ssl){longrc;X509*cert;constchar*s;ngx_http_ssl_srv_conf_t*sscf;if(c-sslNULL){ngx_log_error(NGX_LOG_INFO,c-log,0,client sent plain HTTP request to HTTPS port);ngx_http_finalize_request(r,NGX_HTTP_TO_HTTPS);return;}sscfngx_http_get_module_srv_conf(r,ngx_http_ssl_module);if(sscf-verify){rcSSL_get_verify_result(c-ssl-connection);if(rc!X509_V_OK(sscf-verify!3||!ngx_ssl_verify_error_optional(rc))){ngx_log_error(NGX_LOG_INFO,c-log,0,client SSL certificate verify error: (%l:%s),rc,X509_verify_cert_error_string(rc));ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_CERT_ERROR);return;}if(sscf-verify1){certSSL_get_peer_certificate(c-ssl-connection);if(certNULL){ngx_log_error(NGX_LOG_INFO,c-log,0,client sent no required SSL certificate);ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_NO_CERT);return;}X509_free(cert);}if(ngx_ssl_ocsp_get_status(c,s)!NGX_OK){ngx_log_error(NGX_LOG_INFO,c-log,0,client SSL certificate verify error: %s,s);ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_CERT_ERROR);return;}}}#endifif(c-read-timer_set){ngx_del_timer(c-read);}#if(NGX_STAT_STUB)(void)ngx_atomic_fetch_add(ngx_stat_reading,-1);r-stat_reading0;(void)ngx_atomic_fetch_add(ngx_stat_writing,1);r-stat_writing1;#endifc-read-handlerngx_http_request_handler;c-write-handlerngx_http_request_handler;r-read_event_handlerngx_http_block_reading;ngx_http_handler(r);}ngx_http_process_request 函数 在完整接收 HTTP 请求头后被调用 主要完成 HTTPS 安全校验明文检测、客户端证书验证、OCSP 装订状态检查 清理读取阶段的超时定时器切换读写事件处理器 并将请求移交至核心处理流水线 ngx_http_handler。2 详解1 函数签名voidngx_http_process_request(ngx_http_request_t*r)无返回值参数 ngx_http_request_t *r 当前请求的请求结构体2 逻辑流程1 获取连接对象 2 SSL 处理 3 清理读超时定时器 4 统计桩 5 切换事件处理器 6 进入请求处理阶段1 获取连接对象{ngx_connection_t*c;cr-connection;从请求结构体中取出连接对象2 SSL 处理#if(NGX_HTTP_SSL)if(r-http_connection-ssl){longrc;X509*cert;constchar*s;ngx_http_ssl_srv_conf_t*sscf;if(c-sslNULL){ngx_log_error(NGX_LOG_INFO,c-log,0,client sent plain HTTP request to HTTPS port);ngx_http_finalize_request(r,NGX_HTTP_TO_HTTPS);return;}sscfngx_http_get_module_srv_conf(r,ngx_http_ssl_module);if(sscf-verify){rcSSL_get_verify_result(c-ssl-connection);if(rc!X509_V_OK(sscf-verify!3||!ngx_ssl_verify_error_optional(rc))){ngx_log_error(NGX_LOG_INFO,c-log,0,client SSL certificate verify error: (%l:%s),rc,X509_verify_cert_error_string(rc));ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_CERT_ERROR);return;}if(sscf-verify1){certSSL_get_peer_certificate(c-ssl-connection);if(certNULL){ngx_log_error(NGX_LOG_INFO,c-log,0,client sent no required SSL certificate);ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_NO_CERT);return;}X509_free(cert);}if(ngx_ssl_ocsp_get_status(c,s)!NGX_OK){ngx_log_error(NGX_LOG_INFO,c-log,0,client SSL certificate verify error: %s,s);ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_CERT_ERROR);return;}}}#endif3 清理读超时定时器if(c-read-timer_set){ngx_del_timer(c-read);}检查连接的读事件是否设置了超时定时器 如果设置了则删除该定时器。 因为请求头已经完整接收旧的超时限制不再适用后续会由新的事件处理逻辑设定新的超时。 这避免了误超时导致的连接关闭。4 统计桩#if(NGX_STAT_STUB)(void)ngx_atomic_fetch_add(ngx_stat_reading,-1);r-stat_reading0;(void)ngx_atomic_fetch_add(ngx_stat_writing,1);r-stat_writing1;#endif更新统计桩5 切换事件处理器c-read-handlerngx_http_request_handler;c-write-handlerngx_http_request_handler;r-read_event_handlerngx_http_block_reading;将连接级的读事件回调函数和写事件回调函数都设置为 ngx_http_request_handler。 这是 Nginx HTTP 请求状态机的核心事件处理函数 它会根据当前请求的 read_event_handler 和 write_event_handler 字段 分派具体的读写逻辑。 这里统一接管标志着连接从专用的“读取请求头”回调切换到了通用的请求处理回调。将请求层面的“读事件处理器”设置为 ngx_http_block_reading。 这是一个特殊的函数其作用是忽略或暂缓读事件 除非某些模块如读取请求体显式地将其替换为实际读取函数。 这确保了在初始阶段Nginx 不会意外地尝试从连接中读取更多数据 干扰后续处理流程例如等待生成响应或读取请求体。这部分代码是为了在进入下一步处理前设置好正确的环境 本质上就是先初始化好安全的异步环境 再启动复杂的业务逻辑 避免了“先运行业务然后业务中触发了事件结果发现回调还是旧的”这类竞态问题。6 进入请求处理阶段ngx_http_handler(r);}调用核心处理函数 ngx_http_handler 将请求 r 送入 HTTP 处理阶段流水线。 该函数会按顺序执行 11 个阶段 直到生成响应或遇到错误。 从这一行起请求正式进入内容生成与处理的核心环节。
ngx_http_process_request
发布时间:2026/5/26 19:00:58
1 定义ngx_http_process_request 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cvoidngx_http_process_request(ngx_http_request_t*r){ngx_connection_t*c;cr-connection;#if(NGX_HTTP_SSL)if(r-http_connection-ssl){longrc;X509*cert;constchar*s;ngx_http_ssl_srv_conf_t*sscf;if(c-sslNULL){ngx_log_error(NGX_LOG_INFO,c-log,0,client sent plain HTTP request to HTTPS port);ngx_http_finalize_request(r,NGX_HTTP_TO_HTTPS);return;}sscfngx_http_get_module_srv_conf(r,ngx_http_ssl_module);if(sscf-verify){rcSSL_get_verify_result(c-ssl-connection);if(rc!X509_V_OK(sscf-verify!3||!ngx_ssl_verify_error_optional(rc))){ngx_log_error(NGX_LOG_INFO,c-log,0,client SSL certificate verify error: (%l:%s),rc,X509_verify_cert_error_string(rc));ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_CERT_ERROR);return;}if(sscf-verify1){certSSL_get_peer_certificate(c-ssl-connection);if(certNULL){ngx_log_error(NGX_LOG_INFO,c-log,0,client sent no required SSL certificate);ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_NO_CERT);return;}X509_free(cert);}if(ngx_ssl_ocsp_get_status(c,s)!NGX_OK){ngx_log_error(NGX_LOG_INFO,c-log,0,client SSL certificate verify error: %s,s);ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_CERT_ERROR);return;}}}#endifif(c-read-timer_set){ngx_del_timer(c-read);}#if(NGX_STAT_STUB)(void)ngx_atomic_fetch_add(ngx_stat_reading,-1);r-stat_reading0;(void)ngx_atomic_fetch_add(ngx_stat_writing,1);r-stat_writing1;#endifc-read-handlerngx_http_request_handler;c-write-handlerngx_http_request_handler;r-read_event_handlerngx_http_block_reading;ngx_http_handler(r);}ngx_http_process_request 函数 在完整接收 HTTP 请求头后被调用 主要完成 HTTPS 安全校验明文检测、客户端证书验证、OCSP 装订状态检查 清理读取阶段的超时定时器切换读写事件处理器 并将请求移交至核心处理流水线 ngx_http_handler。2 详解1 函数签名voidngx_http_process_request(ngx_http_request_t*r)无返回值参数 ngx_http_request_t *r 当前请求的请求结构体2 逻辑流程1 获取连接对象 2 SSL 处理 3 清理读超时定时器 4 统计桩 5 切换事件处理器 6 进入请求处理阶段1 获取连接对象{ngx_connection_t*c;cr-connection;从请求结构体中取出连接对象2 SSL 处理#if(NGX_HTTP_SSL)if(r-http_connection-ssl){longrc;X509*cert;constchar*s;ngx_http_ssl_srv_conf_t*sscf;if(c-sslNULL){ngx_log_error(NGX_LOG_INFO,c-log,0,client sent plain HTTP request to HTTPS port);ngx_http_finalize_request(r,NGX_HTTP_TO_HTTPS);return;}sscfngx_http_get_module_srv_conf(r,ngx_http_ssl_module);if(sscf-verify){rcSSL_get_verify_result(c-ssl-connection);if(rc!X509_V_OK(sscf-verify!3||!ngx_ssl_verify_error_optional(rc))){ngx_log_error(NGX_LOG_INFO,c-log,0,client SSL certificate verify error: (%l:%s),rc,X509_verify_cert_error_string(rc));ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_CERT_ERROR);return;}if(sscf-verify1){certSSL_get_peer_certificate(c-ssl-connection);if(certNULL){ngx_log_error(NGX_LOG_INFO,c-log,0,client sent no required SSL certificate);ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_NO_CERT);return;}X509_free(cert);}if(ngx_ssl_ocsp_get_status(c,s)!NGX_OK){ngx_log_error(NGX_LOG_INFO,c-log,0,client SSL certificate verify error: %s,s);ngx_ssl_remove_cached_session(c-ssl-session_ctx,(SSL_get0_session(c-ssl-connection)));ngx_http_finalize_request(r,NGX_HTTPS_CERT_ERROR);return;}}}#endif3 清理读超时定时器if(c-read-timer_set){ngx_del_timer(c-read);}检查连接的读事件是否设置了超时定时器 如果设置了则删除该定时器。 因为请求头已经完整接收旧的超时限制不再适用后续会由新的事件处理逻辑设定新的超时。 这避免了误超时导致的连接关闭。4 统计桩#if(NGX_STAT_STUB)(void)ngx_atomic_fetch_add(ngx_stat_reading,-1);r-stat_reading0;(void)ngx_atomic_fetch_add(ngx_stat_writing,1);r-stat_writing1;#endif更新统计桩5 切换事件处理器c-read-handlerngx_http_request_handler;c-write-handlerngx_http_request_handler;r-read_event_handlerngx_http_block_reading;将连接级的读事件回调函数和写事件回调函数都设置为 ngx_http_request_handler。 这是 Nginx HTTP 请求状态机的核心事件处理函数 它会根据当前请求的 read_event_handler 和 write_event_handler 字段 分派具体的读写逻辑。 这里统一接管标志着连接从专用的“读取请求头”回调切换到了通用的请求处理回调。将请求层面的“读事件处理器”设置为 ngx_http_block_reading。 这是一个特殊的函数其作用是忽略或暂缓读事件 除非某些模块如读取请求体显式地将其替换为实际读取函数。 这确保了在初始阶段Nginx 不会意外地尝试从连接中读取更多数据 干扰后续处理流程例如等待生成响应或读取请求体。这部分代码是为了在进入下一步处理前设置好正确的环境 本质上就是先初始化好安全的异步环境 再启动复杂的业务逻辑 避免了“先运行业务然后业务中触发了事件结果发现回调还是旧的”这类竞态问题。6 进入请求处理阶段ngx_http_handler(r);}调用核心处理函数 ngx_http_handler 将请求 r 送入 HTTP 处理阶段流水线。 该函数会按顺序执行 11 个阶段 直到生成响应或遇到错误。 从这一行起请求正式进入内容生成与处理的核心环节。