Nginx 启用 HTTP/2 的条件与配置
发布时间:2026-09-02 19:59       
更新时间:2026-09-03 03:50
HTTP/2 相对 1.1 的主要改进是多路复用——一个连接并行跑多个请求,省掉队头等待和重复建连。升级成本很低,但有个硬前提:主流浏览器只支持 HTTPS 之上的 HTTP/2,明文裸跑(h2c)在浏览器侧走不通。
一、前提条件
- 一张有效的 TLS 证书,HTTPS 已在 443 端口正常工作,且 TLS 协议版本在 1.2 以上——老式 TLS1.0 站点要先升级协议,浏览器才协商得到 h2。
- Nginx 1.9.5 以上且带 http_v2_module。用 nginx -V 2>&1 | grep -o with-http_v2_module 确认模块在位,主流发行版仓库的包默认都带。
二、改 listen 配置
在 HTTPS 的 server 块里:
```
server {
listen 443 ssl;
http2 on;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
}
```
老版本写法是 listen 443 ssl http2,1.25.1 起推荐独立的 http2 指令;两种写法哪种能用,以 nginx -t 的结果为准,报 unknown directive 就退回老写法。改完 nginx -t && nginx -s reload。
三、验证
```
curl -sI --http2 https://example.com/ | head -1
```
输出 HTTP/2 200 即生效。浏览器侧在开发者工具的网络面板加协议(Protocol)列,显示 h2 就是对的。也可以用 openssl s_client -alpn h2 -connect example.com:443 看 ALPN 协商结果,返回 ALPN protocol: h2 说明握手层已就绪。不支持 h2 的旧客户端会自动回落到 HTTP/1.1,无需额外配置,兼容性不用操心。顺带回答一个老问题:开了 h2 就不必再做域名分片了,多路复用本来就是为了取代这类老优化,硬留着反而有害。
四、收益预期
提速幅度取决于页面形态:静态资源多、曾经靠多域名绕并发限制的老页面收益明显,一个连接全搞定;图片多、请求碎的移动端页面在弱网下提升尤其直观,省掉的多次握手时间非常可观;请求少、后端慢的接口型站点体感提升有限。它是协议层优化,替代不了压缩、缓存、图片瘦身这些基础工作,别指望开了 HTTP/2 一夜变快。
两点提醒:一是确认 CDN 与负载均衡整条链路都支持 HTTP/2,端上开了中间断着也白搭;二是上线后留意 error.log,个别老客户端握手失败时可以观察一段时间再决定保留策略。开启后连接数下降,服务端的连接维护负担也会轻一点,两侧都受益。