Compression
压缩是提高网站性能的重要方法。对于某些文档,最多可减少70%的尺寸可降低带宽容量需求。多年来,算法也变得更加高效,并且新的算法得到了客户端和服务器的支持。
在实践中,Web开发人员不需要实现压缩机制,浏览器和服务器都已经实现了压缩机制,但他们必须确保服务器配置充分。压缩发生在三个不同的级别:
- 首先一些文件格式是用特定的优化方法压缩的,
- 那么通用加密可以在HTTP级别发生(资源从头到尾被压缩传输),
- 最后可以在HTTP连接的两个节点之间的连接级别定义压缩。
文件格式压缩
每种数据类型都有一些冗余,那就是浪费的空间。如果文本通常具有高达60%的冗余度,那么对于音频和视频等其他媒体,此速率可能会更高。与文本不同,这些其他媒体类型正在占用大量空间来存储,并且需要重新获得这种浪费的空间显得非常早。工程师设计了针对特定用途设计的文件格式所使用的优化压缩算法。用于文件的压缩算法可以分为两大类:
- 无损压缩,其中压缩 - 解压缩循环不会改变恢复的数据。它匹配(字节到字节)与原始。对于图像
gif
或png
使用无损压缩。
- 有损压缩是循环改变原始数据的地方,对用户来说是不可感知的。
Web上的视频格式是有损和面向图像的,如jpeg
。
有些格式可以用于无损压缩或有损压缩,如webp
通常有损算法可以配置为压缩或多或少,这当然会导致更少或更多的质量。为了获得更好的网站性能,在保持可接受的质量水平的同时尽可能进行压缩是理想的选择。对于图像来说,由工具生成的图像可能无法针对Web进行优化; 建议使用能够以所需质量尽可能压缩的工具。有很多专门为此设计的工具。
有损压缩算法通常比无损压缩算法更高效。
由于压缩对特定类型的文件效果更好,通常不会再次压缩它们。事实上,由于开销的成本(算法通常需要一个增加初始大小的字典)可能会高于额外的压缩增益,导致文件较大,因此这往往是反效果的。不要将以下两种技术用于压缩格式的文件。
端到端压缩
对于压缩,端到端压缩是网站最大的性能改进所在。端到端压缩指的是压缩由服务器完成的消息主体,并在到达客户端之前保持不变。无论中间节点是什么,它们都不会影响身体。
所有现代浏览器和服务器都支持它,唯一需要协商的是要使用的压缩算法。这些算法针对文本进行了优化。在20世纪90年代,压缩技术正在快速发展,许多连续的算法已被添加到可能的选择集中。目前,只有两个是相关的:gzip
最常见的和br
新的挑战者。
要选择要使用的算法,浏览器和服务器使用主动内容协商。浏览Accept-Encoding
器用它支持的算法和它的优先顺序发送一个标题,服务器选择一个,用它压缩响应的主体,并使用Content-Encoding
标题告诉浏览器它选择的算法。由于内容协商已经被用来根据编码来选择一个表示,所以在响应Vary
中至少包含一个包含Content-Encoding
这个标题的报头; 这样,缓存将能够缓存资源的不同表示。
由于压缩带来显着的性能改进,建议将其激活为所有文件,但已经压缩的文件如图像,音频文件和视频。
Apache支持压缩并使用mod_deflate ; 对于nginx有ngx_http_gzip_module ; 对于IIS,<httpCompression>
元素。
逐跳压缩
逐跳压缩尽管与端到端压缩类似,但其差异在于一个基本要素:压缩不会发生在服务器的资源中,从而创建一个特定的表示,然后传输,但是在客户端和服务器之间的路径上的任何两个节点之间的消息。连续的中间节点之间的连接可以应用不同的压缩。
为此,HTTP使用类似于内容协商的机制进行端对端压缩:发送请求的节点使用TE
标头通知它的意愿,而另一节点选择适当的方法,应用它并指示它的选择Transfer-Encoding
头。
实际上,逐跳压缩对于服务器和客户端是透明的,并且很少使用。TE
并且Transfer-Encoding
主要用于通过块发送响应,从而允许在不知道其长度的情况下开始传输资源。
请注意,Transfer-Encoding
在跳跃层使用和压缩非常罕见,大多数服务器(如Apache,nginx或IIS)都没有简单的方法来配置它。这种配置通常发生在代理级别。