HTTP/2 是 HTTP 协议中最新版本,它对网站及用户具有许多优势。2021 年已经到来,呼吁所有网站都检查一下 WEB 环境,强烈建议开启 HTTP/2。自成立以来,万维网(WWW)一直基于两种技术:超文本标记语言 HTML 和超文本传输协议 HTTP。与 HTML 相比,HTTP 的创新一直是很谨慎的,因为网站基本上都是需要 24 小时不间断提供访问服务的,如果出现任何意外情况,代价都是巨大的。所以对于 HTTP 技术来说,广泛的兼容性、稳定性一直是重中之重。
HTTP/2 于于 2015 年 2 月 17 日被 IESG(互联网工程指导小组)正式批准,多数主流浏览器已经在 2015 年底支持了该协议。到了如今,所有的浏览器均支持 HTTP/2(已经被淘汰的浏览器除外)。但还有很多网站任然采用 HTTP 1.1 这一过时的传输协议。
HTTP/2 与 HTTP/1.1 比较
- HTTP/2 相比 HTTP/1.1 的修改并不会破坏现有程序的工作,但是新的程序可以借由新特性得到更好的速度。
- HTTP/2 保留了 HTTP/1.1 的大部分语义,例如请求方法、状态码乃至 URI 和绝大多数 HTTP 头部字段一致。而 HTTP/2 采用了新的方法来编码、传输 客户端<——>服务器 间的数据。
在Nginx中启用 HTTP/2
要在 Nginx 中启用 HTTP/2,需要满足以下要求:
- Nginx版本 1.9.5 或更高版本。可以通过运行(nginx -v)命令来检查 Nginx 版本 。
- OpenSSL版本 1.0.2 或更高版本。可以通过运行(OpenSSL version)命令来检查 OpenSSL 版本。
- Let’s Encrypt的 SSL/TLS 证书或其它 SSL/TLS 证书。
- 启用 TLS 1.2 或更高版本的协议。否则,将无法使用 HTTP/2。HTTP/2 的实现必须对 TLS 上的 HTTP/2 使用 TLS 版本 1.2 或更高版本。
将 http2
参数添加到虚拟主机中的 listen 指令中:
listen 443 ssl http2;
最后重启 Nginx
一个最简单的示例:
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; root /path/to/public; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; ssl_protocols TLSv1.2; }
检验 HTTP/2 是否启用
在 Chrome 浏览器中(Microsoft Edge 或 Firefox 浏览器均可),使用 F12 进入到调试模式,访问相关页面,查看 Protocol 是否为 h2。下面以铭创网络(https://www.yephy.com 首页)为例:
HTTP/2 简介
HTTP/2(超文本传输协议第 2 版,最初命名为 HTTP 2.0),简称为 h2(基于 TLS/1.2 或以上版本的加密连接)或 h2c(非加密连接),是 HTTP 协议的的第二个主要版本,使用于万维网。
HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 的改进版 RFC 2616 发布后的首个更新,主要基于 SPDY 协议。它由互联网工程任务组(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。该组织于 2014 年 12 月将 HTTP/2 标准提议递交至IESG进行讨论,于 2015 年 2 月 17 日被批准。
HTTP/2 标准于 2015 年 5 月以 RFC 7540 正式发表。HTTP/2 的标准化工作由 Chrome、Opera、Firefox、Internet Explorer 11、Safari、Amazon Silk 及 Edge 等浏览器提供支持。
根据 W3Techs 的数据,截至 2019 年 6 月,全球有 36.5%的网站支持了 HTTP/2。
HTTP/2 的新特性
在 HTTP/2 的第一版草案(对 SPDY 协议的复刻)中,新增的性能改进不仅包括 HTTP/1.1 中已有的多路复用,修复队头阻塞问题,允许设置设定请求优先级,还包含了一个头部压缩算法(HPACK)。此外, HTTP/2 采用了二进制而非明文来打包、传输 客户端<——>服务器 间的数据。
有别于 HTTP/1.1 在连接中的明文请求,HTTP/2 与 SPDY 一样,将一个 TCP 连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。这也是 HTTP/1.1 与 HTTP/2 最大的区别所在。 HTTP/2 中,每个用户的操作行为被分配了一个流编号(stream ID),这意味着用户与服务端之间创建了一个 TCP 通道;协议将每个请求分割为二进制的控制帧与数据帧部分,以便解析。这个举措在 SPDY 中的实践表明,相比 HTTP/1.1,新页面加载可以加快 11.81% 到 47.7%。
网站为了使请求数减少,通常采用对页面上的图片、脚本进行极简化处理。但是,这一举措十分不方便,也不高效,依然需要诸多 HTTP 链接来加载页面和页面资源。
HTTP/2 引入了服务器推送,即服务端向客户端发送比客户端请求更多的数据。这允许服务器直接提供浏览器渲染页面所需资源,而无须浏览器在收到、解析页面后再提起一轮请求,节约了加载时间。