Windows 7下Nginx 1.13.12的http2_push功能无法生效求助
我之前调试Nginx HTTP/2推送时也碰到过类似的情况,结合你的配置和Windows 7环境,咱们从这几个关键点逐一排查:
1. 确认Nginx是否编译了HTTP/2模块
虽然Nginx 1.13.9+默认支持http2_push,但Windows版本的Nginx可能存在编译时未包含HTTP/2模块的情况。你可以打开命令行,进入Nginx安装目录,执行:
nginx -V
查看输出内容,确认是否包含--with-http_v2_module参数。如果没有,说明你的Nginx版本不支持HTTP/2,需要更换一个带HTTP/2模块的Windows发行版。
2. 验证推送资源的路径与可访问性
你的配置里http2_push /stylepush.css,搭配root html;,意味着这个CSS文件必须放在Nginx安装目录下的html文件夹中(和test.html同目录)。你可以先直接访问https://localhost/stylepush.css,确认能正常加载该文件。如果返回404,Nginx找不到资源自然无法完成推送。
3. 正确使用Chrome开发者工具查看推送状态
Chrome中查看HTTP/2推送不能只看普通请求列表,需要做这两步:
- 右键点击Network面板的表头(比如Name、Status列),勾选Initiator选项
- 开启Network面板的Disable cache,然后用
Ctrl+Shift+R硬刷新页面
之后看stylepush.css的Initiator列,如果显示Push /test.html,说明推送成功;如果没有这个条目,还要检查Chrome的实验性设置:打开chrome://flags/#disable-http2,确保该选项是Disabled状态,重启浏览器后再试。
4. 检查Nginx错误日志
打开Nginx安装目录下的logs/error.log,查看是否有和http2_push相关的报错信息,比如文件找不到、权限不足等。Windows系统下,静态资源的权限设置偶尔会导致Nginx无法读取文件,这也会阻断推送。
5. 确认HTTP/2连接已正常建立
在Chrome Network面板中,查看test.html请求的Protocol列,确认显示的是h2(而非http/1.1)。如果是http/1.1,说明HTTP/2连接未生效,推送自然无法工作。此时需要:
- 再次确认浏览器信任你的自签名证书(地址栏的锁图标显示“安全”)
- 检查443端口是否被其他程序占用(可以用
netstat -ano | findstr ":443"命令查看)
更可靠的推送配置建议
你可以尝试改用http2_push_preload的方式,这种方式和页面的预加载声明绑定,兼容性更好:
修改Nginx配置:
location = /test.html { root html; http2_push_preload on; }
然后在test.html中添加预加载标签:
<link rel="preload" href="/stylepush.css" as="style"> <link rel="stylesheet" href="/stylepush.css">
Nginx会自动识别页面中的rel="preload"标签,完成资源推送。
内容的提问来源于stack exchange,提问作者Pankit Kapadia




