过去 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 特性:

  1. 什么是 Server Push ?
  2. 如何使用 Server Push ?
  3. 如何验证 Server Push 是否生效?

什么是 Server Push

Server Push 是 HTTP/2 规范中引入的一种新技术,即服务端在没有被客户端明确的询问下,抢先地 “推送” 一些网站资源给客户端(浏览器),该特性可以极大的改善页面访问效果。

为了更方便的理解,下文将进行对比分析:

 
△ 未开启 HTTP/2 Server Push (图片来源:www.smashingmagazine.com)

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

 
△ 开启 HTTP/2 Server Push (图片来源:www.smashingmagazine.com)

使用 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 特性及开启方式详解的更多相关文章

  1. 让互联网更快:新一代QUIC协议在腾讯的技术实践分享

    本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...

  2. Quick UDP Internet Connections 让互联网更快的协议,QUIC在腾讯的实践及性能优化

    https://mp.weixin.qq.com/s/44ysXnVBUq_nJByMyX9n5A 让互联网更快:通往QUIC之路 原创: 史天 翻译 云技术实践 8月15日 QUIC(Quick U ...

  3. [转帖]传输层安全协议TLS 1.3 RFC 8446使互联网更快、更安全

    传输层安全协议TLS 1.3 RFC 8446使互联网更快.更安全 2018-08-12 11:38:19作者:LINUX人稿源:开源社区 https://ywnz.com/linuxyffq/261 ...

  4. SQL Server日期时间格式转换字符串详解

    本文我们主要介绍了SQL Server日期时间格式转换字符串的相关知识,并给出了大量实例对其各个参数进行对比说明,希望能够对您有所帮助. 在SQL Server数据库中,SQL Server日期时间格 ...

  5. 【repost】H5的新特性及部分API详解

    h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等 对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能够 ...

  6. SQL Server 2008 分区函数和分区表详解

    [摘要]本文详细介绍SQL Server 2008 分区函数和分区表,包括查询某个分区.归档数据.添加分区.删除分区等内容. 当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门 ...

  7. SQL Server 2008 CDC增量变更捕获详解

    1 背景: 随着公司业务的成长,数据量也随之的不断增长.随之而来的问题是在做ETL的时候,时间花费也越来越长.为了节省时间开销,我们只想要更新最新的数据,不想要把公司历年所有的数据都进行处理.这种情况 ...

  8. SQL Server 默认跟踪(Trace)捕获事件详解

    SQL Server 默认跟踪 -- 捕获事件详解 哪些具体事件默认跟踪文件能够捕获到? --returns full list of events SELECT * FROM sys.trace_e ...

  9. Microsoft SQL Server中的事务与并发详解

    本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...

随机推荐

  1. zipline-benchmarks.py文件改写

    改写原因:在这个模块中的 get_benchmark_returns() 方法回去谷歌财经下载对应SPY(类似于上证指数)的数据,但是Google上下载的数据在最后写入Io操作的时候会报一个恶心的编码 ...

  2. uva 11636 Hello World!

    https://vjudge.net/problem/UVA-11636 题意: 希望输出n条语句,但是并不会循环,所以只能复制粘贴,一条语句经过复制粘贴后可以变为2条,2条变成4条....每次可以只 ...

  3. tr069开源代码——cwmp移植

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...

  4. evel()与JSON.parset()的区别

    var x=alert("hello")evel("x");eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码:消耗大量内存,尤其是 ...

  5. 使用生成器把Kafka写入速度提高1000倍

    title: 使用生成器把Kafka写入速度提高1000倍 toc: true comment: true date: 2018-04-13 21:35:09 tags: ['Python', '经验 ...

  6. 将一个javaWeb应用跑在Docker里

    安装docker,本实例使用的是CentOS 7,其他系统的安装请自行百度. 安装:yum -y install docker 启动:service docker start docker的一些基本命 ...

  7. 【Python3.6+Django2.0+Xadmin2.0系列教程一】环境搭建及项目创建

    由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 环境需求: ...

  8. CentOS在线安装Mysql5.7

    一.通过Yum命令安装 1.下载rpm安装源 官方地址:https://dev.mysql.com/downloads/repo/yum/ rpm文件地址:https://dev.mysql.com/ ...

  9. 【MySQL】通过Binary Log简单实现数据回滚(一)

    一.前言 对,没错,我又水了好一阵子,深刻反思寄几.前段时间,工作项目上出于对excel等批量操作可能出现误操作的问题,要求提供一个能够根据操作批次进行数据回滚的能力.在开发的过程中接触到了MySQL ...

  10. js保留整数

    1.丢弃小数部分,保留整数部分parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Math.round(5/2) 4,向下取整 Math.fl ...