nginx在https中限流需tls终结于自身,否则limit_req/limit_conn失效;支持limit_conn(并发连接数)和limit_req(请求速率)两种方式,须正确配置ssl终止、真实ip识别及zone大小。

Nginx 在 HTTPS 环境中限制连接请求频率,本质是复用标准限流机制,但需确保 HTTPS 流量被 Nginx 正确终结——只有解密后的明文 HTTP 请求才能被 limit_req 或 limit_conn 模块识别和控制。只要 TLS 终结在 Nginx 层,协议加密不影响限流逻辑。
必须先确认 HTTPS 由 Nginx 终结
若前端有云 WAF、四层 LB 或 SSL Passthrough 配置,Nginx 收到的是加密 TCP 流,无法解析 HTTP 请求头或 IP(可能仅看到代理 IP),此时 limit_req 将失效或误判。务必检查:
- 配置了
ssl_certificate和ssl_certificate_key -
listen 443 ssl;已启用 - 没有
proxy_protocol或stream块透传 TLS 流量
按需选择连接频率还是请求频率
二者目标不同,常配合使用:
-
限制并发连接数(
limit_conn)
控制同一客户端同时建立的 TCP 连接上限,防连接耗尽:```nginx http { limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; } server { listen 443 ssl; location / { limit_conn conn_per_ip 5; # 每个 IP 最多 5 个并发连接 } } ```
⚠️ 注意:该计数只包含“正在处理请求且已读完请求头”的连接,空闲 keepalive 连接不计入。 -
限制单位时间请求数(
limit_req)
更常用,基于漏桶算法控制请求速率,适合防刷、防爬:```nginx http { limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s; } server { listen 443 ssl; location /api/ { limit_req zone=req_per_ip burst=20 nodelay; } } ```
- `rate=10r/s`:每秒最多处理 10 个请求(精度达毫秒级) - `burst=20`:允许最多 20 个请求暂存队列,应对短时突发 - `nodelay`:队列中请求立即执行,不延迟排队;若去掉,则超限请求会等待释放令牌
关键细节不能忽略
-
$binary_remote_addr比$remote_addr更省内存,推荐用于高并发场景 -
zone大小要足够:1MB 约存 3.2 万个 IP 状态,10MB 可支撑数十万独立客户端 - 若使用 CDN 或反向代理,需用
set_real_ip_from+real_ip_header提取真实客户端 IP,否则限流对象会变成 CDN 节点 IP -
limit_req触发时默认返回 503,可通过limit_req_status 429改为标准限流状态码
不复杂但容易忽略。











