Nginx高并发短连接日志反向代理优化复盘总结
文章总结了Nginx高并发短连接日志反向代理的优化实践。核心问题包括:出站端口耗尽、TIME-WAIT堆积(最高近8万)、499客户端断连、配置不规范及路由权限漏洞。优化方案:配置上启用HTTP/1.1长连接复用、缩短代理超时至10秒、修复WebSocket配置错误、添加IP白名单;内核层面开启tcp_tw_reuse、调整端口范围、缩短TCP超时参数;可选iptables跳过连接跟踪。最终解决了连接资源耗尽问题,并指出云上CLB/ALB无法替代Nginx外联代理能力。
一、业务概述
业务为游戏道具变更日志上报反向代理服务,架构为:固定客户端服务器集群 → 自研Nginx代理节点 → 远端日志归集服务。整体为超高并发、高频新建销毁TCP短连接模型,QPS吞吐量大、连接生命周期极短。
本次优化前持续出现:出站端口耗尽、海量TIME-WAIT堆积、少量499客户端断连报错、Nginx配置不规范、路由权限漏洞、内核参数不合理等问题,同时完成云上负载均衡架构可行性调研。
二、优化前核心问题汇总
1. 网络层问题(严重)
-
Nginx反向代理出站短连接海量堆积,TIME-WAIT最高近8万,触发
Cannot assign requested address本机端口分配失败,导致上报失败 -
系统内核TCP、nf_conntrack超时参数偏保守,僵连接、半关闭连接回收极慢
-
连接跟踪表易爆满,存在丢包、请求抖动风险
2. Nginx配置问题
-
原始代理超时 300s 过大,大量僵连接长期占用连接资源
-
错误配置 WebSocket 升级请求头,破坏HTTP1.1长连接复用,加剧短连接泛滥
-
keepalive配置位置非法,导致启动报错、无法启用后端连接池 -
多Location重复冗余配置,维护性差
-
存在路由权限漏洞:部分接口绕过全局IP白名单,公网可直接访问,存在脏数据刷库风险
3. 业务异常日志问题
-
线上出现少量 499 Client Closed Request 报错
-
根因:上游Java客户端HTTP超时仅1s,后端偶发毫秒级处理毛刺,客户端主动断开TCP连接,非服务端故障
4. 云上架构可行性结论
阿里云CLB/ALB无法脱离ECS独立完成跨公网反向代理,仅能做流量入口,不能替代现有Nginx外联代理能力;如需彻底去ECS运维,可采用函数计算FC Serverless方案。
三、最终落地优化配置
1. 优化后 Nginx 完整配置
upstream backend {
server xxx.xxx.com;
keepalive 256;
}
server{
listen 80;
server_name log-proxy.xxx.com;
index index.html index.php index.htm;
# 全局业务出口IP白名单
allow 网段/掩码;
allow 业务节点IP;
deny all;
access_log /data/nginx_logs/xxx.log main;
# 全局统一代理超时(解决僵连接堆积)
proxy_connect_timeout 10s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
# 开启HTTP1.1长连接复用,彻底解决短连接泛滥
proxy_http_version 1.1;
proxy_set_header Connection "";
# 客户端连接兜底超时
client_header_timeout 5s;
client_body_timeout 5s;
keepalive_timeout 15s;
# 通用路由
location = /item/xxxx {
#恶意拦截IP
deny x.x.x.x;
deny x.x.x.x;
access_log /data/logs/xxx_1.log main;
proxy_pass http://backend/xxxx/;
}
# 动态ID正则路由
location ~ ^/item/(?<id>\d+)$ {
proxy_pass http://backend/xxxxx/;
}
# 兜底404
location / {
return 404;
}
}
2. 高并发短连接专用内核 sysctl 优化
# 开启TIME-WAIT端口快速复用(核心优化)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1
# 缩短TCP挥手超时
net.ipv4.tcp_fin_timeout = 25
# 全开本地出站端口区间
net.ipv4.ip_local_port_range = 1024 65535
# 限制最大TIME-WAIT数量、孤儿连接上限
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.tcp_max_orphans = 262144
# 连接跟踪表上限
net.netfilter.nf_conntrack_max = 1048576
# 极速回收各类TCP状态连接,适配超高并发短连接
net.netfilter.nf_conntrack_tcp_timeout_established = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20
生效命令:sysctl -p
3. 极致优化:出站流量跳过连接跟踪(可选)
iptables -t raw -A OUTPUT -d 远端域名 -j NOTRACK
iptables -t raw -A PREROUTING -s 远端域名 -j NOTRACK
4. 499 异常问题解决方案
现象定性:零星499为客户端超时主动断连,非服务端故障,属于高并发业务正常噪声。
根治方案(业务侧):上游Java客户端将1s超时上调至3~5s
屏蔽日志方案(Nginx侧)(server块添加):
proxy_ignore_client_abort on;
四、优化效果验证
-
端口耗尽问题彻底解决:TIME-WAIT峰值79000+ 稳定回落至9000左右平稳震荡,不再出现端口分配失败
-
长连接复用生效:后端连接池正常工作,短连接新建频率大幅降低,TCP资源开销显著下降
-
安全漏洞修复:所有路由统一受全局IP白名单管控,杜绝公网非法刷量、脏数据注入风险
-
内核网络稳定性提升:连接快速回收,消除conntrack表满丢包隐患
-
异常可控:499报错根因明确,可通过业务微调彻底消除
五、TCP并发容量说明
-
入站流量(客户端→本机):单固定源IP最大并发上限为系统临时端口池 64512,不消耗本机出站端口资源,容量充足
-
出站流量(本机→远端):受临时端口、文件句柄、连接跟踪三重限制,通过长连接池+内核优化,彻底解决高并发瓶颈
六、后续运维建议
-
日常监控
ss -s连接状态,重点观测 TIME-WAIT 波动,防止流量突增复现资源堆积 -
持续监控499状态码趋势,突增时排查客户端超时、网络抖动、后端处理延迟
-
长期架构优化:如需彻底免除ECS运维,可调研Serverless函数计算FC替代现有Nginx节点,实现无服务器化反向代理