必须先确保Swoole扩展启用OpenSSL支持,否则HTTPS/WSS启动失败;执行php --ri swoole确认openssl => enabled,否则需用绝对路径php-config重新编译并启用--enable-openssl。

要在宝塔环境下让 Swoole 服务支持 HTTPS 或 WSS,必须先确保 Swoole 扩展已启用 OpenSSL 支持,否则即使填了证书路径也会启动失败并报错“SSL not supported”。
确认 Swoole 已编译 OpenSSL 支持
登录宝塔终端,执行:php --ri swoole,在输出中查找 openssl => enabled。若显示 disabled 或未出现该行,说明当前 Swoole 不支持 SSL,不能跳过此步直接配证书。
不满足条件时,需重新编译安装:进入对应 PHP 版本的源码或 pecl 安装目录,运行 phpize && ./configure --enable-openssl --with-php-config=/www/server/php/XX/bin/php-config && make clean && make && make install(XX 替换为实际 PHP 版本号,如 80)。
【必须用绝对路径指定 php-config,相对路径会导致 openssl 支持失效】
准备证书文件并校验格式
从宝塔网站 SSL 页面下载的 Let’s Encrypt 证书,或从腾讯云/阿里云导出的 Nginx 类型证书,均可直接使用。
关键要求:cert 文件必须是 PEM 格式且含完整证书链(域名证书 + 中间 CA),key 文件必须是无密码的 RSA 私钥;可用 openssl rsa -in your.key -check -noout 验证私钥有效性。
若证书为 .crt + .key 组合,无需转换;若为 .pfx/.p12,请用 openssl 转成 PEM:openssl pkcs12 -in cert.pfx -clcerts -nokeys -out fullchain.pem 和 openssl pkcs12 -in cert.pfx -nocerts -nodes -out private.key。
配置 Swoole HTTPS 服务器代码
方法一:独立 HTTPS 服务(推荐用于 API 或 WebSocket)
创建 https_server.php,内容如下:
$server = new Swoole\Http\Server('0.0.0.0', 443, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$server->set([
'ssl_cert_file' => '/etc/letsencrypt/live/your-domain.com/fullchain.pem',
'ssl_key_file' => '/etc/letsencrypt/live/your-domain.com/privkey.pem',
'worker_num' => 2,
]);
$server->on('Request', function ($request, $response) {
$response->header('Content-Type', 'text/html');
$response->end('<h1>HTTPS OK</h1>');
});
$server->start();
【证书路径必须为绝对路径,且 PHP 进程用户(通常是 www)有读取权限】
方法二:WSS WebSocket 服务(端口建议 9501~9505)
将 Swoole\Http\Server 换为 Swoole\WebSocket\Server,其余 ssl 参数完全一致;前端 JS 必须用 wss://your-domain.com:9501 连接,域名须与证书一致。
启动与验证
第一步:在宝塔终端中切换到项目目录,执行 php https_server.php 启动服务。
第二步:检查进程是否存活:ps aux | grep https_server,确认有 php 进程且未立即退出。
第三步:用 curl 测试 HTTPS 接口:curl -I https://your-domain.com --insecure,返回 HTTP/2 200 表示 TLS 握手成功;若报 “Connection refused”,检查端口是否被防火墙拦截(宝塔安全组需放行 443 或自定义端口)。
第四步:浏览器访问 https://your-domain.com,地址栏出现锁图标且无证书警告,即配置完成。


















