应精准识别接口特征并用自定义map变量(如$cache_endpoint)构造限流键,配合limit_conn_zone实现接口级并发控制;再叠加IP维度限制形成双层防护,同时优化keepalive_timeout以释放空闲连接。

针对核心缓存接口(如 /api/cache、/v1/lookup 等)做并发连接管控,关键不是“全局一刀切”,而是精准识别接口特征 + 高效计数 + 低开销拦截。limit_conn_zone 本身不直接识别路径,必须配合变量构造区分键,再在 location 中绑定限制规则。
用 $uri 或 $request_uri 构造接口粒度的连接池
缓存接口通常路径固定、参数较少,适合用 URI 做限流维度。但注意:
– $uri 不含 query string,适合路径唯一、参数走 body 或 header 的场景(如 /api/cache/get);
– $request_uri 含完整 URL,若带高频变动参数(如 timestamp、nonce),会导致键爆炸,不推荐;
– 更稳妥的做法是自定义 map 变量,把目标接口映射为统一标识:
map $uri $cache_endpoint {
~^/api/cache/ "cache_api";
~^/v1/lookup "lookup_v1";
~^/internal/refresh "refresh_internal";
default "";
}
然后在 http 块中定义 zone:
limit_conn_zone $cache_endpoint zone=cache_conn:5m;
5MB 内存可容纳约 16 万个独立键值(每个键约 32 字节),足够支撑数十个核心接口的独立计数。
在 location 中启用并绑定限制策略
只对明确标记为缓存类的 location 生效,避免误伤其他流量:
- location 匹配需精确或前缀匹配,例如:
location ^~ /api/cache/ { ... } - 内部调用路径(如后端服务直连)也应纳入,比如
location /internal/refresh { ... } - 配置示例:
location ^~ /api/cache/ {
limit_conn cache_conn 20; # 每个接口路径最多 20 并发连接
limit_conn_status 429; # 返回 429 Too Many Requests,语义更准确
limit_conn_log_level warn; # 触发时记 warn 日志,便于监控告警
proxy_pass http://cache_backend;
}
结合真实客户端 IP 实现双层防护
仅按接口限流可能被单个恶意客户端打穿(例如一个 IP 发起 20 个不同缓存路径请求)。建议叠加 IP 维度限制:
- 定义 IP 连接池:
limit_conn_zone $binary_remote_addr zone=ip_conn:10m; - 在同 location 中叠加:
limit_conn ip_conn 8; - 效果:任一客户端对任意缓存接口,最多维持 8 个 TCP 连接;同时所有客户端访问
/api/cache/总连接数不超过 20 - 二者是“与”关系,任一超限即拒绝,且返回状态码以
limit_conn_status为准(后者优先级更高)
注意 keepalive 和 HTTP/2 的实际占用
缓存接口常开启长连接,但空闲 keepalive 连接仍占用配额:
- 设置
keepalive_timeout 10;缩短空闲连接生命周期,避免“僵尸连接”长期占位 - HTTP/2 下,一个 TLS 连接可承载多个 stream,但 limit_conn 仍只计为 1 个连接——这对缓存类接口反而是优势,无需额外适配
- 若后端是 HTTP/1.1 且复用连接频繁,建议配合
limit_rate控制单连接吞吐,防止单连接拖慢整体响应










