要让thinkphp6稳定支撑1万并发,需nginx反向代理与后端协同调优:启用upstream keepalive长连接、透传path_info或x-original-uri、动静分离由nginx直供静态资源、https与websocket显式适配。

要让 ThinkPHP6 稳定支撑 1 万并发,仅靠框架本身远远不够,关键在于 Nginx 反向代理层与后端服务的协同调优。核心不是堆配置,而是切断瓶颈链路:连接复用、请求透传、静态分离、协议适配缺一不可。
Upstream 连接池必须启用 keepalive
Nginx 默认每个请求新建后端 TCP 连接,1 万并发下会瞬间产生上万短连接,导致后端 TIME_WAIT 爆满、SSL 握手 CPU 占满、延迟飙升。必须显式开启长连接复用:
- 在 http 块中定义 upstream,并设置 keepalive 200(建议值 = 后端单实例稳定承载并发 × 0.7,如 Swoole worker 数为 32,设 20~25 更稳妥)
- location 中强制使用 HTTP/1.1:proxy_http_version 1.1;
- 清除干扰头:proxy_set_header Connection '';,防止客户端带 Connection: close 导致复用中断
- 设置 keepalive_requests 5000 和 keepalive_timeout 60s,确保连接足够“老”但不过期
PATH_INFO 与路由透传不能丢
ThinkPHP6 默认依赖 PATH_INFO 解析路由(尤其在非 index.php 入口或子目录部署时),Nginx 反向代理若不主动透传,URL 路由将全部失效为首页或 404:
- 若后端是 PHP-FPM 直连,需在 fastcgi 配置中启用:fastcgi_split_path_info ^(.+?\.php)(/.*)$; 并设置 fastcgi_param PATH_INFO $fastcgi_path_info;
- 若后端是 Swoole 或其它 HTTP 服务(如 127.0.0.1:9501),则必须透传原始 URI:proxy_set_header X-Original-URI $request_uri;,并在 ThinkPHP 中通过中间件读取该 header 补全路由上下文
- 禁用 proxy_redirect 或设为 off,避免 Nginx 重写 Location 头破坏跳转逻辑
动静资源彻底分离,Nginx 全程接管
1 万并发下,任何 PHP 层处理静态文件(CSS/JS/图片)都是灾难。必须由 Nginx 直接响应,不经过后端:
- public/ 目录设为 root,所有以 .js|.css|.png|.jpg|.woff2 结尾的请求,用 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf)$ {} 拦截并添加 expires 1y 和 add_header Cache-Control "public, immutable"
- 确保 ThinkPHP 的 APP_URL 和 .env 中的 ASSET_URL 指向 Nginx 托管的静态域名(如 static.example.com),而非后端服务地址
- 关闭 ThinkPHP 自动输出 ETag 和 Last-Modified,交由 Nginx 统一控制缓存校验
HTTPS 与 WebSocket 必须显式适配
生产环境基本全站 HTTPS + 实时通信,这两类流量若未特殊配置,极易在反向代理层中断:
- HTTPS 透传:添加 proxy_set_header X-Forwarded-Proto $scheme; 和 proxy_set_header X-Forwarded-Port $server_port;,否则 ThinkPHP 生成的 URL 仍为 http://
- WebSocket 支持:在对应 location(如 /ws)中必须包含三要素:proxy_set_header Upgrade $http_upgrade;、proxy_set_header Connection "upgrade";、proxy_read_timeout 86400;
- 避免在 WebSocket location 中使用 proxy_cache 或 gzip,二者与长连接不兼容
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











