在 CentOS 上给 Laravel 做“限速”,通常分为 应用层限速 和 服务器层限速 两种思路。下面按常见场景给你总结。
Laravel 内置了 throttle 中间件。
Route::middleware('throttle:60,1')->group(function () {
Route::get('/api/user', 'UserController@index');
});
含义:
60:1 分钟内最多 60 次请求1:时间窗口(分钟)Route::middleware('throttle:api')->group(function () {
// routes
});
在 app/Providers/RouteServiceProvider.php 中:
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(100)->by($request->ip());
});
Route::post('/login', 'AuthController@login')
->middleware('throttle:5,1');
1 分钟最多 5 次登录尝试
RateLimiter::for('upload', function (Request $request) {
return Limit::perMinute(10)->by($request->user()?->id ?: $request->ip());
});
如果你的 Laravel 跑在 Nginx + PHP-FPM(CentOS 常见),可以用 Nginx 限速。
http {
limit_req_zone $binary_remote_addr zone=rate:10m rate=10r/s;
}
server {
location /api/ {
limit_req zone=rate burst=20 nodelay;
proxy_pass http://127.0.0.1:9000;
}
}
说明:
10r/s:每秒 10 个请求burst=20:允许突发 20 个location /download/ {
limit_rate 100k;
}
使用 iptables 或 firewalld 做 IP 限速(偏运维):
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute -j ACCEPT
⚠️ 不推荐用于业务接口限速,容易误伤。
Laravel 默认支持 Redis:
CACHE_DRIVER=redis
限流会自动使用 Redis,性能更好。
| 场景 | 推荐方式 |
|---|---|
| API 接口 | Laravel throttle |
| 防止爆破 | throttle + 登录限流 |
| 高并发 | Nginx + Redis |
| 下载限速 | Nginx limit_rate |
如果你愿意,可以告诉我:
我可以给你一套 可直接用的配置。