phpEnv 本身不支持 WebSocket 反向代理,因其仅集成 Apache + PHP + MySQL,无 Nginx 组件且 Apache 默认不支持 Upgrade 协议升级;必须额外部署 Nginx 并配置 proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade" 及 proxy_read_timeout 86400 才能正确代理。

phpEnv 本身不支持反向代理 WebSocket,它只是一个 Windows 下的 PHP 集成环境(类似 XAMPP),内置的是 Apache + PHP + MySQL,**没有 Nginx 组件,也不提供 WebSocket 代理能力**。想用 phpEnv 转发 ws:// 或 wss:// 请求,必须额外引入并配置 Nginx —— 这不是“phpEnv 的功能”,而是你手动加装 Nginx 后的独立配置任务。
为什么 phpEnv 默认无法代理 WebSocket
Apache 在默认配置下不原生支持 WebSocket 协议升级(Upgrade: websocket),且 phpEnv 自带的 Apache 版本通常未启用 mod_proxy_wstunnel 模块;即使启用,其稳定性、超时控制和负载均衡能力也远弱于 Nginx。实际生产中几乎没人用 Apache 做 WebSocket 反向代理,更不会依赖 phpEnv 自带的 Apache 来做。
常见错误现象:
- 前端连接
ws://localhost:8080/ws,浏览器报WebSocket connection to 'ws://...' failed: Error during WebSocket handshake - 后端服务(如 Swoole、Workerman)已正常监听
0.0.0.0:9501,但通过 phpEnv 的 Apache 访问始终 502 或直接断连 - 误以为修改
httpd.conf加几行ProxyPass就能转发 ws —— 实际无效,因为缺少隧道支持和头部透传
必须用 Nginx 替代 Apache 做 WebSocket 代理
phpEnv 不阻止你装 Nginx,但你要自己下载、解压、配置、启动,并停掉 phpEnv 内置的 Apache(否则端口冲突)。Nginx 从 1.3.13 起就稳定支持 WebSocket 隧道,关键就三件事:
立即学习“PHP免费学习笔记(深入)”;
- 启用 HTTP/1.1:
proxy_http_version 1.1 - 透传升级请求头:
proxy_set_header Upgrade $http_upgrade - 强制连接升级:
proxy_set_header Connection "upgrade"
示例最小可行配置(保存为 nginx.conf):
upstream ws_backend {
server 127.0.0.1:9501; # 你的 PHP WebSocket 服务端口(如 Swoole)
}
server {
listen 80;
server_name localhost;
location /ws {
proxy_pass http://ws_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400; # 必须设大,否则空闲 60s 后断连
}
}注意:proxy_read_timeout 是最容易被忽略的点 —— WebSocket 是长连接,不设这个值,Nginx 默认 60 秒无数据就主动断开,导致前端频繁重连。
如何让 phpEnv 环境真正跑通 wss(加密 WebSocket)
如果你需要 wss://(比如微信小程序或生产环境强制要求),Nginx 必须终止 TLS,并以明文 ws:// 转发给后端。phpEnv 完全不参与证书管理,你需要:
- 申请或生成 SSL 证书(
your_domain.crt和your_domain.key) - 在 Nginx
server块中添加listen 443 ssl及证书路径 -
禁止在后端 PHP 服务里再启 HTTPS —— Nginx 到 PHP 是内网通信,走明文
ws://127.0.0.1:9501即可
错误做法:试图让 phpEnv 的 Apache 处理 wss → 不可行;或让 Swoole 同时监听 wss 和 ws → 不必要且增加运维复杂度。
前端连接地址必须与 Nginx 配置严格对应
很多人配好了 Nginx,但前端仍连不上,问题出在 URL 写错:
- Nginx 监听
80端口、server_name localhost、location /ws→ 前端必须用ws://localhost/ws - Nginx 监听
443、域名是myapp.test→ 前端必须用wss://myapp.test/ws,且本地 hosts 要映射127.0.0.1 myapp.test - 绝对不要写
ws://127.0.0.1:9501—— 这是绕过 Nginx 直连后端,失去代理、负载、SSL 终止等所有价值
真实调试建议:先用 wscat -c ws://localhost/ws(Node.js 工具)测试 Nginx 代理是否通,再上浏览器。
最常被跳过的一步:改完 Nginx 配置后忘记执行 nginx -t 校验语法,直接 nginx -s reload,结果 reload 失败但没报错,你以为生效了,其实还是旧配置在跑。



















