服务器推送是 HTTP/2 的一项功能,允许服务器或 edge
网络将资源发送回 Web 浏览器,即使浏览器没有请求它们
随着 Nginx 1.13.9
版本的发布,Nginx 正式支持 HTTP/2。至此,所有的主流 Web 服务器都支持 HTTP/2 了。
HTTP/2 服务器推送是一种更现代的,更高效的资源响应方式,有点类似于 HTTP/1.1 中常见的 「 内联 」 资源文件的做法
「 内联 」 是指将外部 JavaScript 和 CSS 资源转换为 HTML 页面中的 <script> 和 <style> 元素。这样做的目的是 「 最小化浏览器和服务器之间的 HTTP 请求数 」
服务器推送完成同样的事情,且允许资源文件单独被缓存,这样你就不会向访问者请求的每个网页发送相同的内联 CSS 样式
开启服务器推送
Nginx 支持使用 Link
头部字段来开启 HTTP/2 服务器端支持。为了使用服务器推送,大多数应用程序将需要更改其代码以包含具有可推送的资源文件的任何请求的 Link 头部字段。
例如,如果你有一个名为 index.html
的网页需要一个 /forum.css
的文件。为了开启 HTTP/2 支持,你需要将下面的代码添加到 HTTP 头部字段中
Link: </forum.css>; rel=preload;
它告诉我们的 edge
网络每次访问者请求 page.html 时都开始推送 /forum.css 。如果 forum.css 已经在本地浏览器缓存中,则浏览器将忽略推送并取消下载。当渲染 HTML 时发现需要 forum.css ,浏览器将使用推送的资源文件而不是再次请求服务器。这消除了在没有服务器推送的情况下发生的不必要的 TCP 往返
推送什么 ?
服务器推送是对 HTTP 的根本性改变。过去,Web 服务器只能简单的被动的响应来自客户端的请求,现在,它们可以主动将内容推送到浏览器。
这为几种新型网络优化打开了大门,一些最常见的用例如下:
- 必须的资源文件 - 服务器推送最常见的用例是网页所需的所有 CSS,JavaScript 和图像资源文件
- 不能缓存的动态资源 - 推送动态的资源意味着可以更快地访问浏览器,减少感知的页面加载时间
- 可能是下一个访问页面 - 通过推送用户可能加载的下一页 ( 例如,他们正在悬停的链接 ) ,服务器端推送可以使其看起来像是即时加载
- 重定向 - 也可以推送任意重定向,这样你就可以控制用户的浏览器缓存