宝塔面板限流依赖Nginx的limit_req模块,需手动配置limit_req_zone(置于http块)和limit_req(置于server或location块),支持按IP或接口精准限流,并须自定义503错误页及校验重载。

宝塔面板里限流用的是 Nginx 的 limit_req 模块
宝塔本身不提供图形化限流开关,所有限流逻辑都靠手动编辑 Nginx 配置,底层依赖 limit_req_zone 和 limit_req 这两个指令。如果你在面板里找“防刷”“限速”按钮,大概率会空手而归——那只是访问控制或防火墙的简易规则,和真正按 IP 或 key 限并发请求不是一回事。
实操建议:
- 先确认你的 Nginx 编译时启用了
--with-http_limit_req_module(宝塔默认安装已包含,但自定义编译的可能没开) - 限流配置必须写在
http块(全局生效)或server块(单站点),不能只丢在“网站-配置文件”的location里就完事 - 别把
limit_req_zone放进server块——Nginx 启动会报错:limit_req_zone directive is not allowed here
怎么写一个按 IP 限流的配置(每秒最多 5 个请求)
这是最常用也最容易出错的场景:想拦住扫描器或脚本刷首页,但又不想误伤正常用户。关键在于 zone 定义位置、key 的选择,以及 burst 和 nodelay 的配合。
实操建议:
- 在 Nginx 主配置(
/www/server/nginx/conf/nginx.conf)的http块开头添加:limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
- 在对应网站的
server块里加:limit_req zone=perip burst=10 nodelay;
-
burst=10表示允许突发 10 个请求排队,超过才直接 503;nodelay不延迟执行,适合防爆刷(否则排队请求会拖慢响应) - 别用
$remote_addr当 key——IPv4 映射到 IPv6 时会失效;$binary_remote_addr更紧凑且兼容性好
限制特定接口(比如 /api/login)比全站限流更稳妥
全站限流容易卡住静态资源或前端轮询,反而让页面白屏。真实攻击往往集中在登录、短信发送、搜索等接口,针对性限流效果更好,也更容易调参。
实操建议:
- 在网站配置文件的
location块里单独设限:location = /api/login {<br> limit_req zone=login burst=3 nodelay;<br>} - 为这类接口单独建 zone,避免和 IP 限流混用:
limit_req_zone $binary_remote_addr$uri zone=login:10m rate=3r/s;
(这样同一个 IP 访问不同接口互不影响) - 注意
=精确匹配优先级最高,但不支持通配符;如果要匹配/api/v1/login和/api/v2/login,得用~ ^/api/.*/login$ - 测试时用
curl -I看响应头是否有X-RateLimit-Limit或Retry-After(需自己加 header,Nginx 默认不返回)
限流后 503 错误页不友好?别改宝塔默认 503 页面
直接在宝塔“网站-错误页”里上传自定义 503.html,对 limit_req 触发的拒绝无效——Nginx 在进入 location 前就拦截了,根本不会走到你配的 error_page 路径。
实操建议:
- 必须在触发限流的 location 或 server 块里显式指定:
error_page 503 /503.html;<br>location = /503.html {<br> root /www/wwwroot/your-site;<br> internal;<br>} -
internal是必须的,否则用户能直接访问 /503.html 绕过限制 - 别用相对路径写
root,宝塔里常见填成./或../,会导致 404;务必写绝对路径,比如/www/wwwroot/myapp - 修改完配置后,用
nginx -t校验语法,再nginx -s reload——宝塔面板点“重载配置”有时会跳过校验,悄悄失败
真正难的不是写那几行配置,而是想清楚“谁该被限”“在哪一级限”“被限后怎么反馈”。很多人加了限流却没观察 access.log 里的 503 计数,结果攻击流量照旧,还以为是配置没生效。











