http/2在nginx中不会自动生效,必须同时满足nginx≥1.9.5、openssl≥1.0.2、启用with-http_v2_module模块、listen 443 ssl http2、tlsv1.2+及alpn协商成功,缺一不可。

HTTP/2 在 Nginx 中不会“自动生效”,加了 listen 443 ssl http2 却没看到 h2,大概率是底层没跑通——不是配置漏了,而是环境不满足。
检查 Nginx 和 OpenSSL 是否真支持 HTTP/2
很多人卡在这一步就停了:Nginx 版本够、配置写了 http2,但浏览器 Network 面板里协议仍是 http/1.1。根本原因往往是 OpenSSL 不匹配或模块未启用。
- 运行
nginx -v确认版本 ≥1.9.5(推荐1.20.2+或最新稳定版) - 运行
nginx -V 2>&1 | grep -o with-http_v2_module,输出必须是with-http_v2_module(不能为空、不能报错) - 运行
nginx -V 2>&1 | grep -i openssl,确认路径指向你期望的 OpenSSL(如--with-openssl=/usr/local/ssl),且版本 ≥1.0.2e;若显示1.0.1e或指向系统旧库(如 CentOS 7 的/usr/lib64/libssl.so.1.0.2k),即使 Nginx 版本够也无效 - 运行
ldd $(which nginx) | grep ssl,确保链接的是你编译时指定的 OpenSSL 动态库(例如libssl.so.1.1),不是系统默认旧版
listen 指令必须同时含 ssl 和 http2
单独写 listen 443 http2 或 listen 443 ssl 都不行——HTTP/2 在浏览器中强制要求 TLS,Nginx 会静默忽略不合规的写法。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 正确写法只有两种:
listen 443 ssl http2;(IPv4)和listen [::]:443 ssl http2;(IPv6) -
ssl和http2顺序无关,但缺一不可;ssl表示启用 HTTPS,http2表示启用 ALPN 协商 - 必须配对使用
ssl_certificate和ssl_certificate_key,路径要可读,且文件为 PEM 格式(不能是 DER 或 PFX) -
ssl_protocols必须包含TLSv1.2或更高:ssl_protocols TLSv1.2 TLSv1.3;;禁用TLSv1.0和TLSv1.1,否则 ALPN 可能被跳过
验证是否真走 h2,而不是假成功
nginx -t && systemctl reload nginx 成功不代表 HTTP/2 就通了。ALPN 协商失败时,Nginx 会退回到 HTTP/1.1,且不报错。
- 浏览器打开 DevTools → Network → 刷新页面 → 右键表头勾选
Protocol,任意请求应显示h2(不是http/1.1) - 命令行验证:
curl -I --http2 https://your-domain.com,返回HTTP/2 200且无重定向才算基础通路正常 - 若仍是 HTTP/1.1,用
openssl s_client -alpn h2 -connect your-domain.com:443 2>/dev/null | grep ALPN查看服务端是否通告ALPN protocol: h2;为空说明后端未启用 ALPN(常见于 CDN 中间层拦截或 OpenSSL 链接错误) - 注意:Cloudflare 免费版等部分 CDN 会终止 HTTP/2 连接,客户端到 CDN 是 h2,CDN 到你的 Nginx 是 HTTP/1.1,此时你服务器日志和本地 curl 看不到 h2
负载均衡场景下需双链路都启用 HTTP/2
如果你用 Nginx 做反向代理,只在前端加 http2 没用——后端连接默认仍是 HTTP/1.1,多路复用断在入口。
- 前端(client → Nginx):确保
listen 443 ssl http2+ 有效证书 + TLSv1.2+ - 后端(Nginx → upstream):
proxy_pass必须指向https://地址,不能是http:// - 在
location块中添加:proxy_http_version 2.0;、proxy_set_header Connection '';、proxy_set_header Upgrade ''; - 建议在
upstream块中启用连接池:keepalive 32;,配合proxy_http_version 2.0才能让单连接承载多个 stream
最常被忽略的是 OpenSSL 实际链接版本和 ALPN 协商状态——它们不出错,但会让整个 HTTP/2 配置形同虚设。










