Nginx不能限制单IP总带宽,仅能按连接限速;需组合limit_rate(控制每连接响应速率)、limit_rate_after(跳过初始缓冲再限速)和limit_conn(限制单IP并发连接数)实现分层防护,单位为字节/秒,须置于location或server块中生效。

Nginx 本身不能真正限制“单 IP 的总下载带宽”,它只能对每个 TCP 连接单独限速。也就是说,用户开 3 个下载线程,实际速度就是 limit_rate × 3。但通过合理配置,可以有效约束常见下载行为,兼顾体验与资源保护。
按连接限速:最直接有效的做法
这是唯一开箱即用、无需额外模块的方案:
- 把 limit_rate 和 limit_rate_after 放在同一个
location块里,例如只对 ZIP、PDF、MP4 等静态资源生效 - 单位是字节/秒:
500k= 512,000 字节/秒 ≈ 488 KiB/s(不是 kbit/s) - 典型写法:
limit_rate_after 5m; limit_rate 200k;—— 前 5MB 不限速,之后恒定约 200KB/s - 注意:必须放在
location或server块中,不能只写在http顶层
按文件类型差异化限速
用 map 指令实现更精细控制,比单纯靠后缀匹配更可靠:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 在
http块中定义映射,例如根据 MIME 类型识别资源:map $sent_http_content_type $limit_rate_value {<br> default 0;<br> ~application/zip 512k;<br> ~application/pdf 256k;<br> ~video/ 1m;<br>} - 在对应
location中启用:limit_rate $limit_rate_value;<br>limit_rate_after 10m;
- 这样 PDF 下载慢一点,视频允许快些,ZIP 严格控速,逻辑清晰且可维护
防多连接绕过:叠加连接数限制
单靠 limit_rate 无法阻止用户开多个线程。需配合 limit_conn 控制并发连接数:
- 先在
http块中声明连接区:limit_conn_zone $binary_remote_addr zone=perip:10m; - 再在
location中限制同一 IP 最多 2 个并发下载连接:limit_conn perip 2; - 注意:
limit_conn和limit_rate是两个独立维度——前者管“能连几个”,后者管“每个连多快”
验证是否生效的实用方法
别信日志或响应头,实测才准:
- 用
curl -o /dev/null -s -w '%{speed_download}\n' http://x/file.zip查看平均下载速度 - 开多个终端同时下载,观察总速是否接近
limit_rate × 并发数 - 若启用了
sendfile on,Linux 下可能首包突增;建议加tcp_nodelay on;缓解 - 注意 HTTP/2 多路复用会让限速感知变弱,但机制依然有效

















