介绍
Nginx的gzip压缩功能可以显著提升网站的速度,主要原理是通过默认集成的 ngx_http_gzip_module 模块拦截请求,并在服务器端对传输的内容(如CSS、JS、XML、HTML等静态资源)进行gzip压缩。当用户请求这些资源时,Nginx服务器会发送压缩后的数据,浏览器在接收到数据后进行解压并解析,从而减小了传输文件的大小,减少了传输时间,提高了网站的响应速度。
需要注意的是,gzip压缩响应内容可以减少传输的数据量,由于压缩和解压缩都需要计算资源,会增加服务器的CPU使用率。因此需要在权衡传输速度和服务器负载之间做出选择。
指令配置
官方说明
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
- gzip
- 描述:开启或关闭gzip压缩功能。
# 语法
gzip on | off;
# 示例
gzip off;
- gzip_buffers
- 描述:设置 gzip 缓存空间大小。其中 number 指定Nginx服务器需要向系统申请缓存空间的个数,size 指定每个缓存空间的大小。默认为 number*size=128。
# 语法
gzip_buffers [number] [size];
# 示例
gzip_buffers 32 4k | 16 8k;
- gzip_comp_level
- 描述:设置gzip压缩程度。级别为1到9,1表示压缩程度最低,效率最高;9表示压缩程度最高,效率最低。
# 语法
gzip_comp_level [level];
# 示例
gzip_comp_level 1;
- gzip_disable
- 描述:可以通过正则匹配UA来禁止某些浏览器或者某些特定请求不进行gzip压缩。
# 语法
gzip_disable [regex] ...;
- gzip_http_version
- 描述:设置识别HTTP协议版本,目前大部分浏览器已经支持GZIP解压。
# 语法
gzip_http_version 1.0 | 1.1;
# 示例
gzip_http_version 1.1;
- gzip_min_length
- 描述:设置启用gzip压缩的最小响应长度(以字节为单位)。当响应长度小于这个值时,不会对其进行gzip压缩。
# 语法
gzip_min_length [length];
# 示例
gzip_min_length 20;
- gzip_proxied
- 描述:设置是否对从代理服务器接收到的响应进行gzip压缩。可以取一个或多个参数值(以空格分隔),以匹配HTTP响应头中的字段或特定条件,支持的参数值及其含义:
- off:不对任何代理请求进行 Gzip 压缩。
- expired:如果响应头中包含 "Expires" 字段,并且其值表明响应已经过期,则进行压缩。
- no-cache:如果响应头中包含 "Cache-Control: no-cache" 字段,则进行压缩。
- no-store:如果响应头中包含 "Cache-Control: no-store" 字段,则进行压缩。
- private:如果响应头中包含 "Cache-Control: private" 字段,则进行压缩。
- no_last_modified:如果响应头中没有 "Last-Modified" 字段,则进行压缩。
- no_etag:如果响应头中没有 "ETag" 字段,则进行压缩。
- auth:如果响应头中包含 "Authorization" 字段,则进行压缩。这通常用于需要身份验证的响应。
- any:对任何代理请求都进行 Gzip 压缩。
- 描述:设置是否对从代理服务器接收到的响应进行gzip压缩。可以取一个或多个参数值(以空格分隔),以匹配HTTP响应头中的字段或特定条件,支持的参数值及其含义:
# 语法
gzip_proxied off | expired | no-cache | no-store | private | no-last-modified | no_etag | auth | any ...;
# 示例
gzip_proxied off;
- gzip_types
- 描述:指定需要压缩的MIME类型,前提是gzip处于启用状态。常见支持的MIME类型:
- text/html:HTML 文档
- text/css:CSS 样式表
- text/plain:纯文本文件
- text/xml:XML 文档
- application/javascript:JavaScript 文件
- application/x-javascript:早期使用的 JavaScript MIME 类型
- application/json:JSON 数据
- application/rss+xml:RSS 订阅源
- application/atom+xml:Atom 订阅源
- application/xml:通用的 XML 文件
- application/xhtml+xml:XHTML 文档
- text/javascript:JavaScript 文件的另一种 MIME 类型
- font/woff:WOFF 字体文件
- font/woff2:WOFF2 字体文件
- image/svg+xml:SVG 图像文件(尽管 SVG 本身可能已压缩,但 gzip 可以进一步减少文件大小)
- 描述:指定需要压缩的MIME类型,前提是gzip处于启用状态。常见支持的MIME类型:
# 语法
gzip_types [mime-type] ...;
# 示例
gzip_types text/html;
- gzip_vary
- 描述:开启或关闭前端缓存服务器缓存经过gzip压缩的页面,例如用Squid缓存经过Nginx压缩的数据。
# 语法
gzip_vary on | off;
# 示例
gzip_vary off;
配置
http {
# 启用gzip压缩
gzip on;
# 设置缓存区数量和大小:32个4k
gzip_buffers 32 4k;
# 设置压缩级别为6
gzip_comp_level 6;
# 指定HTTP/1.1版本
gzip_http_version 1.1;
# 指定对纯文本文件、CSS样式表和JSON数据类型的响应进行压缩
gzip_types text/plain text/css application/json;
# 启用vary:Accept-Enconding响应头
gzip_vary on;
...
}
补充gzip_static
官方说明:
http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html
在 Nginx 中,ngx_http_gzip_static_module 是一个可选的模块,用于服务预先压缩的静态文件(如 .gz 结尾的文件)。当客户端请求一个文件时,如果服务器上有该文件的 gzip 压缩版本(即 .gz 结尾的文件),Nginx 会优先发送这个压缩版本,而不是实时压缩原始文件并发送。
这个模块的主要优点是提高了性能,因为实时压缩可能会消耗大量的 CPU 资源,而预先压缩的文件可以直接从磁盘读取并发送给客户端,无需额外的 CPU 开销。
要使用 ngx_http_gzip_static_module,需要确保在编译 Nginx 时包含了该模块。这通常可以通过在配置编译参数时添加 --with-http_gzip_static_module 来实现。
一旦模块被包含并启用,可以在 Nginx 配置中使用相关的指令来配置它。然而,ngx_http_gzip_static_module 本身并没有提供专门的配置指令,它更多地是一个底层的机制,用于支持静态 gzip 文件的直接服务。
通常,需要配置 Nginx 以检查原始文件和相应的 gzip 文件都存在,并优先发送 gzip 文件。可以通过在 location 块中使用 try_files 指令来实现,如下所示:
- gzip相关配置参数可以在 http、server、location 上下文中使用
- 编写Nginx的配置文件(nginx.conf):
location / {
try_files $uri $uri.gz;
gzip_static on;
...
}
在上面的配置中,try_files 指令会首先尝试服务 $uri(即请求的原始文件),如果找不到,则尝试服务 $uri.gz(即 gzip 压缩的文件)。gzip_static on; 指令告诉 Nginx 如果找到了 gzip 文件,就使用它,而不是尝试实时压缩原始文件。