限制网络服务最大连接数的核心是防止服务因连接堆积耗尽fd、内存或线程资源,需三层设限:内核fs.file-max、进程limitnofile、应用连接池;配合connlimit防火墙兜底、keep-alive回收及可观测告警。

限制网络服务最大连接数,核心是防止单个服务因连接堆积而耗尽文件描述符(FD)、内存或线程资源,导致无法响应合法请求——这不是“端口被抢”,而是服务自身资源枯竭。关键不在堵流量,而在给每个服务划出不可突破的硬边界,并让连接生命周期可控。
分层设限:从内核到服务进程都不能漏
单一配置点必然失效,必须三层对齐:
-
内核全局上限:执行
sudo sysctl -w fs.file-max=2097152,并写入/etc/sysctl.conf持久化;确保系统总容量支撑预期并发 -
服务进程级 FD 限额:对 systemd 管理的服务(如 nginx、rsyslog),用
systemctl edit xxx.service添加LimitNOFILE=131072;/etc/security/limits.conf对这类服务基本无效 -
应用自身连接池控制:例如 rsyslog 的
imtcp模块启用maxconnections="200",Go HTTP Server 设置IdleTimeout,避免空闲连接长期占位
按连接态而非请求数限制,才防得住真实耗资源行为
慢速攻击(如 Slowloris)不发完整请求,只维持大量半开或 Keep-Alive 连接,此时仅限“每秒请求数”完全无效:
- Apache 推荐用
mod_qos:设QS_SrvMaxConnPerIP 10(单 IP 最多 10 个 ESTABLISHED/KEEPALIVE 连接),QS_SrvMaxConn 200(全局限额) - Nginx 用
limit_conn:在http块定义limit_conn_zone $binary_remote_addr zone=perip:10m,再于server块中写limit_conn perip 15 - 避免误用
mod_evasive或全站limit_req:它们只统计请求头到达频次,对已建立但空闲的连接毫无感知
防火墙层硬限,堵住绕过应用层的直连攻击
攻击者可能跳过 Web 服务,直接打 TCP 层。iptables connlimit 是低成本、高实效的兜底手段:
- 限制单 IP 对服务端口的并发连接数:
iptables -I INPUT -p tcp --syn --dport 8080 -m connlimit --connlimit-above 32 --connlimit-mask 32 -j REJECT --reject-with tcp-reset - 若用 Kubernetes + Service Mesh,优先在 Envoy Sidecar 中配
max_connections,按 Pod 实例粒度设限,比 IP 更准 - 注意区分场景:HTTP 网关可设 200–500,事件消费者类服务建议 10–20,数据库客户端通常需 10–50
配合连接回收与可观测性,让限制真正可运维
光拒绝连接不够,要能知、能断、能溯:
- 启用 TCP Keep-Alive:对长连接服务(如 rsyslog TCP 输入、自定义 HTTP 服务),设置合理
keepalive_timeout或IdleTimeout,加速空闲连接释放 - 关闭非必要模块:如 rsyslog 中注释掉未用的
omelasticsearch,减少后台线程及隐式 FD 占用 - 触发限流时主动上报指标(如
envoy_cluster_upstream_cx_overflow),接入 Prometheus 并设告警:连续 5 分钟溢出率 >5% 即标记服务健康度降级











