nginx中tcp代理配置连接限流防止资源耗尽

在 Nginx 中对 TCP 代理(如使用 stream 模块)做连接限流,是防止恶意或突发连接打爆后端服务、耗尽系统资源(如文件描述符、内存、CPU)的关键手段。核心在于限制单位时间内的新建连接数,而非已建立连接的带宽或请求数。

启用 stream 模块并定义限流区域

Nginx 默认不编译 stream 模块,需确认安装时启用了 –with-stream。配置限流前,先在 http 块外(通常在 nginx.conf 全局层级)定义连接限流区域:

使用 stream 上下文中的 limit_conn_zone 指令,基于客户端 IP($binary_remote_addr)创建共享内存区 例如:limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; —— 表示为每个 IP 分配最多 10MB 共享内存来记录连接状态,实际可支撑约 16 万个独立 IP 的计数 注意:stream 模块不支持 limit_req(请求速率),只支持 limit_conn(并发连接数限制)

在 server 块中应用连接限制

在 stream 的 server 块内,用 limit_conn 应用之前定义的 zone:

例如:limit_conn conn_per_ip 10; —— 限制单个客户端 IP 最多同时建立 10 个 TCP 连接 可叠加全局限制:limit_conn addr 1000;(需提前定义 limit_conn_zone $server_addr zone=addr:10m;),限制本机所有监听地址总连接数不超过 1000 触发限流时,Nginx 直接拒绝新连接(发送 RST),不转发也不排队,响应极快,开销低

配合超时与资源控制提升健壮性

仅靠限流不够,还需避免连接长期空闲占用资源:

设置合理的连接超时:proxy_timeout 30s;(默认 60s),及时释放无活动连接 调高系统级限制:检查 fs.file-max、用户级 ulimit -n,确保 Nginx worker 能打开足够文件描述符(建议 ≥ 65536) 限制每个 worker 进程最大连接数:worker_connections 4096;(写在 events 块),避免单个进程过载 启用连接复用(若后端支持):proxy_buffering off; + proxy_pass_request_headers off; 可减少部分开销,但 TCP 层本身不复用连接

验证与监控限流是否生效

限流行为不会记录在默认 access log(stream 日志需单独配置),需主动验证:

开启 stream 日志:access_log /var/log/nginx/stream.log main;(在 stream 块中),日志格式需包含 $status,限流拒绝时状态码为 503 用 ab 或 weighttp 模拟并发连接,观察连接失败率和日志中 503 数量 运行 ss -s 或 netstat -an | grep :port | wc -l 查看当前 ESTABLISHED 连接数,对比限流阈值 通过 nginx -t && nginx -s reload 热重载配置,限流策略即时生效,无需重启

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。