nginx 中代理请求资源回收由请求生命周期自动完成,所有 proxy 内存均绑定至 r->pool,随请求结束时 ngx_destroy_pool 整体销毁;无手动释放接口,异常中断或子请求完成时亦触发对应清理。

代理请求的资源回收在 Nginx 中不是靠手动释放,而是由请求生命周期自动驱动的。核心原则是:所有 proxy 相关内存都归属请求级内存池 r->pool,它随请求创建而分配、随请求结束而整体销毁。
proxy 使用的内存全部绑定到请求池
ngx_http_proxy_module 本身不维护独立内存池,所有动态资源均从当前请求的 r->pool 分配,包括:
- 重写后的
proxy_passURL 字符串(如含$uri变量展开结果) - 通过
proxy_set_header添加或覆盖的 header 值及其结构体 -
ngx_http_proxy_ctx_t上下文对象(即使proxy_buffering off也存在) - upstream 连接所需的
ngx_http_upstream_t及 peer 上下文 - 缓冲区元数据(如
ngx_chain_t链、buffer 描述符),即使 body 缓冲区本身由 slab 管理
真正有效的“回收”只发生在请求终止时
没有 free() 类接口,也不应尝试局部释放。回收动作是隐式且不可干预的,触发时机如下:
- 请求正常返回响应后,Nginx 调用
ngx_destroy_pool(r->pool),整个池连同所有子分配一并清空 - 客户端断连、超时、内部错误等异常中断时,Nginx 执行清理钩子(如
ngx_http_upstream_cleanup),关闭 socket 并最终销毁r->pool - 子请求(subrequest)完成时,其专属子池
sr->pool被销毁,不影响主请求池
影响内存驻留的关键配置点
虽然回收机制固定,但以下配置会显著改变单个请求的内存占用规模和持续时间:
-
client_body_buffer_size:控制请求体内存缓冲上限。设过大(如 1M)会导致小请求也长期占用冗余内存;建议按业务分级,API 接口设 16K–64K,上传入口保持默认 8K 或略增 -
proxy_buffering开关:关闭时(off)不分配大块响应 body 缓冲区,内存最低,适合流式响应;开启时需配合proxy_buffers和proxy_busy_buffers_size合理设限,避免 buffer 链过长 -
worker_rlimit_as:限制单 Worker 进程最大虚拟内存(推荐 512M–1G),防止个别异常请求拖垮整个进程,是兜底保护机制
开发与调试注意事项
若编写自定义 proxy 模块或 patch,必须遵守 Nginx 内存约定:
- 只使用
r->pool(或子请求的sr->pool)分配请求级资源 - 禁止调用
malloc、free或复用全局池(如cycle->pool) - 避免在 handler 中长期持有对
r->pool分配对象的外部引用,否则可能引发 use-after-free











