http/2 server push 在 nginx 中已失效,因主流浏览器自2021年起移除 push_promise 支持,nginx 稳定版默认不维护 http2_push;应改用 link: ; rel=preload 响应头实现兼容性预加载。

HTTP/2 Server Push 在 Nginx 中已基本不可用。主流浏览器(Chrome 96+、Firefox 97+、Edge 96+)自 2021 年起陆续移除对 PUSH_PROMISE 帧的支持,Nginx 官方也早在 1.13.9 后逐步弱化并最终不再维护 http2_push 指令——当前稳定版(如 1.24.x / 1.26.x)默认不包含该功能,所谓“配置成功”多为服务端单向发送、客户端静默丢弃。
为什么你配了 http2_push 却没效果
不是配置写错,而是协议层已失效:
- Chrome DevTools 的 Network 面板中不再显示 “Push” 类型请求,
Initiator列只会显示Other或preload -
chrome://net-internals/#http2虽可能看到PUSH_PROMISE日志,但对应 stream 状态常为Abandoned,说明浏览器主动拒绝 - Lighthouse 或旧教程仍提及 Server Push,属于未同步更新的过时建议
- Nginx 日志若出现
push limit exceeded,仅表示服务端尝试推送失败,不代表客户端接收
真正有效且标准的替代方案:Link preload 响应头
用 HTTP 响应头 Link: ; rel=preload; as=style 替代 Server Push,兼容 HTTP/1.1 和 HTTP/2,语义清晰、可控性强、支持缓存协商:
- 在站点 Nginx 配置的
location = /index.html或根location /块中添加:add_header Link '/css/app.css>; rel=preload; as=style', '/js/runtime.js>; rel=preload; as=script'; - 路径必须为绝对 URI(以
/开头),as属性需准确(style、script、font、image等) - 该头默认透传,无需额外模块;若使用 PHP/Node.js 等后端,也可由应用层动态生成,更灵活精准
宝塔面板实操要点
若你正用宝塔管理站点,只需三步完成现代预加载:
- 确认 Nginx ≥ 1.13.9(推荐 1.26.x),SSL 证书有效,且监听行已改为:
listen 443 ssl http2; - 进入【网站】→【设置】→【配置文件】,在
location / { ... }内插入add_header Link指令(勿放server全局块,避免对图片、API 等非 HTML 响应误加) - 保存后点击【重载配置】,用 Chrome DevTools → Network → Headers 查看响应中是否有
link:字段,并检查目标资源Initiator是否为preload
进阶提醒:别推,要判
真正的性能优化不在“推多少”,而在“推不推”:
- 已带
Cache-Control: immutable或强缓存的 CSS/JS,不应重复预加载 - 字体文件(
.woff2)体积小、首屏关键时才加as=font;大图、视频等一律跳过 - 动态页面建议由后端解析 HTML 后按需注入
Link头,比静态 Nginx 配置更准确 - 内联极小关键 CSS(
<style></style>)仍是最快首屏手段,比任何推送都可靠
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











