HTTP/2 开启后为什么资源加载反而变慢了?
我最近把项目从 HTTP/1.1 升级到 HTTP/2,本以为能提升性能,结果首页加载时间反而比之前还长。服务器是 Nginx,已经确认 http2 模块开启,Chrome DevTools 也显示协议是 h2。
试过合并小文件、减少请求数这些 HTTP/1 的优化手段,但听说 HTTP/2 不需要这么做?是不是我哪里配置错了?比如是不是 TLS 配置影响了性能?现在用的是自签名证书做本地测试。
Nginx 相关配置如下:
server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 其他配置...
}
本地测试用自签名证书的话,浏览器每次都要完整验证证书链,而且没有缓存,每次SSL握手都要重新来一遍。这个开销可比HTTP/1.1大多了,因为HTTP/2一个连接里要跑很多个请求,每个请求都要走一遍握手或者至少要从缓存里拿session,配置不好反而更慢。
先试试把TLS配置优化一下,加个session cache和ticket key:
改完以后
nginx -s reload试试。另外提醒一下,HTTP/2虽然不需要合并小文件了,但如果你之前为了HTTP/1.1合并的那些资源现在拆开了,可能请求数反而变多了这也是个坑。你可以用Chrome DevTools的Timing面板看看,是卡在SSL握手还是TTFB上,这样能更准确定位。
如果能搞个正式的免费证书(比如Let's Encrypt),测试结果会准确很多。自签名这玩意儿本地跑跑还行,生产环境模拟的话误差太大了。