遇到的问题

之前一直在苦恼自己博客首次加载速度巨慢的问题,三十多秒才把博客文章列表加载出来,又不想动源码,所以就在 nginx 寻找可优化的点。

解决过程

一开始尝试了 gzip,略有提升,但是效果不大,通过浏览器的 devTool 发现,个别文件要加载很久,也就是三十多秒,因为 http/1.1 是单线程串行请求,所以这些请求就阻塞了后面的请求,导致了后面请求一直在等待(?线头阻塞)。

request

然后今早起床,看了一下 http/11 和 http/2 的区别,然后就发现了 http/2 的新特性–多路复用。

多个请求可以同时在一个连接上并行进行,请求不会出现阻塞的情况,也就是说,某个请求耗时严重,但是并不会影响到其它请求。

看到这个,完全符合我的需求,兴致勃勃地去 nginx 配置 http2,只需修改一行即可,在 listen 443 ssl 后面添加 http2 default_server

listen 443 ssl http2 default_server;

配置完成只会,重载配置 =============> 从发起请求到博客文章列表显示约 7s。

相对于之前来说已经有很大的提升了,至于怎么继续提高加载速度只能从其它方面寻找方法了。

总结

最后对 http/2 的新特性做一个简单的总结,总的来说,http/2 主要在低延迟方面进行优化。

http/2 使用 encoder 来减小 header 的大小,另外双方各自缓存一份 header fields 表,避免 header 重复发送。

将所有的传输信息分割成更小的消息和帧并采用二进制编码。

同一个 tcp 连接上允许多个 http 请求同时进行,避免了 http/1.1 中出现的线头阻塞问题。

这块还不是特别了解,只知道服务端可以主动向客户端推送资源,并且具有缓存机制,通过 html 文档的头部判断客户端将要使用的资源,然后由服务端主动推送,从而减少了客户端请求的这一步骤。