TP5.1 应对CC攻击需Nginx层限流+中间件二次拦截:先在nginx.conf配置limit_req_zone和limit_conn_zone,再于站点server块中启用limit_req和limit_conn;中间件仅处理放行流量,推荐解析Nginx日志动态封禁高频异常IP。

TP5.1 应用遭遇 CC 攻击时,请求会穿透 PHP 层直抵 Nginx,单靠框架中间件无法拦截高频短连接攻击,必须在 Nginx 层做速率与连接数双限流,并让中间件只处理已放行的、具备真实业务特征的请求。这能避免 PHP 进程被恶意请求拖垮,同时保留登录页、API 接口等关键路径的可验证性。
Nginx 层配置限流区域(全局生效)
第一步:确认 Nginx 已编译 【ngx_http_limit_req_module】 和 【ngx_http_limit_conn_module】 模块。执行 nginx -V 2>&1 | grep -E 'limit_(req|conn)',若无输出,需重新编译并勾选对应模块——宝塔用户请进「软件商店 → Nginx → 设置 → 编译安装」补全。
第二步:编辑主配置文件 /etc/nginx/nginx.conf,在 http{} 块顶部插入两段定义:
limit_req_zone $binary_remote_addr zone=tp_cc:10m rate=8r/s;
limit_conn_zone $binary_remote_addr zone=tp_conn:10m;
这两行必须放在所有 include 语句之前,否则子配置文件无法继承;10m 内存可记录约 16 万个 IP 状态,中小站点足够;rate=8r/s 是兼顾正常用户点击与攻击识别的阈值,低于 5r/s 易误杀移动端连点,高于 15r/s 失去防护意义。
在 TP5.1 站点配置中启用限流规则
进入宝塔或手动编辑该站点的 Nginx 配置文件(如 /www/wwwroot/your-site.vhost),在 server{} 块内找到 location / { ... } 或 location ~ \.php$ { ... } 区域。
添加以下两行:
limit_req zone=tp_cc burst=12 nodelay;
limit_conn tp_conn 15;
【burst=12】 允许瞬时突发 12 个请求进入漏桶,防止用户快速翻页或表单重复提交被误拒;【nodelay】 表示超出 burst 后立即返回 503,不排队等待,节省后端资源;【limit_conn tp_conn 15】 控制单 IP 最多维持 15 个并发 TCP 连接——注意这不是请求数,而是“建连未断”的数量,对短连接攻击效果有限,但能压制慢速扫描类行为。
切勿在 location ~* \.(js|css|png|jpg|gif)$ 等静态资源路径下加限流,否则页面样式和脚本加载失败会导致白屏。
TP5.1 中间件精准拦截异常 IP(仅处理放行流量)
方法一:基于 Nginx 传递的限流状态做二次过滤
在 app/middleware.php 中注册中间件,读取 Nginx 注入的请求头:X-Real-IP(需确保已开启真实 IP 识别)或直接使用 $request->ip()。但注意:Nginx 限流触发后根本不会把请求交给 PHP,所以此中间件只对未被限流的请求生效。
方法二:解析 Nginx 日志主动封禁(推荐)
编写一个命令行脚本 /www/secure/block_cc.php,每分钟执行一次:
① 用 shell 提取最近 60 秒内访问 /login 或 /api/search 超过 30 次的 IP:
awk '$4 > "[01/Jul/2026:09:00:00" && $4 30 {print $2}' > /tmp/cc_ips.txt
② 将这些 IP 写入 TP5.1 的黑名单配置 config/block_ip.php:
<?php return ['192.168.1.100', '203.123.45.67'];
③ 在全局中间件中判断:if (in_array($request->ip(), config('block_ip'))) return response('Forbidden', 403);
这个流程不依赖 Nginx 模块,且能捕获绕过限流的慢速攻击者,比单纯靠 Nginx 更灵活。


















