frankenphp 本身不支持 ip 级限流,必须在上游反向代理(如 nginx 或 apache)或应用层(如 php+redis)实现;推荐顺序为:nginx limit_req、apache mod_evasive、php+redis 动态限流。

FrankenPHP 本身不内置 IP 级请求频率限制功能,它是一个 PHP 运行时(SAPI),专注执行 PHP 代码,不处理网络层访问控制或限流逻辑。因此,限制单 IP 请求频率必须在 FrankenPHP 上游完成——也就是在反向代理(如 Nginx)或 Web 服务器(如 Apache)层面实现。
以下是针对 FrankenPHP 1.2 部署场景的三种可靠、可落地的限流方式,按推荐顺序排列:
Nginx limit_req 模块(最常用、最轻量)
适用于绝大多数生产环境,直接在 Nginx 中配置,对 FrankenPHP 透明无侵入。
-
在
http块中定义限流区域(按 IP):limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;
-
在
location块(例如代理到 FrankenPHP 的路径)中启用:location / { proxy_pass http://127.0.0.1:8080; # FrankenPHP 默认监听地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; limit_req zone=ip_limit burst=20 nodelay; } burst=20允许短时突发 20 个请求,nodelay表示不排队,超限直接返回 503(可配合limit_req_status 429改为 429)
✅ 优点:零依赖、低开销、秒级生效
⚠️ 注意:Nginx 限流基于真实客户端 IP,若前端有 CDN 或代理,需确保X-Real-IP或X-Forwarded-For正确传递,并用$http_x_forwarded_for替代$binary_remote_addr(需配合map处理多级代理)
Apache + mod_evasive(仅限 Apache 反代场景)
若你用 Apache 作为 FrankenPHP 的前置代理(如 ProxyPass 到 http://localhost:8080),可启用 mod_evasive:
-
启用模块后,在虚拟主机或
<location></location>中配置:<location> ProxyPass http://127.0.0.1:8080/ ProxyPassReverse http://127.0.0.1:8080/ DOSPageCount 5 DOSSiteCount 50 DOSBlockingPeriod 60 DOSEmailNotify admin@example.com </location> 它会自动拦截同一 IP 在单位时间内的高频请求,并临时封禁(返回 403)
✅ 适合防御简单暴力扫描、登录爆破
❌ 不支持路径级精细限流,也不区分 HTTP 方法
应用层 + Redis 实现用户/IP 维度动态限流
若需按用户身份(如登录态 X-User-ID)或组合维度(IP + API key)限流,可在 PHP 代码中实现:
-
在入口文件(如
public/index.php)顶部添加:$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $key = 'rate:' . $_SERVER['REMOTE_ADDR']; // 或拼接 token/user_id $count = $redis->incr($key); $redis->expire($key, 60); // 60秒窗口 if ($count > 100) { http_response_code(429); echo json_encode(['error' => 'Too many requests']); exit; }
✅ 灵活、可结合业务逻辑(如白名单、VIP 用户豁免)
⚠️ 注意:需确保 Redis 高可用;高并发下建议用 Lua 脚本保证原子性
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











