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 访问网站。
- 对服务器进行配置,启用 HTTP/2 或 HTTP/3 支持。对于 nginx 来说,需要启用 ngx_http_v2_module 模块。Apache 需要启用 mod_http2 模块。
nginx 启用
- 确保nginx版本在 1.9.5 或以上,低于这个版本需要重新编译来启用 HTTP/2 支持。
- 获取 SSL 证书并开启 HTTPS 服务。可以使用免费证书或付费证书,并在 nginx 配置文件中正确配置。
- 在 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