在上一篇文章(做事器推送实在便是如此大略)中,我们已经知道,在 Web 运用中,浏览器和做事器之间利用的是要求 / 相应的交互模式。这种办法的不敷之处在于:做事器端产生的数据变革不能及时地关照浏览器,而是须要等到下次要求发出时才能被浏览器获取。目前常见的办理办法紧张可以分成两类。一类是不该用 HTTP 协议的做法,即利用 HTML 5 新增的 WebSocket 规范;另一类是利用 HTTP 协议的做法,包括大略单纯轮询、COMET 技能和 HTML 5 做事器推送事宜。
下面就着重先容下HTML 5 做事器推送事宜。
做事器推送(server push)指的是,还没有收到浏览器的要求,做事器就把各种资源推送给浏览器。

比如,浏览器只要求了index.html,但是做事器把index.html、style.css、example.png全部发送给浏览器。这样的话,只须要一轮 HTTP 通信,浏览器就得到了全部资源,提高了性能。
做事器推送事宜示意图
传统的网页要求办法是什么样的如上图所示,在传统的网页要求办法之下,如果要显示index.html页面,浏览器会发出三个要求。第一个要求是获取index.html标签构造。
做事器收到这个要求,就会把index.html标签构造发送给浏览器。当浏览器创造里面包含了样式表和图片后,它会再发出两个要求,以获取样式表和图片。如下:
传统的网页要求办法有两个问题,
一是至少须要两轮 HTTP 通信。
二是收到样式文件之前,网页都会显示一片空缺,这个阶段一旦超过2秒,用户体验就会非常不好。
针对以上问题,有人提出如下办理方案:
一种办理办法便是把外部资源合并在网页文件里面,减少 HTTP 要求。比如,把样式表的内容写在<style>标签之中,把图片改成 Base64 编码的Data URL。
另一种方法便是资源的预加载(preload)。即网页预先见告浏览器,下个页面须要哪些资源,让浏览器先把这些资源下载下来。如下:
这两种方法,虽然在一定程度上,办理了问题,但实际上它们都有缺点。
第一种方法虽然减少了 HTTP 要求,但是把不同类型的代码合并在一个文件里,违反了分工原则。
第二种方法只是提前了下载韶光,并没有减少 HTTP 要求。
在此情形下,做事器推送事宜应运而生。
做事器推送事宜的实现办法做事器推送事宜的实现有多种办法,既可以利用Nginx实现,也可以利用Apache实现,还可以利用后端脚本实现。
1、利用Nginx实现
首先,进入事情目录,把原来默认的首页index.html删除。
然后,新建html/index.html文件,写入本文第一节的网页源码。
其余,html子目录下面,还要新建两个文件example.png和style.css。前者可以随便找一张 PNG 图片,后者要在里面写一些样式。
末了,打开配置文件conf/conf.d/default.conf,将 443 端口的部分改成下面的样子。
在上图中,末了两行的http2_push命令,它的意思是,如果用户要求根路径/,就推送style.css和example.png。
启动做事器,打开浏览器,访问 https://127.0.0.2:8081 ,就能看到网页了。
把稳:网页上看不出来做事器推送,必须打开\"大众开拓者工具\公众,切换到 Network 面板,就可以看到实在只发出了一次要求,style.css和example.png都是推送过来的。如下:
2、利用Apache实现
利用Apache实现做事器推送的操作,如Nginx差不多,可以在配置文件httpd.conf或者.htaccess里面打创办事器推送。如下:
3、利用后端脚本实现
通过上面讲解,我们知道,无论是利用Nginx实现,还是利用Apache实现,实在现操作,都须要写在做事器的配置文件里面。这显然很未便利,由于每次修正后,你都要重启做事,而且运用与做事器的配置也不应该混在一起。
那么有没有一种,可以不在做事器配置文件里操作,就能实现的方法呢?答案是,有的,这便是利用后端脚本实现。利用后端脚本实现,便是后端运用产生 HTTP 相应的头信息Link命令,做事器创造有这个头信息,就会进行做事器推送。如下:
如果要推送多个资源,就写成下面这样。
利用后端脚本实现做事器推送事宜,不分措辞,像PHP、Java、Python、Node、Go……等后端措辞都行,只要能改变要求的相应头信息就可以。如PHP的实现办法:
把稳事变
做事器推送事宜有一个很麻烦的问题,便是要推送的资源文件,如果浏览器已经有缓存,推送便是摧残浪费蹂躏带宽。纵然推送的文件版本更新,浏览器也会优先利用本地缓存。
Nginx 官方此问题,给出了它的办理方案,也便是根据 Cookie 判断是否为第一次访问,只有第一次访问才开启做事器推送事宜。
其余,虽然做事器推送可以提高性能。但根据网上测评的结果来看,提升程度也不是特殊多,大概是几百毫秒。基于此,不建议一次推送太多资源,由于这样反而会拖累性能,推举只推送CSS 样式表。
本文参考了“阮一峰博客”的《HTTP/2 做事器推送(Server Push)教程》文章