phpenv 默认不支持 websocket,需手动配置:强制 http/1.1、透传 upgrade 和 connection 头、延长 proxy_read_timeout 至 86400,并确保 location 块位于 server 根作用域且未被其他规则拦截。

phpEnv 是 Windows 下的集成环境套件,底层用的是 Nginx + PHP(非 Apache),但默认配置**完全不支持 WebSocket**——不是版本问题,而是它压根没配 Upgrade 和 Connection 头、也没调超时,直接代理 WebSocket 请求会 502 或连接秒断。
确认 phpEnv 使用的 Nginx 版本是否达标
WebSocket 支持从 Nginx 1.3.13 开始引入,而 phpEnv 当前主流版本(如 4.0.x)内置的 Nginx 多为 1.20.x 或 1.22.x,已满足最低要求。但不能只看“有”,得验证实际运行版本:
- 打开 phpEnv 安装目录(如
C:\phpEnv),进入nginx\nginx.exe所在路径 - 命令行执行:
nginx -v—— 输出应为类似nginx version: nginx/1.22.1 - 若低于
1.3.13(极少见),需手动替换nginx.exe及配套conf文件,不推荐;优先检查配置
修改 phpEnv 的 Nginx server 配置块
phpEnv 的站点配置通常位于 C:\phpEnv\nginx\vhosts\ 下,每个站点一个 .conf 文件(如 localhost.conf)。关键不是加新模块,而是补全 WebSocket 握手必需的三要素:
-
proxy_http_version 1.1:强制走 HTTP/1.1(WebSocket 升级机制依赖此) -
proxy_set_header Upgrade $http_upgrade:把客户端发来的Upgrade: websocket头原样传给后端 -
proxy_set_header Connection "upgrade":覆盖 Nginx 默认的Connection: close,否则连接立刻被关
示例(假设你用 /ws 路径代理本地 3000 端口的 WebSocket 服务):
location /ws {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
⚠️ 注意:$http_upgrade 是 Nginx 内置变量,大小写敏感;"upgrade" 必须带英文双引号,否则会被当成变量名解析失败。
必须延长超时,否则空闲 60 秒就断
Nginx 默认 proxy_read_timeout 是 60 秒,WebSocket 长连接一旦空闲超过这个时间,Nginx 就主动关闭与后端的连接,前端收到 WebSocket is closed before the connection is established 或直接触发 onclose。
-
proxy_read_timeout 86400:建议设为 24 小时(86400 秒),足够覆盖绝大多数业务场景 -
proxy_send_timeout 86400:避免 Nginx 在发心跳或小数据包时因响应慢而中断 - 不用改
keepalive_timeout:phpEnv 默认是 65 秒,对客户端到 Nginx 这段影响不大;重点在 proxy_* 超时
如果后端是 Workerman/Swoole,它们自身也有心跳机制(如 ping_interval),此时 Nginx 的超时只需略大于后端心跳间隔即可,不必死守 86400 —— 但绝不能留默认值。
重启 phpEnv 的 Nginx 服务并验证
phpEnv 自带控制面板,但「重启 Nginx」按钮有时不生效,尤其在配置语法出错时会静默失败:
- 先用命令行校验配置:
C:\phpEnv\nginx\nginx.exe -t,输出successful才算真正通过 - 再在控制面板点「重启 Nginx」;若无效,手动任务管理器结束所有
nginx.exe进程,再点启动 - 验证方式:用浏览器控制台连
ws://localhost/ws,观察 Network → WS 标签页是否显示101 Switching Protocols响应头
常见失败现象:控制台报 Error during WebSocket handshake: Unexpected response code: 502,基本就是 Upgrade/Connection 没传过去,或后端根本没监听对应端口。
最易被忽略的一点:phpEnv 的 Nginx 配置里常有多个 location / 块嵌套,WebSocket 路径匹配必须写在最外层 server 块下,且不能被其他正则 location(如 location ~ \.php$)意外拦截——顺序和作用域比参数本身还关键。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











