ThinkPHP部署Nginx限流需前置至请求进入PHP前,通过limit_req实现IP级速率控制、limit_conn限制并发连接,并结合Lua支持IP+路径双维度动态限流,同时避开静态资源与非业务请求。

ThinkPHP部署Nginx限流,核心是把限流动作前置到请求进入PHP之前——不等TP框架启动,就完成识别、计数和拦截。这比在中间件里做限流更省资源、更抗CC攻击,也更可靠。
精准匹配TP接口路径
ThinkPHP 5.1/6 默认所有请求走 index.php,但Nginx必须按真实访问路径配置限流位置,否则规则不生效。
- 若用伪静态(如
rewrite ^/api/(.*)$ /index.php?s=api/$1 last;),直接在location /api/ { }块里加限流指令 - 若用 PATH_INFO 模式(如访问
/index.php/v1/user),用正则匹配:location ~ ^/index\.php/v1/ { } - 务必避开静态资源:在
location ~* \.(js|css|png|jpg|woff2)$ { limit_req off; }中关闭限流
用 limit_req 实现IP级速率控制
这是最常用、最轻量的限流方式,适合防爬虫和普通高频调用。
- 在
http{}块中定义共享内存区:limit_req_zone $binary_remote_addr zone=tp_rate:10m rate=10r/s; - 在对应
location块中启用:limit_req zone=tp_rate burst=20 nodelay;(允许突发20个请求,不延迟) - 若走CDN或反向代理,必须加
set_real_ip_from和real_ip_header X-Real-IP;,否则限流对象是CDN的IP
用 limit_conn 做并发连接数限制
防长连接耗尽服务器资源,比如恶意轮询、未关闭的WebSocket连接或慢速HTTP攻击。
- 按IP限制并发数:
limit_conn_zone $binary_remote_addr zone=tp_ip:10m;+limit_conn tp_ip 6; - 按接口路径限制(更精细):
limit_conn_zone $request_uri zone=tp_api:10m;+location ^~ /api/ { limit_conn tp_api 30; } - 配合状态码提示:
limit_conn_status 429;,让客户端知道是被限流而非服务错误
结合Lua实现双维度动态限流
当需要“每个IP对每个接口单独计数”(如登录接口宽松、支付接口严格),原生指令不够用,得靠Lua扩展。
- 安装
lua-resty-limit-req模块,确保Nginx支持Lua - 构造唯一key:
ngx.var.binary_remote_addr .. '_' .. ngx.var.uri,实现IP+路径双维度统计 - 绕过非业务请求:
if ngx.req.get_method() == "OPTIONS" then return end,跳过CORS预检 - 健康检查路径(如
/health)建议显式return 200;提前放行
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











