让互联网更快,Server Push 特性及开启方式详解
过去 Nginx 并不支持 HTTP/2 的 Server Push 特性,幸运的是 Nginx 1.13.9 已支持该特性,详情介绍请移步 Nginx 官方博客。
Server Push 这个特性是让服务端将部分资源主动推送给客户端(浏览器),节约了客户端需要使用这些资源再次发送请求所消耗的时间。
又拍云在 Nginx 基础上,其全网 CDN 已支持 HTTP/2 的 Server Push 特性,成为国内首家推出 Server Push 功能的 CDN 厂商。这也是自又拍云 CDN 全网支持 TLS 1.3 以来,又一重要特性的更新。将来,我们会一如既往、不遗余力地保持新特性的更新迭代,为全网用户带来更加快速的访问体验。
本文将围绕以下 3 个方面来介绍 Server Push 特性:
- 什么是 Server Push ?
- 如何使用 Server Push ?
- 如何验证 Server Push 是否生效?
什么是 Server Push
Server Push 是 HTTP/2 规范中引入的一种新技术,即服务端在没有被客户端明确的询问下,抢先地 “推送” 一些网站资源给客户端(浏览器),该特性可以极大的改善页面访问效果。
为了更方便的理解,下文将进行对比分析:

WEB 浏览器访问 WEB 服务端遵循着请求--响应模式。也即 WEB 浏览器请求一个资源,WEB 服务器响应一个资源。以常规的网页为例,当请求一个 /index.html 后,WEB 服务端响应一个 /index.html 页面给 WEB 浏览器,此时 WEB 浏览器会去解析该 /index.html 页面,发现还需要去加载 JS、CSS、图片等资源,此时客户端会依次去请求这些资源。这无形当中影响了首屏渲染的时间,不利于页面快速加载和渲染。

使用 Server Push 技术之后,当 WEB 浏览器请求 /index.html 之后,WEB 服务端会直接将需要推送的资源一并发给 WEB 浏览器,而不需要 WEB 浏览器依次进行请求,这减少了 WEB 浏览器进行请求所消耗的时间。
如何使用 Server Push
又拍云 CDN 支持 Server Push 特性可以通过如下两种方式来实现:
1.利用 HTTP Link 首部
该方式在 W3C Preload 工作草案中有详细描述。示例为:
Link: </static/css/style.css>; rel=preload; as=style;
其中,Link 首部中 as 是必选的,它告诉了浏览器推送的资源类型,例如 as=style 表明了推送的资源是一个样式表,除了样式表,您还可以推送其他的内容类型,详情参见支持的内容类型。
如果需要进行多资源推送,可以进行如下设置:
Link: </static/css/styles.css>; rel=preload; as=style, </js/scripts.js>; rel=preload; as=script, </img/logo.png>; rel=preload; as=image
2. CDN 控制台自定义 Server Push 配置
登陆 CDN 控制台,依次进入:服务管理 > 功能配置 > HTTPS > HTTP/2 ,点击【管理】按钮即可开始配置,例如:
匹配路径为:
/index.html
推送资源为:
/static/.css
/static/.js
在 CDN 控制台的配置如截图所示:

其中【匹配路径】为必填项,【推送资源】为非必填项。
以上两种方式,需要注意如下事项:
- 如果源站已经通过 Link 首部来实现服务推送,在 CDN 端的配置只需要配置【匹配路径】即可,无需配置【推送资源】选项;其中通过 Link 首部推送资源 CDN 已经默认开启。
- 如果在 CDN 端进行自定义 Server Push 推送资源配置,则优先级会高于源站设置的 Link 头部。
- 无论何种实现方式,总的(包括 Link 首部和 CDN 自定义的方式)推送资源数量不超过 8 个。
如何验证 Server Push 是否生效
1. 通过 Google Chrome 浏览器进行测试
在 CDN 控制台进行了如下配置:

通过 Google Chrome 开发者工具进行抓包查看,推送的资源都被 Push 了,如截图所示:

