要让ThinkPHP6稳定支撑1万并发,需协同优化Nginx长连接、系统资源、PHP处理能力与框架行为:客户端连接设keepalive_timeout 20–45秒、keepalive_requests 1000–5000;PHP-FPM上游启用keepalive并配proxy_http_version 1.1和Connection ''; 同时调高worker_connections、ulimit及启用epoll,并关闭APP_DEBUG与生成路由缓存。

要让 ThinkPHP6 稳定支撑 1 万并发请求,Nginx 的长连接配置是关键一环,但不能孤立看待——它必须与系统资源、PHP 处理能力、框架行为协同优化。单纯调高 keepalive_timeout 并不能“撑住 1 万并发”,真正起作用的是:连接复用率 + 单连接承载请求数 + 后端响应速度三者共同决定的连接周转效率。
客户端到 Nginx 的长连接:减少握手开销
这是浏览器或 App 与 Nginx 之间的连接,目标是让一个 TCP 连接尽可能多地服务多个 HTTP 请求:
- keepalive_timeout 30s; —— 设为 20–45 秒较稳妥;太短(如 5s)导致频繁重连,太长(如 300s)易堆积空闲连接,占用 worker 连接槽位
- keepalive_requests 2000; —— 默认 100,高并发下建议设为 1000–5000;值过低会强制断连重连,引发大量 TIME_WAIT;值过高对后端压力不均,2000 是兼顾复用率与负载均衡的常用值
- keepalive_disable none; —— 关闭对旧 UA 的自动禁用,确保现代客户端(Chrome/Firefox/Safari/App)都能复用连接
Nginx 到 PHP-FPM 的长连接:避免 upstream 短连接瓶颈
ThinkPHP6 默认走 FastCGI,Nginx 作为客户端连接 PHP-FPM(如 127.0.0.1:9000),此处必须显式启用长连接,否则每个请求都新建/关闭 socket,成为万级并发的致命短板:
- 在 upstream php_backend { ... } 块中添加:keepalive 128; —— 表示每个 Nginx worker 缓存最多 128 个空闲到 PHP-FPM 的长连接;值建议为 PHP-FPM pm.max_children × 0.8 左右(例如 max_children=100,则 keepalive=80~100)
- 对应 location ~ \.php$ 中必须配齐:
proxy_http_version 1.1;
proxy_set_header Connection ''; —— 注意是清空 Connection 头,不是设为 keep-alive;错误写法(如 Connection: keep-alive)会导致复用失败或 502 - 补充超时控制:fastcgi_read_timeout 60; 和 fastcgi_send_timeout 60;,防止 PHP 响应慢时 Nginx 主动断连,破坏长连接状态
配套必须项:不然长连接形同虚设
光配 keepalive 不足以支撑 1 万并发,以下三项缺一不可:
立即学习“PHP免费学习笔记(深入)”;
- worker_connections 65535; 放在 events 块内,并确认 worker_rlimit_nofile 1048576; 已设置,且系统 ulimit -n ≥ 1048576 —— 否则连接数卡在几千就无法上升
- use epoll; 显式声明事件模型,Linux 下必须启用,否则 select/poll 无法应对万级连接
- 关闭 ThinkPHP6 调试模式:.env 中设 APP_DEBUG=false,并执行 php think optimize:route 生成路由缓存 —— 路由解析耗时下降 5–10 倍,直接影响单连接处理请求的速度
验证是否生效的小技巧
不要只看 QPS 数字,重点观察连接复用效果:
- 用 ss -s 查看 ESTAB 连接数是否稳定在数千量级,而非持续飙升后陡降(那是复用失败)
- Nginx 日志中开启 $connection_requests 变量,统计平均每个连接处理请求数;若长期低于 50,说明 keepalive_requests 或后端响应太慢需优化
- 抓包看响应头是否有 Keep-Alive: timeout=30, max=2000,且连续请求复用同一 TCP 流(源端口不变)



















