小程序无法连接Workerman的wss服务,主因是SSL证书未正确配置、端口未暴露或反向代理未透传Upgrade头;需用ssl://协议启动、PEM格式完整证书链、绝对路径引用,并确保域名备案、HTTPS有效、端口公网可达。

小程序连不上 Workerman 的 wss 连接,大概率是证书没配对或端口没暴露
微信小程序强制要求 WebSocket 使用 wss(即 TLS 加密),而 Workerman 默认只提供 ws 服务。不配 SSL 证书、证书路径写错、或反向代理没透传 Upgrade 头,都会直接导致 WebSocket connection to 'wss://...' failed。
实操建议:
- 确认你用的是
Workerman\Worker的ssl://协议启动,不是tcp://或websocket://;ssl://0.0.0.0:8443才能响应wss - 证书文件必须是 PEM 格式,且包含完整链:
ssl_context中的local_cert要指向fullchain.pem(不是cert.pem),local_pk指向privkey.pem - 别在 Nginx/Apache 做 SSL 终结后还让 Workerman 自己再套一层 SSL —— 这会导致双重加密,
wss握手失败
Workerman 启动 wss 服务时 ssl_context 参数怎么填才不报错
常见错误是把 Nginx 的配置习惯带进来,比如把证书路径写成相对路径、漏掉 verify_peer 设置、或混用 OpenSSL 和 Swoole 的上下文字段。
实操建议:
-
local_cert和local_pk必须是绝对路径,推荐用__DIR__ . '/certs/fullchain.pem',避免因工作目录变化导致文件找不到 - 务必加上
'ssl' => ['verify_peer' => false](开发环境),否则 PHP OpenSSL 会校验域名,而小程序调试域名(如127.0.0.1)肯定不匹配 - 如果用的是 Let’s Encrypt 的证书,注意
fullchain.pem = cert.pem + chain.pem,单独用cert.pem会导致客户端信任链断裂
小程序调用 wss:// 时提示 net::ERR_CONNECTION_REFUSED 或超时
这通常不是代码问题,而是网络层没通:端口没开、防火墙拦截、或域名没解析到正确 IP。小程序真机调试走的是外网,localhost 和 127.0.0.1 完全无效。
实操建议:
- 检查服务器安全组/防火墙是否放行了
wss端口(如8443),别只开了80和443 - 用手机浏览器直连
wss://your-domain.com:8443(可用在线 wss 测试页),如果连不上,说明服务根本没暴露到公网 - 域名必须备案且支持 HTTPS,未备案域名即使证书有效,小程序也会拒绝建立
wss连接 - 不要用自签名证书——微信校验严格,
ERR_CERT_AUTHORITY_INVALID会直接中断连接
用 Nginx 反向代理 wss 到 Workerman,为什么握手就断
Nginx 默认不转发 WebSocket 升级头,Connection: Upgrade 和 Upgrade: websocket 被丢弃后,Workerman 收不到升级请求,就当普通 HTTP 处理,返回 400 或直接关闭连接。
实操建议:
- Nginx 配置里必须显式设置:
proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade"; -
proxy_pass目标必须是https://或http://地址,不能是ssl://—— Nginx 不理解 Workerman 的ssl://协议 - 如果 Nginx 终结 SSL,Workerman 就该用
tcp://或websocket://启动,监听内网端口(如127.0.0.1:2346),由 Nginx 负责加wss
最常被忽略的一点:小程序开发者工具里「不校验合法域名」开关只影响 request,不影响 connectSocket —— wss 域名必须真实备案、有有效证书、端口可达,少一个环节都连不上。










