必须开启open_http2_protocol且服务端启用SSL/TLS,二者缺一不可;该参数须显式设为true(非字符串或数字),仅影响协议解析层;HTTP/2强制基于TLS,需SWOOLE_SOCK_TCP|SWOOLE_SSL组合及有效PEM证书,编译时还需启用--enable-http2和--enable-openssl。

必须开启 open_http2_protocol,且服务端需启用 SSL/TLS —— HTTP/2 在 Swoole 中默认不生效,光设参数不够,缺一不可。
open_http2_protocol 参数必须显式设为 true
Swoole 的 HTTP 服务器默认只解析 HTTP/1.1,open_http2_protocol 是开关型配置,没有“自动探测”逻辑。即使客户端用 h2 连接,服务端没开这个选项,也会降级处理或直接拒绝。
- 值必须是布尔
true,不能写成字符串"true"或数字1 - 该配置仅影响协议解析层,不改变底层连接行为
- 若同时监听 HTTP/1.1 和 HTTP/2,Swoole 会根据 ALPN 协商结果自动分发,无需额外路由判断
SSL/TLS 是硬性前提,HTTP/2 无法在明文端口运行
Swoole 实现遵循 RFC 7540,要求 HTTP/2 必须基于 TLS(即 HTTPS),所以 SWOOLE_SOCK_TCP | SWOOLE_SSL 是唯一合法 socket 类型组合;用纯 TCP(SWOOLE_SOCK_TCP)启动 HTTP/2 服务会静默失败或报错 ssl handshake failed。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 证书路径必须正确:确保
ssl_cert_file和ssl_key_file指向可读 PEM 文件 - 私钥不能有密码保护,否则
swoole_server->start()会卡住或抛出SSL_CTX_use_PrivateKey_file failed - 开发环境可用自签名证书,但浏览器访问时需手动信任;生产环境务必使用可信 CA 签发证书
编译时依赖必须完整,否则配置无效
open_http2_protocol 开关只是入口,底层依赖 nghttp2 和 OpenSSL。如果 Swoole 编译时未启用 --enable-http2 和 --enable-openssl,运行时即使设了该参数,也只会忽略并记录警告 http2 protocol is not supported。
- 检查是否支持:运行
php --ri swoole,确认输出中包含http2 => enabled和openssl => enabled - 常见遗漏:Ubuntu/Debian 用户常漏装
libnghttp2-dev,导致编译时 http2 自动被禁用 - 升级 Swoole 后务必重新编译,旧版本(如 v4.8.0 之前)对 ALPN 支持不完整,可能握手失败
最容易被忽略的是证书私钥格式和权限 —— 即使所有配置都对,ssl_key_file 若是 PKCS#8 格式或权限为 644 以外(如 600 但属主不对),Swoole 进程就无法读取,也不会明确报错,只表现为连接超时或空响应。

















