1 定义
ngx_http_request_finalizer 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.c
staticvoidngx_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 只是说“不要主动干预状态,按现有状态走”。