nginx 实现流量突增自动限流降级与告警需组合使用 limit_req 模块、prometheus+nginx-vts-exporter 监控及 alertmanager 告警;限流基于 ip 配置共享内存区与突发队列,监控暴露 qps 和限流丢弃数,promql 检测突增或大量丢弃并触发告警,动态调优需 lua/redis 或外部脚本 reload 配置。

在 Nginx 中实现“流量突增 → 自动限流降级 → 发送告警”需要组合使用 Nginx 原生模块(如 limit_req)、外部监控系统(如 Prometheus + Grafana)和告警触发机制(如 Alertmanager 或脚本),因为 Nginx 本身不支持直接发送告警或动态调整限流策略。
1. 用 limit_req 实现基础限流降级
Nginx 的 limit_req 模块可基于 IP 或 key 对请求速率做硬性限制,是突增流量下的第一道防线:
- 在
http块中定义共享内存区(用于统计请求数):limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s; - 在
server或location中启用限流,并配置突发容量与拒绝行为:limit_req zone=perip burst=20 nodelay;
(允许最多 20 个请求排队,超了直接返回 503) - 配合
limit_req_status 429;可统一返回 429,便于上游识别降级状态
2. 用 Prometheus + nginx-vts-exporter 监控实时流量
Nginx 自身日志难以实时感知突增,需引入指标暴露+时序存储:
- 编译或启用
nginx-vts-module(或使用 OpenResty 的ngx_http_prometheus_module),暴露/status/format/json或/metrics - 部署
nginx-vts-exporter(或直接用 Prometheus 的nginxlog_exporter解析 access log),将 QPS、5xx、限流命中数等转为 Prometheus 指标 - 关键指标示例:
nginx_vts_server_requests_total{host="api.example.com", status=~"5.."}nginx_vts_server_limit_requests_dropped_total{host="api.example.com"}
3. 用 PromQL 规则检测突增并触发告警
在 Prometheus 中配置 recording rule 或 alert rule,识别异常流量模式:
- 检测 QPS 突增(相比前 10 分钟均值上涨 300%):
rate(nginx_vts_server_requests_total{host="api.example.com"}[1m]) > (avg_over_time(rate(nginx_vts_server_requests_total{host="api.example.com"}[1m])[10m:1m]) * 3) - 检测限流大量触发(1 分钟内丢弃请求数 > 100):
increase(nginx_vts_server_limit_requests_dropped_total{host="api.example.com"}[1m]) > 100 - 告警规则输出到 Alertmanager,再由其转发至钉钉、企业微信或邮件
4. 进阶:自动动态调优限流阈值(需外部控制)
Nginx 不支持运行时热更新 limit_req_zone rate,但可通过以下方式近似实现“自动降级”:
- 用 Lua(OpenResty)读取 Redis 中的限流阈值,动态计算是否放行:
if tonumber(redis.get("qps_limit:api")) - 写一个运维脚本,当 Alertmanager 触发「流量突增」告警时,自动修改 Nginx 配置中的
rate=值并执行nginx -s reload - 或对接服务网格(如 APISIX、Envoy),它们原生支持基于指标的自适应限流,比 Nginx 更适合闭环控制
不复杂但容易忽略:限流后务必记录被拒绝请求(limit_req_log_level error),并确保 access log 包含 $status 和 $request_time,否则监控和归因会断链。











