HTTP/2 开启后为什么资源加载反而变慢了?

Zz彤彤 阅读 48

我最近把项目从 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;
    # 其他配置...
}
我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
小玉曼
小玉曼 Lv1
兄弟,你这个情况我遇到过,自签名证书大概率是罪魁祸首。

本地测试用自签名证书的话,浏览器每次都要完整验证证书链,而且没有缓存,每次SSL握手都要重新来一遍。这个开销可比HTTP/1.1大多了,因为HTTP/2一个连接里要跑很多个请求,每个请求都要走一遍握手或者至少要从缓存里拿session,配置不好反而更慢。

先试试把TLS配置优化一下,加个session cache和ticket key:

server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

# 启用session缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

# TLS版本和加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

# 其他配置...
}


改完以后 nginx -s reload 试试。

另外提醒一下,HTTP/2虽然不需要合并小文件了,但如果你之前为了HTTP/1.1合并的那些资源现在拆开了,可能请求数反而变多了这也是个坑。你可以用Chrome DevTools的Timing面板看看,是卡在SSL握手还是TTFB上,这样能更准确定位。

如果能搞个正式的免费证书(比如Let's Encrypt),测试结果会准确很多。自签名这玩意儿本地跑跑还行,生产环境模拟的话误差太大了。
点赞
2026-03-17 12:00