要在 Nginx 中让 HTTP/2 多路复用真正生效,必须同时满足:可信 HTTPS 证书(如 Let’s Encrypt 全链)、listen 443 ssl http2 正确配置、TLSv1.2+ 与 ALPN 支持、现代 cipher suite;缺一即降级至 HTTP/1.1。
要在 Nginx 中让 HTTP/2 的多路复用真正生效,SSL 证书不是“配了就行”,而是必须和协议协商机制严格配合。核心在于:HTTPS 是前提,ALPN 是桥梁,listen 443 ssl http2 是触发开关——三者缺一不可。
浏览器只对可信证书协商 HTTP/2;自签名、过期、域名不匹配或链不完整(如缺中间证书)都会导致降级到 HTTP/1.1:
fullchain.pem + privkey.pem),而非仅 cert.pem
openssl s_client -connect your.site:443 -servername your.site -showcerts 2>/dev/null | grep "subject|issuer",确认根和中间证书都存在HTTP/2 不是可选模块开关,而是 TLS 握手阶段通过 ALPN 扩展声明的协议名。Nginx 必须在 server 块中明确告知客户端“我支持 h2”:
listen 443 ssl http2;(ssl 和 http2 必须在同一行)listen [::]:443 ssl http2;
listen 443 ssl; 后再加 http2 on; —— Nginx 会忽略或报错即使证书有效、listen 写对,若 TLS 层不支持协商 h2,连接仍会回落:
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/1.1)ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:...;
ssl_prefer_server_ciphers off;,让客户端优先选择其支持的强算法别只信配置文件,实测才是关键:
h2
curl -I --http2 https://yourdomain.com,响应首行应为 HTTP/2 200
:scheme: https 和 :protocol: h2,确认 stream 级别信息多路复用是协议自动行为,前端无需改代码。只要上述四点到位,浏览器就会在单个 TCP 连接上并发传输 HTML、CSS、JS、图片等资源,彻底绕开 HTTP/1.1 的队头阻塞。