workerman 5.2.3 不直接支持 https/ssl 终止,推荐用 nginx 反向代理处理 ssl,workerman 仅监听 http 端口;也可用 webserver + openssl 实现原生 tls,但仅适用于开发或内网环境。

Workerman 5.2.3 本身是纯 PHP 编写的异步网络框架,**不直接支持 HTTPS/SSL 终止**,因为它不内置 HTTP 服务器(如 Nginx/Apache 那样的 SSL 握手能力)。但你可以通过两种主流方式安全地启用 SSL:一种是让 Workerman 运行在 SSL 层之上(推荐),另一种是用 Workerman 的 WebServer + OpenSSL 扩展手动实现 TLS(较复杂、有局限)。下面讲清楚怎么选、怎么做。
用反向代理(Nginx)托管 SSL(最常用、最推荐)
这是生产环境的标准做法:Nginx 负责 SSL 解密和 HTTPS 请求处理,再以普通 HTTP(或 WebSocket)协议把请求转发给 Workerman 后端服务。Workerman 完全不用改代码,只监听本地端口(如 127.0.0.1:8080)即可。
- 确保 Nginx 已安装并启用
ngx_http_ssl_module(默认开启) - 把你的证书文件(
fullchain.pem和privkey.pem)放到安全路径,比如/etc/nginx/ssl/example.com/ - 在 Nginx 配置中添加 server 块:
示例配置(HTTPS + HTTP 自动跳转):
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
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_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
重载 Nginx:sudo nginx -t && sudo systemctl reload nginx。Workerman 启动时只需保持监听 0.0.0.0:8080 或 127.0.0.1:8080 即可。
用 Workerman WebServer + OpenSSL 实现原生 TLS(仅限特定场景)
Workerman 5.2.3 的 WebServer 类支持传入 context 参数,配合 PHP 的 OpenSSL 扩展可启用 TLS。但注意:它只支持 TCP 层加密,不自动处理 SNI、ALPN 或 HTTP/2;且无法像 Nginx 那样做证书链校验、OCSP Stapling 等高级特性。
- 确认 PHP 启用了
openssl扩展:php -m | grep openssl - 证书必须是 PEM 格式,私钥不能带密码(否则启动会卡住)
- Workerman 启动代码示例(监听 443 端口):
use Workerman\Worker;
use Workerman\WebServer;
$web = new WebServer('https://0.0.0.0:443');
// SSL 上下文配置
$web->context = [
'ssl' => [
'local_cert' => '/path/to/fullchain.pem', // 包含证书+中间证书
'local_pk' => '/path/to/privkey.pem',
'verify_peer' => false, // 生产环境建议设为 true 并配 cafile
// 'cafile' => '/path/to/root-ca-bundle.crt',
'ciphers' => 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256',
]
];
$web->onMessage = function($connection, $data) {
$connection->send("Hello over HTTPS!");
};
Worker::runAll();
⚠️ 注意:该方式不支持 WebSocket 的 wss 协议升级(需额外处理 Upgrade 头),也不兼容 Let’s Encrypt 的自动续期脚本直连 —— 推荐仅用于开发测试或内网可信环境。
WebSocket 服务启用 WSS 的关键点
如果你的 Workerman 提供 WebSocket 接口(如 TextProtocol 或 Frame),要支持 wss://,必须满足两个条件:
- 底层传输层已加密(即走 Nginx 反代 HTTPS,或 WebServer 启用 TLS)
- 客户端连接地址写成
wss://example.com,且服务端响应正确的Upgrade: websocket和Connection: upgrade头
Nginx 反代方案天然满足;若用原生 WebServer,则需确保 context['ssl'] 正确配置,并在 onMessage 或协议处理器中不干扰 WebSocket 握手流程(Workerman 5.2.3 默认支持标准握手)。
证书更新与维护提醒
无论哪种方式,证书过期都会导致连接失败。建议:
- 使用 Certbot + Nginx 插件自动续期:
certbot --nginx -d example.com - 续期后记得重载 Nginx,无需重启 Workerman
- 若用原生 TLS 模式,续期后需重启 Workerman 进程才能加载新证书
- 定期检查证书有效期:
openssl x509 -in fullchain.pem -text -noout | grep "Not After"











