Workerman 不支持直接处理 wss 协议,必须通过 Nginx 反向代理实现 TLS 终结和 WebSocket 升级;Nginx 需透传 Upgrade/Connection 头并配置有效证书,Workerman 仅监听本地 ws:// 地址且禁用 SSL。

Workerman 本身不支持直接处理微信小程序的 _wss 协议(即带下划线前缀的自定义协议),必须通过反向代理或协议适配层中转,否则小程序连不上。
微信小程序 wss 连接失败的典型错误现象
小程序调用 wx.connectSocket 后卡在 connecting 状态,几秒后报错:fail net::ERR_CONNECTION_REFUSED 或 fail WebSocket is not supported。这不是小程序问题,而是服务端没按微信要求暴露标准 wss:// 接口——微信强制校验 TLS 证书、SNI、HTTP Upgrade 头,且不接受非标准协议名(比如 _wss)。
常见误操作:WorkerMan\Protocols\Websocket 直接监听 443 端口并启用 SSL,但没配好 Nginx 反代或证书链不全,导致握手失败。
- 微信只认真实域名 + 有效 TLS 证书(不能是自签或局域网 IP)
- Workerman 原生
Websocket协议不处理 HTTPS 握手,无法直接响应wss请求 -
_wss不是协议标准,是部分文档里对“微信小程序专用 wss”的误写,实际就是普通wss
Nginx 反向代理 wss 到 Workerman 的最小配置
必须用 Nginx 做 TLS 终结和协议升级转发,Workerman 只跑纯 ws(明文)服务。这是最稳定、兼容性最好的方案。
关键点:Nginx 要透传 Upgrade 和 Connection 头,并关闭缓存;Workerman 监听本地 ws://127.0.0.1:2346 这类地址,不暴露到公网。
- 确保 Nginx 已加载
stream模块(wss转发不需要它,HTTP 层代理即可) - SSL 证书必须完整(含中间证书),用
openssl s_client -connect your.domain:443 -servername your.domain验证 - Workerman 的
Websocket实例要设置$worker->count = 1(避免多进程抢连接)
server {
listen 443 ssl;
server_name your.domain;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_pass http://127.0.0.1:2346;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400;
}
}
Workerman 启动 Websocket 服务时的关键参数
别用 Worker::set 强行开启 SSL,Workerman 的 Websocket 协议不支持 TLS。它只负责解析 WebSocket 帧,TLS 必须由前置代理完成。
启动代码里最容易错的是监听地址和协议选择:
- 必须用
websocket://127.0.0.1:2346,不是wss://或ssl:// - 如果用了
Worker::set(['ssl' => true]),Workerman 会尝试自己做 TLS,结果握手失败且日志无提示 - 小程序发来的
Sec-WebSocket-Protocol头(如weapp)会被 Workerman 自动忽略,无需特殊处理
示例片段:
$worker = new Worker('websocket://127.0.0.1:2346');
$worker->count = 1;
$worker->onMessage = function($connection, $data) {
$connection->send('ok');
};
Worker::runAll();
调试时必查的三个检查点
连不上不是代码问题,大概率卡在这三处之一:
- Nginx 日志里有没有
502 Bad Gateway?有说明 Workerman 没起来或端口不通 - 用浏览器访问
wss://your.domain(配好域名和证书),再用 Chrome DevTools 的 Network → WS 查看状态码,101 Switching Protocols才算成功 - 小程序
onError回调里的errMsg字段,如果是fail invalid url,说明域名没备案或未在小程序后台配置业务域名
微信服务器会主动探测你的 wss 地址,如果证书过期、SNI 不匹配、或返回了 HTTP 200 而不是 101,它就会拒绝建立连接——这个过程完全静默,只能靠 Nginx access log 和浏览器调试确认。











