1 定义ngx_http_request_finalizer 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cstaticvoidngx_http_request_finalizer(ngx_http_request_t*r){ngx_log_debug2(NGX_LOG_DEBUG_HTTP,r-connection-log,0,http finalizer done: \%V?%V\,r-uri,r-args);ngx_http_finalize_request(r,0);}ngx_http_request_finalizer 函数是 请求终结回调函数 它做了两件事 记录调试日志 委托 Nginx 核心函数 ngx_http_finalize_request 完成资源释放、 状态机更新、响应发送与连接管理2 意义#1 ngx_http_request_finalizer 充当了 Adapter适配器 将双参数终结函数 ngx_http_finalize_request “降维”为单参数标准回调签名#2 语义隔离明确表达“正常终结”意图 ngx_http_finalize_request(r, rc) 是一个通用状态机推进函数。 rc 可以是 NGX_OK、NGX_ERROR、NGX_HTTP_INTERNAL_SERVER_ERROR 等 行为随 rc 变化 ngx_http_request_finalizer(r) 的命名和实现明确传递了一个语义 “按正常流程结束请求无错误码无特殊分支”。 这种设计符合 Command-Query Separation命令查询分离 和 单一职责原则。 业务代码看到 finalizer 就知道是“常规收尾” 无需关心底层状态机如何分支降低了认知负担和误用概率。#3 结束码固定为 0成功可是如果上层的 结束码 实际上不是 0 怎么办 rc 不是要返回给客户端的 HTTP 状态码如 200、404、500。 rc 是 Nginx 内部事件状态机的控制码用于决定“如何终结当前请求流程 NGX_OK “按当前请求已决定的状态正常收尾” NGX_ERROR “内部错误立即强制清理不发送响应” NGX_AGAIN “异步操作未完成挂起请求稍后继续” NGX_DONE “请求已处理完毕如已发送响应仅做连接级清理” ngx_http_request_finalizer 传 0 的真实含义是 “请求处理流程已走完请根据r对象里已经记录好的状态headers、status、body等 执行标准的收尾清理。” rc 0 时Nginx 完全信任 r-headers_out.status 的值。 只要上层模块在调用 finalizer 之前设置了状态码无论成功还是错误 finalize_request 都会按该状态码响应客户端。固定传 0 只是说“不要主动干预状态按现有状态走”。