nginx HTTP/2 模块是不是支持服务器推送?

Posted

技术标签:

【中文标题】nginx HTTP/2 模块是不是支持服务器推送?【英文标题】:Does the nginx HTTP/2 module support Server Push?nginx HTTP/2 模块是否支持服务器推送? 【发布时间】:2016-02-05 20:28:43 【问题描述】:

我打算将我的 nginx 升级到支持 HTTP/2 的 1.9.6。

nginx实现了HTTP/2服务器推送吗?

参考: https://ma.ttias.be/service-side-push-http2-nghttp2/

【问题讨论】:

【参考方案1】:

是的,自 2018 年 2 月 20 日发布的 version 1.13.9 以来,Nginx 支持 HTTP/2 服务器推送。

Nginx 团队在原1.9.5 blog post 中指出,当时不支持。

【讨论】:

从 2016 年 9 月 13 日的 v 1.11.4 开始,这仍然是正确的。 关于服务器推送何时会添加到 nginx 的任何消息?等待这个如此糟糕......【参考方案2】:

您需要通过 nginx plus 订阅 https://www.nginx.com/blog/http2-r7/ 付费。

Apache 免费提供

https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2push

【讨论】:

来自您的 URL:“此版本不支持 HTTP/2 RFC 中定义的“服务器推送”功能。NGINX Plus 的未来版本可能包含它。” 我贴了两个网址,哪一个说不支持? 来自第一个链接:“此版本不支持 HTTP/2 RFC 中定义的“服务器推送”功能。NGINX Plus 的未来版本可能包含它。”【参考方案3】:

编辑:

Nginx 自 2018 年 2 月 20 日发布的 v1.13.9 起支持 HTTP/2 服务器推送。

旧答案:

自 2017 年 3 月 (v1.11) 起,Nginx 不支持 HTTP/2 服务器推送。

nginx 的 Owen Garrett 总结了以下原因:

它是http/2的非必要和可选部分

如果客户端已经缓存了资源,那么将其推送给它们可能会不必要地浪费带宽。

服务器推送规范未来可能会发生变化。

链接标题作为提示很有用,但 Web 开发人员的使用率很低。

服务器推送已作为 SPDY 的一部分提供,并未被许多 Web 开发人员使用。

阅读他原来的 cmets here。这个table 准确地描述了服务器提示与服务器推送的优缺点。

就我个人而言,这让我很失望,因为我认为对于愿意花时间优化页面速度的 Web 开发人员来说,这将是一项有价值的功能。我也知道一些像 Cloudflare 这样的大型 CDN 已经在 nginx 中实现了自己的版本来优化页面下载。

【讨论】:

这并不像人们想象的那样浪费带宽。推送对象的标头首先发送(在请求的页面之前),以便客户端应该有一些时间来取消服务器推送。 @StephenKing 如果实现了服务器推送,则客户端可能在与服务器推送相关的帧已经到达之前没有机会重置。所以很可能是浪费。但是,有几种明显的解决方案可以避免推送可能被缓存的资产,包括使用 cookie 和简单的日志历史记录。 我喜欢 Owen 所说的“Web 开发人员的使用率很低”——这不是 因为 Nginx 不支持它吗?!【参考方案4】:

自 2018 年 2 月 8 日起,nginx 已添加对 http/2 服务器推送的支持:

https://hg.nginx.org/nginx/rev/641306096f5b

【讨论】:

我刚刚试了一下,效果很好 - 您可以为静态内容(直接由 NGINX 提供服务器)和后端(只要后端通过 Link 标头宣传链接)进行设置。我记录了我在这里学到的东西:ops.tips/blog/nginx-http2-server-push

以上是关于nginx HTTP/2 模块是不是支持服务器推送?的主要内容,如果未能解决你的问题,请参考以下文章

GRPC+Nginx

Nginx 核心架构设计,揭秘其为何能支持高并发?

HTTP/2 服务器推送(Server Push)教程(HTTP/2 协议的主要目的是提高网页性能,配置Nginx和Apache)

使用 nginx 和 http 推送模块保护通道

如何在 curl 中使用 HTTP/2 的推送功能?

HTTP 2 将支持服务器推送,这是啥意思?