http/2 server push已全面失效,chrome 96+、firefox 90+、safari 16.4+等主流浏览器均默认禁用或移除支持;应改用配合关键css内联、defer、tls 1.3等真实有效优化。

HTTP/2 的服务器推送(Server Push)能显著减少关键资源的加载延迟,但必须正确配置才能真正生效。它不是加个指令就自动提速,而是一套需要底层支持、路径约束和行为匹配的协同机制。
先确认 HTTP/2 基础已跑通
很多配置看似正确却没效果,问题常出在协议层根本没启用:
- 运行
nginx -V 2>&1 | grep -o with-http_v2_module,输出必须是with-http_v2_module,否则模块未编译 - 运行
nginx -V 2>&1 | grep -i openssl,OpenSSL 版本需 ≥ 1.0.2;若显示1.0.1e或更低,即使 Nginx 版本够也无效 - 用 Chrome 或 Firefox 打开开发者工具 → Network 面板 → 刷新页面,检查协议列是否为
h2;若仍是http/1.1,说明 ALPN 协商失败,后续推送不会触发
两种推送方式:硬推 vs 响应式预加载
官方不支持 http2_push_preload 指令,实际只有两种可用方式,适用场景不同:
-
http2_push /style.css;:只要命中该 location,每次响应都强制推送/style.css。适合首页固定资源(如/logo.svg、/main.js),但会浪费带宽,不推荐用于动态页面 -
http2_push_preload on;:只对响应头中含Link: ; rel=preload; as=style的请求才推送。需在 HTML 中手动加<link rel="preload" href="/style.css" as="style">,更可控,推荐用于 PHP 或模板渲染类站点 - 二者不能共存于同一 location 块,Nginx 会静默忽略后者
关键限制与避坑要点
推送失效往往源于细节疏漏,而非配置语法错误:
- 推送路径必须是绝对路径,以
/开头;http2_push style.css或/style.css?v=1都会被丢弃 - 仅对 Nginx 自身返回的静态文件生效;若后端是 PHP-FPM 或
proxy_pass,需由上游服务生成Link响应头,再配合http2_push_preload on - 若推送资源返回 4xx/5xx 状态码,Nginx 仍会发推送帧,但浏览器直接丢弃——建议搭配
try_files校验资源是否存在 -
http2_max_concurrent_streams默认 128,电商首页推 5 个资源时易被限流,建议设为256或更高
验证是否真正生效
不要只看 Nginx 日志或配置语法检查,要从客户端视角确认:
- Chrome DevTools → Network → 右键表头 → 勾选
Protocol和Initiator - 刷新页面后,找到
style.css这类资源,其Protocol应为h2,Initiator显示为Other(非 JS 或 HTML 触发),说明是服务端主动推送 - 对比关闭推送后的瀑布图,关键 CSS/JS 应与 HTML 基本同步到达,DOM 加载时间明显提前











