Nginx反向代理内存非线性增长主因是缓冲区、SSL缓存等资源在连接上重复分配或滞留;应设worker_rlimit_memory限值、精调proxy_buffers与client_body_buffer_size、共享SSL会话缓存、缩短keepalive_timeout,并关闭非必要日志及请求体落盘。

Nginx 作为反向代理时,worker 内存随连接数增加出现非线性增长,根本原因不是连接本身耗内存多,而是缓冲区、SSL 缓存、临时文件等资源在每个连接上被重复分配或长期滞留。控制关键在于让内存分配可预期、可回收、不累积。
限制单个 worker 进程内存上限
每个 worker 是独立进程,内存不共享。未设上限时,高并发下容易因缓冲区叠加、SSL 会话缓存膨胀而陡增。启用 worker_rlimit_memory 可强制约束:
- 在 main 块中添加 worker_rlimit_memory 512M;(根据机器内存和 worker 数合理设置,如 4 核机器配 4 个 worker,总内存建议不超过物理内存的 60%)
- 超限时 worker 主动退出并由 master 重启,避免内存泄漏持续积累
- 配合 worker_processes auto; 和 worker_cpu_affinity auto;,减少跨核调度带来的缓冲区冗余
精调代理缓冲区与请求体大小
proxy_buffers、client_body_buffer_size 等是内存“隐形大户”,尤其在大响应或上传场景下易指数级放大:
- 关闭不必要的缓冲:proxy_buffering off;(适用于后端已流式响应、且无需 Nginx 中转缓存的场景,如 SSE 或 gRPC-Web)
- 若需开启缓冲,缩小单位尺寸:proxy_buffer_size 4k; + proxy_buffers 8 4k;(避免默认 8×64k 导致单连接占用 512KB)
- 严格限制上传:client_max_body_size 10m;(远低于默认 1G),防止一个大文件触发多级缓冲区扩容
优化 SSL 与连接生命周期管理
SSL 会话缓存和僵死连接是内存滞留主因,尤其在 keepalive 长连场景下:
- 禁用 per-worker 独立缓存:ssl_session_cache off;;如需复用,改用共享内存:ssl_session_cache shared:SSL:20m; + ssl_session_timeout 4h;
- 缩短空闲连接等待时间:keepalive_timeout 30s; + client_header_timeout 10s; + client_body_timeout 10s;
- 对长连接接口(如 SSE)单独配置 location,避免全局 timeout 影响其他业务
清理日志与临时文件间接开销
访问日志写入和临时磁盘文件虽不占 worker 堆内存,但会推高 page cache,并可能因 fsync 阻塞导致 worker 延迟退出:
- 关闭非必要日志:access_log off; 或使用 buffer+flush:access_log /var/log/nginx/access.log main buffer=64k flush=1s;
- 禁用请求体落盘:client_body_in_file_only off;(默认为 off,确认未被意外开启)
- 限制 open_file_cache 大小与活跃期:open_file_cache max=2048 inactive=30s; + open_file_cache_valid 60s;