查看资源 /index.html 的资源响应头信息,并查看 x-upyun-h2-pushed 字段:
age:
cache-control: max-age=
content-encoding: br
content-type: text/html
date: Thu, Apr :: GMT
etag: W/"86ef9cae8d9f9e1205b25357e78a149b"
expires: Sat, Apr :: GMT
last-modified: Fri, Apr :: GMT
server: marco/2.1
set-cookie: UPYUNPUSH=---; Max-Age=
status:
vary: Accept-Encoding
via: T..M, V.-zj-fud-, S.mix-sd-dst-, T..M, V.mix-sd-dst-, T..H, M.cun-sd-lyi1-
x-content-type: text/html
x-request-id: 04dc2c7db2c509af1efc7d7252f0c2ce; 319efa6d981c0cb8dfb2b389368284f4
x-source: U/
x-upyun-h2-pushed: /image/meinv1.jpg; /image/meinv2.jpg; /image/meinv3.jpg; /image/meinv4.jpg
其中,x-upyun-h2-pushed 字段内容为:
x-upyun-h2-pushed: /image/meinv1.jpg; /image/meinv2.jpg; /image/meinv3.jpg; /image/meinv4.jpg
也可以说明所配置的推送资源被成功 Push 了。
2. 通过 nghttp 工具进行测试
测试命令为:
nghttp -ans https://server-push.upyun.club/index.html
测试结果如下:
id responseEnd requestStart process code size request path
+.01ms +69us .94ms /index.html
+.31s * +.96ms .25s 314K /image/meinv4.jpg
+.17s * +.95ms .11s 628K /image/meinv3.jpg
+.34s * +.94ms .28s 717K /image/meinv2.jpg
+.42s * +.91ms .36s 726K /image/meinv1.jpg
从测试结果中可以看出,被推推送的资源在 requestStart 栏左侧以星号标记了出来。
推荐阅读:
一文读懂 HTTP/2 特性
从应用层协议协商机制看,是否应该选择支持 HTTP/2 的 CDN
参考文档:
HTTP/2 Server Push Service | Cloudflare
A Comprehensive Guide To HTTP/2 Server Push
Introducing HTTP/2 Server Push with NGINX 1.13.9 | NGINX
让互联网更快,Server Push 特性及开启方式详解的更多相关文章
- 让互联网更快:新一代QUIC协议在腾讯的技术实践分享
本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...
- Quick UDP Internet Connections 让互联网更快的协议,QUIC在腾讯的实践及性能优化
https://mp.weixin.qq.com/s/44ysXnVBUq_nJByMyX9n5A 让互联网更快:通往QUIC之路 原创: 史天 翻译 云技术实践 8月15日 QUIC(Quick U ...
- [转帖]传输层安全协议TLS 1.3 RFC 8446使互联网更快、更安全
传输层安全协议TLS 1.3 RFC 8446使互联网更快.更安全 2018-08-12 11:38:19作者:LINUX人稿源:开源社区 https://ywnz.com/linuxyffq/261 ...
- SQL Server日期时间格式转换字符串详解
本文我们主要介绍了SQL Server日期时间格式转换字符串的相关知识,并给出了大量实例对其各个参数进行对比说明,希望能够对您有所帮助. 在SQL Server数据库中,SQL Server日期时间格 ...
- 【repost】H5的新特性及部分API详解
h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等 对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能够 ...
- SQL Server 2008 分区函数和分区表详解
[摘要]本文详细介绍SQL Server 2008 分区函数和分区表,包括查询某个分区.归档数据.添加分区.删除分区等内容. 当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门 ...
- SQL Server 2008 CDC增量变更捕获详解
1 背景: 随着公司业务的成长,数据量也随之的不断增长.随之而来的问题是在做ETL的时候,时间花费也越来越长.为了节省时间开销,我们只想要更新最新的数据,不想要把公司历年所有的数据都进行处理.这种情况 ...
- SQL Server 默认跟踪(Trace)捕获事件详解
SQL Server 默认跟踪 -- 捕获事件详解 哪些具体事件默认跟踪文件能够捕获到? --returns full list of events SELECT * FROM sys.trace_e ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
随机推荐
- 页面获取Web控件ID不能正常获取,它惹得祸
今天碰到个比较奇葩的问题,因为动了一下目标框架,又原来的4.5.1改为3.5,然后又改回来了4.5.1,结果运行项目的时候发现界面js的计算,不能正常获值计算. 于是就开始找问题呗,先是发现这个二手项 ...
- AQS源码阅读笔记(一)
AQS源码阅读笔记 先看下这个类张非常重要的一个静态内部类Node.如下: static final class Node { //表示当前节点以共享模式等待锁 static final Node S ...
- hdu1003 Max Sum---最大子段和+记录开始结束点
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目大意: 求最大子段和,并且输出最大子段和的起始位置和终止位置. 思路: 根据最大子段和基本 ...
- Canvas-自由绘制
#自由绘制 from tkinter import * master=Tk() c=Canvas(master,width=400,height=200) c.pack() def paint(eve ...
- jacascript DOM节点——节点内容
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! innerHTML 在读模式下,返回与调用元素的所有子节点(包括元素.注释和文本节点)对应的 HTML 标 ...
- Linux OpenGL 实践篇-2 创建一个窗口
OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们 ...
- [LeetCode] Erect the Fence 竖立栅栏
There are some trees, where each tree is represented by (x,y) coordinate in a two-dimensional garden ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger
原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...
- 教你从手机中提取system镜像制作线刷救砖包的简单方法
其实在制作刷机包的过程中,有时候没有官方或者第三方提供的救砖包(线刷),那怎么办?常规的方法有两种:(此处为常规方法,回读的方式暂不说明) 1.卡刷包转线刷包 2.dd命令导出分区镜像 ...
- [HNOI2012]永无乡
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...