必须依赖外部反向代理(如 nginx)终止 tls 并协商 http/2,workerman 4.0.20 自身不支持 http/2;需确认 php ≥ 8.1、启用 openssl/curl 扩展,并配置 nginx 启用 http2 模块及 tlsv1.3。

要在 Workerman 4.0.20 中启用 HTTP/2 协议,必须绕过其原生 HTTP Worker 的限制——它仅支持 HTTP/1.1,且不内置 TLS 握手与 ALPN 协商能力。
确认 Workerman 版本与 PHP 环境兼容性
执行 php -v 确认 PHP 版本 ≥ 8.1;运行 php -m | grep openssl 和 php -m | grep curl 验证 openssl 与 curl 扩展已启用。Workerman 4.0.20 本身不提供 HTTP/2 支持,【必须依赖外部反向代理(如 Nginx)终止 TLS 并协商 HTTP/2】,否则直接用 Workerman 启动的 http:// 地址永远无法触发 HTTP/2。
配置 Nginx 作为 HTTP/2 入口网关
编辑 Nginx 配置文件(如 /etc/nginx/sites-enabled/workerman.conf),添加以下内容:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
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;
}
}
注意:Nginx 必须编译时启用 --with-http_v2_module,且 OpenSSL ≥ 1.0.2(推荐 3.0+)。若 reload 失败并提示 unknown directive "http2",说明 Nginx 版本过低(需 ≥ 1.9.5)。
启动 Workerman HTTP Worker(纯 HTTP/1.1 后端)
创建 server.php:
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$http_worker = new Worker('http://0.0.0.0:8080');
$http_worker->count = 4;
$http_worker->onMessage = function ($connection, $request) {
// 此处 request 实际来自 Nginx 转发,协议版本为 HTTP/1.1
$connection->send("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from Workerman over HTTP/2 (via Nginx)");
};
Worker::runAll();
运行 php server.php start -d。此时 Workerman 仅监听本地 8080 端口,不做 TLS,不处理 ALPN,完全交由 Nginx 承担 HTTP/2 协商职责。
验证 HTTP/2 是否生效
方法一:浏览器开发者工具 → Network 标签页 → 刷新页面 → 查看任意请求的 Protocol 列,显示 h2 即成功;
方法二:终端执行 curl -I --http2 https://example.com,响应头中出现 HTTP/2 200 且无降级提示;
方法三:在 Chrome 访问 chrome://net-internals/#http2,搜索域名,确认存在活跃的 HTTP/2 会话流。若仍显示 h1,检查 Nginx 是否监听了 443 ssl http2、证书是否有效、域名是否匹配、客户端是否支持(旧版 Android WebView 或 IE11 不支持)。










