Nginx中正确配置HTTP/2推送需满足四条件:启用http_v2_module模块、OpenSSL≥1.0.2、listen 443 ssl http2、Protocol显示h2;推送路径须为绝对路径且仅限静态文件响应;配合Link头声明preload语义;验证须见DevTools中Initiator为Push或nghttp输出PUSH_PROMISE。
要在 Nginx 中正确配置 HTTP/2 推送(Server Push)以提前加载关键静态资源,核心不是“开个开关就生效”,而是确保协议就绪、路径合规、顺序合理、验证到位。很多配置看似写对了却没推送,问题往往出在底层条件未满足或语义误用上。
推送功能依赖真实运行的 HTTP/2 连接,不是仅靠配置就能触发:
nginx -V 2>&1 | grep with-http_v2_module,输出必须含 with-http_v2_module;若为空或报错,需重新编译安装并启用该模块nginx -V 2>&1 | grep -i openssl,OpenSSL 版本必须 ≥ 1.0.2(推荐 ≥ 1.1.1);1.0.1e 或更低版本即使 Nginx 版本达标也无效http2 参数,且仅作用于 HTTPS 端口:listen 443 ssl http2;;HTTP/2 不支持明文 HTTPh2;若仍为 http/1.1,说明 ALPN 协商失败,推送不会启动这是最直接的硬编码推送方式,适用于首页等固定路径场景,但有严格限制:
/ 开头,如 http2_push /style.css;;/style.css?v=1 或 style.css 会被静默忽略root 或 alias 提供的静态文件);若走 proxy_pass 或 fastcgi_pass,推送不触发http2_push /main.css;
http2_push /logo.png;
http2_push /banner.jpg;
<link rel="stylesheet">、内联 <script> 所需 JS),不推送 <img src> 中的非首屏图单靠 http2_push 无法告诉浏览器“这个 CSS 很重要”,需用 Link 头补充语义:
add_header Link '</main.css>; rel=preload; as=style, </logo.png>; rel=preload; as=image';
as=style 让浏览器将 CSS 加入高优先级 preload 队列,立即解析;as=image 则归入图像队列,调度权重更低Link 头,再配合 http2_push_preload on; 可触发推送(注意:http2_push 与 http2_push_preload 不能共存于同一 location)不能只看配置有没有报错,要从传输层确认:
h2,“Initiator” 列是否标为 Push(而非 Other 或 Parser)nghttp -v https://your-domain.com/demo.html,输出中出现 PUSH_PROMISE 行即表示推送已发出try_files 预检资源是否存在