Nginx 开启 HTTP/2 后页面加载反而变慢了?
我按照教程在 Nginx 里加了 http2,但上线后发现首页加载比之前还慢,控制台也没报错,是不是配置哪里有问题?
我的 Nginx 配置里 listen 是这样写的:listen 443 ssl http2;,证书也正常。前端页面结构很简单:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>测试页</title>
</head>
<body>
<h1>Hello HTTP/2</h1>
<script src="/static/main.js"></script>
</body>
</html>
用 Chrome DevTools 看,所有资源还是走的 HTTP/1.1,根本没启用 HTTP/2,这到底怎么回事?
你配了
listen 443 ssl http2;看起来没问题,但 Chrome DevTools 里显示资源走 HTTP/1.1,大概率是以下几种情况之一:- 你首页是通过
http://打开的(比如浏览器自动补全或旧书签),虽然你监听了 443,但入口没走 HTTPS,那整个页面就还是 HTTP/1.1,所有子资源自然也跟着用 HTTP/1.1;- 你前端页面里写的
src="/static/main.js"是相对路径,但如果页面本身是 http:// 开头的,那这个资源也会走 http://,而你没监听 80 端口的 http2(HTTP/2 不能在明文 HTTP 上用);- 你用了反向代理(比如前面还有个 CDN 或负载均衡),但那个中间层没开启 HTTP/2,或者把 HTTPS 解密成 HTTP 了,导致 Nginx 收到的是 HTTP/1.1 请求;
排查步骤直接上:
1. 用
curl -I -k https://你的域名看响应头有没有HTTP/2 200,别光看浏览器,有时候浏览器缓存或重定向会搞鬼;2. 检查 Nginx 是否监听了 80 端口并做了 301 跳转到 HTTPS,比如:
3. 如果前面有 CDN,比如 Cloudflare,进去看看「SSL/TLS」模式是不是「Full (strict)」,别选成「Flexible」了,那个是前端到 CDN 是 HTTP,CDN 到你 Nginx 才 HTTPS,这种情况下你 Nginx 看不到 HTTP/2;
4. 最后确认下你浏览器地址栏是不是锁头图标,点进去看连接是否标着「HTTP/2」或「h2」,不是的话说明根本没走 HTTP/2;
对了,顺便提一句,HTTP/2 的优势在并发小资源少的页面上其实不明显,你这个页面就一个 JS,连个图片都没有,测出来慢可能只是网络抖动,建议用
curl --http2 -I https://your-domain.com多跑几次对比下时间,别光看 DevTools 的 waterfall,有时候它会误判。要是还不行,把你的 Nginx 完整 server block 贴出来,我帮你过一遍。