Nginx通过limit_rate、limit_conn和client_max_body_size三重机制限制单客户端总流量:限速单连接带宽,限制并发连接数,约束上传大小与超时,辅以缓冲机制减轻后端压力。

限制单个客户端总流量,本质是控制其单位时间内的数据吞吐量,而非请求数或连接数。这在防 CC 攻击中特别有效——当攻击者反复下载大文件、刷接口返回大量响应体,或上传巨型 payload 时,带宽和磁盘 I/O 成为瓶颈。Nginx 本身不直接统计“总流量(字节)”,但可通过 限速 + 连接数 + 响应体大小限制 三重组合,实现对单客户端总流量的实质性压制。
用 limit_rate 控制单连接传输速率
这是最直接的手段:对每个 TCP 连接强制限速,让单次连接无法持续占用高带宽。
- 作用范围:在 location 或 server 块中配置,影响该路径下所有响应(下载、API 返回、静态资源)
-
典型配置:
limit_rate 200k;表示每个连接最大下载速度为 200 KB/s;limit_rate_after 1m;可设为“前 1MB 不限速,之后限速”,兼顾首屏体验 - 适用场景:防止恶意下载图片/视频/安装包;限制 API 返回超长 JSON 导致的出口带宽打满
用 limit_conn 配合 $binary_remote_addr 控制并发连接上限
即使单连接限速了,攻击者仍可开 100 个连接同时下载——总流量仍是 200k × 100 = 20MB/s。所以必须同步限制并发数。
-
关键配置:
limit_conn_zone $binary_remote_addr zone=perip:10m;<br>location /download/ {<br> limit_conn perip 2;<br> limit_rate 500k;<br>} - 效果说明:同一 IP 最多只能建立 2 个并发连接,每个连接不超过 500KB/s → 单 IP 总出口带宽被硬封顶在 1MB/s
-
注意:对纯文本类网站(如博客),设为
limit_conn perip 1通常不影响正常浏览,因为浏览器一般只保持少量空闲连接
用 client_max_body_size 和 client_body_timeout 防止上传耗尽资源
CC 攻击也可能通过伪造大文件上传拖垮服务:占满磁盘、耗尽内存缓冲区、阻塞 worker 进程。
-
上传大小限制:
client_max_body_size 4m;(全局或 location 级),超出直接返回 413 错误 -
上传超时控制:
client_body_timeout 10s;,若客户端 10 秒内未发完 body,连接关闭 -
补充建议:对上传接口(如
/api/upload)单独加limit_req,例如每分钟最多 3 次请求,避免被轮询刷上传入口
配合 proxy_buffering 和 fastcgi_buffering 减少后端压力
限速和限连只管 Nginx 本层,但若后端(PHP、Python)仍需完整生成大响应,CPU 和内存照样被打满。开启缓冲可让 Nginx 接收完再转发,避免后端长时间阻塞。
-
proxy_buffering on;(反向代理场景) -
fastcgi_buffering on;(PHP-FPM 场景) - 搭配
proxy_buffer_size和proxy_buffers合理设置缓冲区大小,避免小缓冲导致频繁写磁盘


















