Nginx无法实现网络层透明代理,所谓“透明”实为反向代理或SSL Passthrough;真透明需iptables+TPROXY组合,业务中应优先用X-Forwarded-For透传真实IP或stream模块做四层转发。

核心是让 Nginx 专注做“透明管道”,不参与业务、不缓存数据、不维持冗余状态。内存和文件描述符(句柄)暴涨,往往不是连接数多,而是配置错把长连接当短连接处理,或代理层悄悄干了不该干的事。
精简代理职责,禁用所有非转发功能
WebSocket 代理只需透传字节流,其余一概不管:
- 关闭压缩:在 location 块中加 proxy_set_header Sec-WebSocket-Extensions "",防止后端启用 permessage-deflate 时,Nginx 内部缓存压缩上下文导致内存堆积
- 禁用缓冲:设 proxy_buffering off; proxy_buffer_size 0; proxy_buffers 8 0;,避免 Nginx 为每条连接分配 buffer 并累积小块内存碎片
- 跳过解析逻辑:不基于
location /ws/chat/做路径鉴权或路由分组;所有/ws/*统一透传,路由和权限由后端网关完成 - 关闭日志:生产环境设 access_log off; error_log /dev/null warn;,消除高频字符串拼接与 I/O 分配开销
严控连接生命周期,防“僵尸连接”驻留
大量空闲但未关闭的连接,是句柄和内存占用飙升的主因:
- 设置合理超时:proxy_read_timeout 60;(不是默认值,而是握手+空闲总时长上限),proxy_send_timeout 10;,避免心跳卡住拖住连接
- 限制上游复用:upstream { keepalive 32; },控制每个 worker 向后端维持的长连接池大小,防止为每个客户端独占后端连接
- 前置限频:用 limit_req zone=ws_conn burst=5 nodelay; 控制单 IP 每分钟建连次数,过滤爬虫、异常重连或前端 bug 导致的风暴
系统级资源扩容与底层调优
Nginx 配置再轻量,也跑不出系统限制:
- 提升文件描述符上限:在 /etc/security/limits.conf 中添加 * soft nofile 1048576 和 * hard nofile 1048576
- 调整内核参数:在 /etc/sysctl.conf 中设 net.core.somaxconn = 65535、net.ipv4.tcp_tw_reuse = 1、net.ipv4.ip_local_port_range = 1024 65535
- Nginx 主配置中启用:worker_rlimit_nofile 1048576;,并在 events 块中设 worker_connections 65535;
- 优化内存分配:启动时加 -g "worker_rlimit_core 2G;",配合 working_directory /var/tmp,便于后续分析 core 文件定位碎片源头
监控关键指标,快速定位真实瓶颈
别只看总内存,要盯住进程健康度:
- 采集 nginx_connections_active 和 process_resident_memory_bytes(通过 Prometheus 或 nginx -s status)
- 定期执行 pstack
,若大量线程停在 SSL_read,说明 TLS 握手阻塞,需换 ECDSA 证书或升级 OpenSSL - 检查 ss -s 输出中的
tw(TIME_WAIT)数量,若远超预期,说明客户端断连异常或超时设置不合理











