XAMPP不内置WebSocket服务,需用Apache反向代理:启用mod_proxy_wstunnel模块,配置ProxyPass将/ws/路径转至ws://127.0.0.1:8081/,并独立启动PHP或Node.js WebSocket后端进程监听指定端口。

XAMPP 本身不内置 WebSocket 服务,httpd.exe(Apache)默认也不监听 WebSocket 协议(ws:// 或 wss://)。你不能像配置 PHP 或 MySQL 那样“开启一个开关”就让 XAMPP 原生支持 WebSocket。真正的做法是:用 Apache 做反向代理,把 /websocket/ 这类路径的请求转给后端独立运行的 WebSocket 服务进程(比如 PHP、Node.js 写的长连接服务),而这个后端服务必须自己监听一个 TCP 端口(如 8081、9501)。
Apache 必须启用 mod_proxy_wstunnel
这是唯一能让 Apache 转发 WebSocket 握手和后续帧的关键模块。XAMPP 自带的 Apache 2.4+ 已包含该模块,但默认被注释掉:
- 打开
XAMPP\apache\conf\httpd.conf - 找到这行:
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 删掉开头的
#,确保它变成:LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 顺带确认
mod_proxy.so也已启用(WebSocket 代理依赖它) - 保存后重启 Apache —— 不重启,配置完全无效
VirtualHost 里写对 ProxyPass 规则
规则必须精确匹配路径和协议,且顺序敏感。常见错误是写成 http:// 而不是 ws://,或路径末尾斜杠不一致:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
-
ProxyPass /ws/ ws://127.0.0.1:8081/是正确写法(注意ws://和结尾/) -
ProxyPass /ws ws://127.0.0.1:8081/❌ 少了结尾斜杠,会导致子路径 404 -
ProxyPass /ws/ http://127.0.0.1:8081/❌ 协议写错,握手会失败,浏览器报Unexpected response code: 200 - 如果后端服务实际监听
/api/ws,那前端 JS 必须连ws://localhost/ws/api/ws,而不是直接连后端端口
后端服务端口得自己启动并守着
Apache 只负责转发,不运行 WebSocket 逻辑。你得另起一个进程跑服务,比如:
- PHP 方案:用
php_sockets.dll(需在php.ini中启用extension=php_sockets.dll),然后命令行执行:php websocket_server.php - Node.js 方案:用
ws库,执行:node server.js,监听8081 - 这个进程不能关,也不能靠浏览器访问启动 —— 关掉终端,WebSocket 就断了
- Windows 下建议用
start /B php websocket_server.php后台运行,或配合supervisor类工具
最容易被忽略的一点:前端 WebSocket 构造函数里的 URL,必须跟 ProxyPass 的路径前缀完全对应,且协议必须是 ws://(开发环境)或 wss://(上线后配了 HTTPS),而不是后端真实监听的地址。路径错一格、协议写成 http、端口填成 80 而不是代理后的路径,都会导致连接瞬间关闭。

















