如何建设高性能网站--http篇/压缩组件

http是浏览器和服务器通过Internet进行相互通信的协议,所以想改善前端的性能问题是有必要理解部分HTTP对性能的影响。HTTP是一种客户端/服务器协议,由请求和响应构成。浏览器向一个特定的URL发送HTTP请求,URL对应的宿主服务器发回HTTP响应。请求的类型有GET,POST,HEAD,PUT,DELETE,OPTIONS和TRACE。
当然在我们开发过程当中,最常遇到的就是GET,POST。
HTTP响应包含状态码、头和响应体。
在这里插入图片描述
如图是请求头:
在这里插入图片描述
如图是响应头:
在这里插入图片描述
压缩:如果浏览器和服务器都支持的话,可以使用压缩来减小响应的大小。浏览器可以使用Accept-Encodeing头来声明它支持压缩。服务器使用Content-Encoding头来确定响应已被压缩。压缩其就是通过减少HTTP响应的大小来减少响应的时间;响应包很小,那么传输的时间就会减少。
那么压缩是如何工作的?值得思考。

Accept-Encoding: gzip, deflate,		//请求头设置
Content-Encoding: gzip, 			//响应头设置

gzip是目前最流行也是最有效的压缩方式。那么具体要压缩什么呢?值得思考。
浏览器基于文件的类型进行压缩,但这通常受限于对其进行的配置。
1、压缩HTML文档
2、压缩XML和JSON在内的任何文本响应,比如样式表,脚本。
3、图片和PDF不应该压缩。
当然压缩的成本在于服务器会花费额外的CPU周期来完成压缩,客户端要对压缩文件进行解压缩。要考虑很多方面的因素,来判断压缩是否对网站有利。通常情况下,对于大于1KB或2KB的文件进行压缩。
指令mod_gzip_minimum_file_size控制着希望压缩文件的最小值。
那么既然压缩能减小响应包的大小来改善网站的性能,那么如何配置gzip呢?值得思考。
配置gzip时使用的模块取决于Apache的版本。
Apache1.3——mod_gzip
Apache2.x——mod_deflate
现在我们来思考一个问题:
当我们把上述的配置都完成之后,出现这样的一个情况:第一次请求不支持gzip的浏览器向服务器发送了一个请求,那么响应体被缓存了。第二次请求支持gzip的浏览器向服务器发送了一个同样的请求,因上次的响应被缓存了,所以服务器告诉浏览器,该请求已被缓存过,直接拿就ok了。这就造成了一个问题,那我设置的压缩并没有机会实现了。再者如果把请求的第一次和第二次顺序反过来,那么问题就会更严重了。----代理缓存的过程。
上述的情况其实也有解决方式,如何解决呢?
是在web服务器的响应头中添加Vary头。

Vary:Accept-Encodeing

web服务器可以告诉代理根据一个或者多个请求头来改变缓存的响应。这使得代理缓存有多个版本,根据不同的浏览器来拿取数据。
那么谈到浏览器问题,就得考虑到浏览器兼容的问题。有些浏览器并未支持压缩,比如糟糕的ie6之前的版本和Mozilla5.0之前的版本,她们都不支持浏览器压缩。
使用压缩的方式,可能会失去为一部分本来支持压缩的浏览器提供压缩内容的机会,但那些不支持浏览器压缩更为糟糕。如何解决呢?值得思考。
那么首先你要告诉服务器哪些浏览器可压缩,所以要配置服务器。
Apache1.3:

mod_gzip_item_include reqheader "User-Agent:MSIE[6-9]"
mod_gzip_item_include reqheader "User-Agent:Mozilla[5-9]"

Apache2.x——mod_deflate

BrowserMatch ^MSIE [6-9] gzip
BrowserMatch ^Mozilla/[5-9] gzip

1、如果你的网站用户很少,并且处于一个小圈子中,比如都使用ie10。那么就不需要考虑浏览器兼容,大胆使用压缩方案,并且设置Vary:Accept-Encodeing。这样可以通过减小组件的大小和利用代理缓存来改善用户体验。
2、如果你更注重带宽开销,那么你也使用压缩并使用Vary:Accept-Encodeing。
3、如果你的网站拥有大量的群体,并且是多变的群体,能够应付较高的带宽开销,并且有高质量,那么请压缩并使用Cache-Control:Private。

https://www.jianshu.com/p/918c63045bc3/
https://blog.csdn.net/weixin_38169886/article/details/100090851

猜你喜欢

转载自blog.csdn.net/Miss_hhl/article/details/103757911