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

HTTPS网站不能直接用 ws:// 连 Workerman,必须走 wss://;而 Workerman 自己不处理 TLS 握手,所谓“无证书启动 WSS”本身就是矛盾的——要么配好证书让 Workerman 直启 ssl://,要么用 Nginx 做 TLS 终结、Workerman 只跑明文 ws://。硬要跳过证书,只会触发 SSL routines::wrong version number 或 net::ERR_SSL_PROTOCOL_ERROR。
Workerman 启动 ssl:// 时证书路径和参数怎么填才不报错
Workerman 的 ssl://0.0.0.0:8443 协议要求你显式传入 ssl_context,漏掉或写错任意一项都会在 stream_socket_server 阶段直接失败。
-
local_cert必须是完整链 PEM 文件(fullchain.pem),不是cert.pem;路径必须绝对,推荐写成__DIR__ . '/certs/fullchain.pem' -
local_pk指向私钥privkey.pem,同样需绝对路径 - 开发环境加
'verify_peer' => false,否则 PHP OpenSSL 会校验 SNI 域名,而本地调试域名(如localhost)必然不匹配 - 别混用 Swoole 的 SSL 参数名(如
ssl_cert_file),Workerman 只认标准 OpenSSL 上下文键名
Nginx 反代 wss 到 Workerman 时 Upgrade 头为什么总被丢
Nginx 默认把 WebSocket 当普通 HTTP 处理,Upgrade 和 Connection 头根本不会透传,导致握手卡在 connecting 状态,几秒后报 fail net::ERR_CONNECTION_REFUSED。
- 必须显式设置
proxy_set_header Upgrade $http_upgrade和proxy_set_header Connection "upgrade" -
proxy_http_version 1.1缺一不可,HTTP/1.0 不支持 Upgrade 机制 - 禁用缓存:
proxy_buffering off和proxy_cache off,否则响应体可能被截断 - 别在
location块里写rewrite或return,它们会中断 upgrade 流程
小程序连 wss:// 报 ERR_CONNECTION_REFUSED 的真实原因
这个错误几乎从不来自 PHP 代码,而是网络层彻底不通:端口没开、域名没解析、或服务根本没监听到公网 IP。
- Workerman 必须监听
0.0.0.0:2346,不能只写127.0.0.1:2346——后者只允许本机访问 - 云服务器安全组 + 系统防火墙(如
firewall-cmd)都要放行目标端口(如8443或反代用的443) - 小程序真机调试走外网,
localhost、127.0.0.1、内网 IP 全无效,必须用已备案的域名 - 用手机浏览器直访
wss://your-domain.com(可用 websocket.org 测试页),连不上就说明服务没暴露成功
最易被忽略的是证书链完整性:Let’s Encrypt 的 fullchain.pem 必须包含 root + intermediate + domain cert 三段,少一段,微信客户端就直接中断连接,连握手包都收不到。

















