HTTP 2

HTTP 成为标准后,一家独大了十多年。直至 Chrome 开发出自己的浏览器,推出新的 SPDY协议 并应用在自己的浏览器上。这倒逼 HTTP 以 SPDY 协议 为基础推出 HTTP 2 。

在性能改善上做出了很多努力:

  • 变成二进制协议。
  • 废弃 1.1 中的管道,引入了二进制分帧层,实现了多路复用,解决了队头堵塞问题

HTTP/2 使用了多路复用技术,可以将请求分成一帧一帧的数据去传输,这样带来了一个额外的好处,就是当收到一个优先级高的请求时,比如接收到 JavaScript 或者 CSS 关键资源的请求,服务器可以暂停之前的请求来优先处理关键资源的请求。

  • 使用头部压缩算法,减少数据传输量(开发了“HPACK”算法,在客户端和服务器建立“字典”,用索引号表示重复的字符串,还采用哈夫曼编码来压缩整数和字符串,可以达到 50%~90% 的⾼压缩率。 )
  • 设置请求的优先级
  • 增强了安全性(为了区分“加密”和“明文”这两个不同的版本,HTTP/2 协议定义了两个字符串标识符:“h2”表示加密的 HTTP/2,“h2c”表示明文的 HTTP/2,多出的那个字⺟“c”的意思是“clear text”)
  • 服务器推送  允许浏览器发送一个请求后,服务器主动向浏览器推送与这个请求相关的资源,这样浏览器就不用发起后续请求去获取一些资源。但是Chrome106版本禁用了,改为103状态码
    • 服务器推送时,客户端的特点:
      • 客户端可以缓存推送的资源
      • 客户端可以拒收推送过来的资源
      • 服务器可以按照优先级推送资源

如何升级成 HTTP 2

前置条件

  • web server 和浏览器是否支持 HTTP/2 或 HTTP/3
  • 因为 HTTP/2 和 HTTP/3 建立在 TLS上,所以需要升级成HTTPS
  • 确保 HTTP/1.1 的兼容性。即使启用了 HTTP/2 或 HTTP/3,也需要保证老的客户端仍能通过 HTTP/1.1 访问网站。
  1. 对服务器进行配置,启用 HTTP/2 或 HTTP/3 支持。对于 nginx 来说,需要启用 ngx_http_v2_module 模块。Apache 需要启用 mod_http2 模块。

nginx 启用

  1. 确保nginx版本在 1.9.5 或以上,低于这个版本需要重新编译来启用 HTTP/2 支持。
  2. 获取 SSL 证书并开启 HTTPS 服务。可以使用免费证书或付费证书,并在 nginx 配置文件中正确配置。
  3. 在 nginx 配置文件中添加对 http2 的支持:
## nginx.config
##  在nginx配置文件中添加对http2的支持:
listen 443 ssl http2;
 
http2_max_field_size 4k;
http2_max_header_size 16k;
http2_max_requests 100;
 
## 支持服务端推送
http2_push /style.css;
http2_push /js/main.js;

再重启 nginx 即可、 nginx -s reload