limit_conn在phpEnv中需在vhost配置中通过include注入limit_conn.conf,并启用real_ip_header还原真实IP,否则因变量失效或代理误封导致配置失效;必须搭配limit_req防HTTP持久连接绕过。

limit_conn 在 phpEnv 环境下能起作用,但默认配置几乎必然失效——因为 phpEnv 的 Nginx 默认不读取你手动改的 nginx.conf,它用的是自动生成的站点配置文件,且多数版本没启用 $binary_remote_addr 所需的变量支持。
phpEnv 的 Nginx 配置文件在哪、怎么改才生效
phpEnv 生成的每个站点配置实际存放在:C:\phpEnv\nginx\vhost\your-site.conf(Windows)或 /usr/local/phpenv/nginx/vhost/your-site.conf(Linux)。直接改 nginx.conf 顶层文件无效,重启后会被覆盖。
必须在对应站点的 vhost 配置里操作,且注意两点:
- 不能把
limit_conn_zone写在server或location块内,必须提至http块——但 phpEnv 的http块是只读模板,所以得用「include」方式注入; - 推荐在
vhost文件顶部加:include /path/to/limit_conn.conf;,然后单独维护这个limit_conn.conf; - 确保该文件被 Nginx 加载时,
$binary_remote_addr可用——部分旧版 phpEnv 编译时未启用--with-http_realip_module,会导致变量为空,此时limit_conn实际按空字符串计数,所有 IP 共享一个配额。
真实 IP 获取失败时 limit_conn 会误封 CDN 或代理节点
phpEnv 默认不处理 X-Forwarded-For,而大多数 CC 攻击流量经过 CDN、WAF 或校园网出口后,$remote_addr 就变成中间节点 IP。直接基于它限流,等于主动封掉 Cloudflare、腾讯云 CDN 甚至公司防火墙出口。
立即学习“PHP免费学习笔记(深入)”;
要还原真实 IP,需同时满足:
- 在
http块(通过 include 注入)中启用:set_real_ip_from 1.1.1.1/32;(填你实际 CDN 的可信 IP 段,不是示例); - 紧接着写:
real_ip_header X-Forwarded-For;; - 然后才能安全地用
$binary_remote_addr定义limit_conn_zone; - 否则,
limit_conn perip 3限制的其实是 CDN 节点的连接数,攻击者开 10 个代理 IP 就绕过全部限制。
limit_conn 和 PHP 层防 CC 完全不是一回事
很多人在 phpEnv 里配了 limit_conn 还被刷崩,是因为混淆了「TCP 连接层」和「PHP 请求处理层」:
-
limit_conn拦截的是尚未发送完整请求头的连接,不消耗 PHP 进程,防御成本低; - 但若攻击者用 HTTP/1.1 持久连接发 100 个请求(只建 1 个 TCP 连接),
limit_conn perip 3完全不管——它只看“同时活跃连接数”,不看请求数; - 这时必须搭配
limit_req(比如limit_req zone=perip burst=5 nodelay;),否则 PHP-FPM 进程池照样被打满; - phpEnv 自带的 PHP-FPM 配置通常没调优:
pm.max_children默认可能只有 10,遇到并发稍高就排队或 502,这不是 Nginx 能解决的。
最易被忽略的一点:phpEnv 的 Nginx 日志默认不记录被 limit_conn 拒绝的连接,limit_conn_log_level 默认是 error,但若没打开 error_log 对应级别,你根本看不到谁被拦了、为什么拦——建议显式设为 warn 并检查日志路径是否可写。



















