Apache原生不支持QPS级限流,需组合mod_qos(路径级粗粒度)、mod_security(IP+路径细粒度)、连接层防护及日志监控实现全链路限流。

Apache 本身不提供开箱即用的“每秒请求数(QPS)”级接口限流能力,尤其对内部 API 接口做精准频控时,原生模块能力有限。真正有效的方案是组合使用轻量、可靠、已在生产验证过的第三方模块,并聚焦在真实消耗资源的环节——不是数请求,而是管连接、控入口、筛路径。
H3:优先用 mod_qos 做路径级粗粒度限流(推荐起步)
mod_qos 是目前 Apache 生态中对 API 接口限流最实用的模块,支持按 Location + Host 匹配,能返回标准 429 状态码,且无需重写业务逻辑。
确保已加载模块:
LoadModule qos_module modules/mod_qos.so
在对应虚拟主机或全局配置中加入:
<IfModule qos_module>
# 全局基础防护
QS_SrvMaxConnPerIP 15
QS_SrvMaxConn 300
# 针对内部 API 路径(如 /api/internal/)
<Location "/api/internal/">
QS_LocRequestLimit 20 # 每秒最多 20 个请求进入该路径
QS_LocRequestLimitAction 429 # 触发时返回 429 Too Many Requests
</Location>
</IfModule>✅ 优势:生效快、规则清晰、状态码规范
⚠️ 注意:计数精度为秒级,无滑动窗口;不区分 method 或 query 参数;需确认 mod_qos 版本 ≥ 11.68 才支持 QS_LocRequestLimitAction
H3:用 mod_security 实现 IP+路径组合的轻量计数(适合登录/提交类接口)
对 /api/internal/login 或 /api/internal/submit 这类高敏感接口,可借助 mod_security 的变量计数能力,实现更细粒度控制:
<IfModule security2_module>
SecRuleEngine On
SecRequestBodyAccess Off # 不解析请求体,降低开销
# 对登录接口:IP + User-Agent 组合计数(防工具枚举)
SecRule REQUEST_HEADERS:Host "@streq internal.example.com" \
"id:1001,phase:1,pass,setvar:ip.login_count=+1,expirevar:ip.login_count=60"
SecRule ip:login_count "@gt 5" \
"id:1002,phase:1,deny,status:429,msg:'Too many login attempts'"
# 可选:排除健康检查路径
SecRule REQUEST_URI "@streq /health" "id:1003,phase:1,allow,nolog"
</IfModule>✅ 优势:支持自定义 key(如 IP+UA)、可设 TTL、拦截阶段早、不渲染页面
⚠️ 注意:需启用 SecResponseBodyAccess Off 避免响应体解析开销;规则写在 <virtualhost></virtualhost> 内更安全
H3:配合内核与连接层防护,堵住绕过漏洞
限流若只做在 HTTP 层,攻击者可能用慢速连接(Slowloris)或 TCP 半连接耗尽资源。必须同步加固底层:
-
控制每个 IP 并发连接数(防连接打满):
<IfModule limitipconn_module> MaxConnectionsPerIP 5 </IfModule>
-
调整系统内核参数(写入
/etc/sysctl.conf):net.ipv4.tcp_synack_retries = 3 net.ipv4.tcp_syncookies = 1
执行
sysctl -p生效。 若用 CDN 或反向代理(如 Nginx),建议把限流逻辑前移到网关层,Apache 专注转发。
H3:用日志 + 脚本做事后监控与告警(低成本兜底)
限流不是万能的,日常需观察是否真被触发。直接解析 Apache access.log 即可:
统计最近 1 分钟 /api/internal/ 的调用量:
awk '$4 ~ /\['$(date -d '1 minute ago' '+%d\/%b\/%Y:%H:%M')/ && $7 ~ /"GET \/api\/internal\// {c++} END {print c+0}' /var/log/apache2/access.log结合 cron 每 5 分钟跑一次,超阈值发邮件或写入监控系统(如 Prometheus + node_exporter 自定义指标)。
不复杂但容易忽略


















