切身体会http/2相对于http/1.1的提升
# 遇到的问题
之前一直在苦恼自己博客首次加载速度巨慢的问题,三十多秒才把博客文章列表加载出来,又不想动源码,所以就在nginx寻找可优化的点。
# 解决过程
一开始尝试了gzip,略有提升,但是效果不大,通过浏览器的devTool发现,个别文件要加载很久,也就是三十多秒,因为http/1.1是单线程串行请求,所以这些请求就阻塞了后面的请求,导致了后面请求一直在等待(?线头阻塞)。
然后今早起床,看了一下http/11和http/2的区别,然后就发现了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文档的头部判断客户端将要使用的资源,然后由服务端主动推送,从而减少了客户端请求的这一步骤。