swoole 4 启用 https 需创建 ssl 模式 http 服务器,指定绝对路径的 pem 格式 fullchain.pem 和无密码私钥,使用 swoole_sock_tcp | swoole_ssl 模式,确保证书权限合规、php 启用 openssl 支持,并推荐生产环境采用 nginx 反向代理终止 ssl。

要让 Swoole 4 正确启用 HTTPS,核心是创建 SSL 模式的 HTTP 服务器,并确保证书路径、格式和权限全部合规。Swoole 4 原生支持 TLS 加密,但不兼容带密码的私钥,也不接受相对路径或 PEM 格式错误的证书文件。
证书准备与格式要求
必须使用 PEM 格式证书,且结构完整:
- ssl_cert_file 应为域名证书 + 中间 CA 证书合并后的 fullchain.pem(不能只放域名.crt)
-
ssl_key_file 必须是无密码的私钥(可用
openssl rsa -in key.pem -out key_nopass.pem去密) - 两个文件都需用绝对路径,如
/etc/ssl/example.com/fullchain.pem - 确认私钥权限为
600,证书文件权限建议644,避免因权限拒绝加载
Swoole 4 启动 HTTPS 服务
使用 SWOOLE_SOCK_TCP | SWOOLE_SSL 模式启动 HTTP Server,示例配置如下:
$server = new Swoole\Http\Server("0.0.0.0", 443, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$server->set([
'ssl_cert_file' => '/etc/ssl/example.com/fullchain.pem',
'ssl_key_file' => '/etc/ssl/example.com/privkey.pem',
'worker_num' => 4,
'max_request' => 3000,
]);
$server->on('Request', function ($request, $response) {
$response->header('Content-Type', 'text/html; charset=utf-8');
$response->end('<h1>HTTPS OK via Swoole 4</h1>');
});
$server->start();
注意:Swoole 4 要求 PHP 编译时启用 OpenSSL 支持,且扩展需加载成功(php --ri swoole 中应显示 openssl => enabled)。
常见失败原因排查
服务启动后无法访问 HTTPS,优先检查以下几项:
- 是否监听了
443端口?Linux 下需 root 权限绑定该端口,或改用非特权端口(如 8443)测试 - 防火墙是否放行 443(
ufw allow 443或 Windows 防火墙规则) - 证书链是否完整?用
openssl verify -CAfile fullchain.pem cert.pem验证信任链 - PHP 错误日志中是否有
SSL context initialization failed类提示——通常指向路径错、权限不足或私钥加密
生产环境建议部署方式
直接由 Swoole 处理 HTTPS 虽高效,但在高并发或需 WAF、HTTP/2 多路复用等场景下,更推荐反向代理模式:
- Nginx 终止 SSL,监听 443 并转发 HTTP 请求至 Swoole 的 9501 等内部端口
- 此时 Swoole 不启用 SSL,只需普通 TCP Server,降低主进程安全风险
- Nginx 可统一管理证书续期、HSTS、OCSP Stapling 和 TLS 参数优化











