一、全局配置(nginx.conf)
http { # ===== 已有的(不用动) ===== limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; # ===== 需要新增(速率限制) ===== limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; }二、网站配置
server { location /app-api/ { # 1️⃣ 并发连接限制(每个IP最多5个同时连接) limit_conn perip 5; limit_conn_status 460; error_page 460 = @conn_limit; # 2️⃣ 请求速率限制(每个IP每秒最多5个请求) limit_req zone=one burst=10 nodelay; limit_req_status 461; error_page 461 = @rate_limit; } # 连接数超限响应(460) location @conn_limit { default_type application/json; return 460 '{"code":460,"type":"CONNECTION_LIMIT","msg":"连接数过多,最多5个并发","limit":5}'; } # 请求频率超限响应(461) location @rate_limit { default_type application/json; return 461 '{"code":461,"type":"RATE_LIMIT","msg":"请求频率过高,每秒最多5次","limit":"5r/s"}'; } }三、配置说明
| 配置项 | 作用 | 状态码 | 说明 |
|---|---|---|---|
limit_conn perip 5 | 每个IP最多5个同时连接 | 460 | 防并发攻击 |
limit_req zone=one rate=5r/s | 每个IP每秒最多5个请求 | 461 | 防高频攻击 |
四、两种限制的区别
| 对比 | 并发限制 | 速率限制 |
|---|---|---|
| 限制什么 | 同时占用的连接数 | 每秒发多少请求 |
| 攻击场景 | 慢连接、多连接 | 高频请求、爆破 |
| 配置 | limit_conn perip 5 | limit_req zone=one burst=10 |
| 状态码 | 460 | 461 |
五、操作步骤
1. 编辑全局配置
宝塔 → 软件商店 → Nginx → 设置 → 配置修改
在 http { } 中添加:limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;2. 编辑网站配置
宝塔 → 网站 → www.yougosz.com → 设置 → 配置文件
在 location /app-api/ { } 中添加限流配置3. 保存并重载
nginx -t
nginx -s reload
六、最终效果
恶意IP(221.229.x.x):
├── 同时超过5个连接 → 返回 460
├── 每秒超过5个请求 → 返回 461
└── 数据库连接池不会被耗尽 ✅正常用户:
├── 静态资源不限流 ✅
├── API请求正常 ✅
└── 体验不受影响 ✅
七、一句话总结
并发限制(
limit_conn)管"同时多少",速率限制(limit_req)管"每秒多快",两个都要配,才能彻底防止连接池被耗尽。