http/2服务启动后浏览器打不开,首要检查监听地址是否为0.0.0.0(而非127.0.0.1),其次排查证书问题:须使用含san的合法https证书、fullchain.pem路径正确、私钥权限为600,且域名与证书完全匹配。

HTTP/2 服务启动了但浏览器打不开,先看监听地址是不是 0.0.0.0
Hyperf 默认的 server.php 配置里如果 host 写的是 127.0.0.1,那 HTTP/2 服务只绑定了本地回环,外部机器或宿主机(比如 Windows 下访问虚拟机)根本连不上。这不是协议问题,是网络层就断了。
必须确认 config/autoload/server.php 中对应 server 的 host 是 "0.0.0.0",不是 "127.0.0.1" 或空字符串:
'host' => '0.0.0.0',
'port' => 9502,
'settings' => [
'http_protocol' => SWOOLE_HTTP_V2,
'ssl_cert_file' => '/path/to/fullchain.pem',
'ssl_key_file' => '/path/to/privkey.pem',
],
改完别忘了重启服务:php bin/hyperf.php start,而不是 Ctrl+C 后直接再跑——残留进程可能还在占端口。
Chrome/Firefox 显示 ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY
这是浏览器明确拒绝 HTTP/2 连接的信号,99% 是证书问题。Swoole 的 HTTP/2 要求 TLS 1.2+ 且禁用不安全的加密套件,自签名证书、过期证书、或仅含域名 IP 的证书都会触发这个错误。
- 不能用
openssl req -x509 -nodes -days 365 -newkey rsa:2048这类裸签的自签名证书;必须带 SAN(Subject Alternative Name),且包含你实际访问的域名(如localhost或dev.example.com) - 证书链不完整:
ssl_cert_file必须是 fullchain.pem(证书 + 中间 CA),不能只是 domain.crt - 私钥权限不对:确保
ssl_key_file文件权限为600,否则 Swoole 启动时静默失败(日志里可能只报SSL context setup failed)
cURL 命令能通,但浏览器打不开
说明服务本身是工作的,只是浏览器校验更严。用以下命令快速验证:
curl -k --http2 https://localhost:9502
如果返回正常,基本可锁定是证书信任链或域名匹配问题。这时候别急着重签,先检查:
- 浏览器地址栏输的是
https://开头,不是http://——HTTP/2 在浏览器中强制走 HTTPS - 访问域名是否和证书里的 CN/SAN 完全一致(
dev.local≠localhost) - 系统时间是否准确?证书有效期校验依赖本地时间,差几分钟都可能被拒
启用 HTTP/2 后请求卡住或 503 错误
常见于 Swoole 底层配置缺失。HTTP/2 对连接复用和流控更敏感,settings 里漏掉关键项会导致握手后无法 dispatch 请求:
- 必须显式设置
'http_protocol' => SWOOLE_HTTP_V2,光开 TLS 不等于启用了 HTTP/2 - 建议加上
'open_http2_protocol' => true(部分 Swoole 版本需要) - 若使用自定义 SSL 参数,避免设置
'ssl_method' => TLSv1_2_METHOD以外的值,Swoole 5.x 对 TLSv1.3 支持不稳定 - 检查
swoole.version:Hyperf 3.x 推荐搭配 Swoole 5.1.4+,旧版本在 HTTP/2 下偶发 stream reset
真正容易被忽略的是:哪怕证书和配置全对,只要 ssl_cert_file 路径里有中文、空格或软链接未解析,Swoole 就会静默降级回 HTTP/1.1,而日志未必报错。务必用绝对路径 + file_exists() 确认文件可读。











