在 Nginx 中,可通过开启gzip压缩,来显著减少传输数据的大小(能减少一半甚至更多),提升加载速度,节省服务器宽带。

配置示例

在 Nginx 配置文件http块中添加:

http {
    gzip on;  # 启用 gzip 压缩
    gzip_min_length 1k; # 大于1KB的文件才压缩
    gzip_buffers 4 16k; # 缓冲区大小
    gzip_comp_level 4; # 压缩级别
    gzip_types text/plain text/css text/javascript text/html; # 指定要压缩的文件类型
    gzip_vary on; # 添加 Vary: Accept-Encoding 响应头
}

需重启 Nginx 才能生效;

验证压缩是否生效

查看响应头中是否有Content-Encoding: gzip;使用curl命令示例:

curl -H "Accept-Encoding: gzip" -I http://hostname
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Thu, 08 Jan 2026 10:31:53 GMT
Content-Type: text/html; charset=utf-8
Last-Modified: Thu, 18 Dec 2025 07:53:29 GMT
Connection: keep-alive
ETag: W/"6943b2f9-655"
Content-Encoding: gzip

配置指令

可在httpserverlocation块中使用;

推荐在http块中设置全局默认值,在server块按站点调整,在location块做精细优化;

启用或禁用gzip

语法:  gzip on | off;
默认:  gzip off;

启用或禁用响应数据的gzip压缩;

设置缓冲区大小gzip_buffers

语法:  gzip_buffers number size;
默认:  gzip_buffers 32 4k|16 8k;
  • number:表示缓冲区的数量,最小值为1
  • size:表示缓冲区的大小,单位为k(KB)或m(MB),通常设置为与内存页大小对齐; 默认情况下,缓冲区大小等于一个内存页,根据平台有所不同;

内存使用计算:

gzip_buffers 32 4k;

# 每个连接: 32 × 4KB = 128KB
# 100个并发: 100 × 128KB = 12.8MB

设置压缩级别gzip_comp_level

语法:  gzip_comp_level level;
默认:  gzip_comp_level 1;
  • level:压缩级别,范围为19;值越大压缩效果越好,相应的 CPU 开销也越大;

从级别6开始,提升压缩级别会显著增加 CPU 消耗,但压缩率的提升越来越小;推荐在生产环境使用34

对匹配的 User-Agent 禁用压缩gzip_disable

语法:  gzip_disable regex ...;
默认:  未设置

regex是一个正则表达式,对匹配regex的 User-Agent 客户端禁用 gzip 压缩;例如:

# 以下情形 gzip 压缩将被禁用
gzip_disable "MSIE [1-6]\.";  # IE6及更早版本
gzip_disable "Mobile";        # 包含"Mobile"的UA
gzip_disable "Android 2\.";   # Android 2.x
gzip_disable "curl";          # 禁用curl请求

设置最低的 HTTP 协议版本gzip_http_version

语法:  gzip_http_version 1.0 | 1.1;
默认:  gzip_http_version 1.1;

设置启用 gzip 压缩的最低 HTTP 协议版本;

设置最小文件大小gzip_min_length

语法:  gzip_min_length length;
默认:  gzip_min_length 20;

设置启用 gzip 压缩的最小文件大小;示例:

http {
    gzip on;
    
    # 1KB以下的文件不压缩
    gzip_min_length 1k;
}

设置代理请求是否进行压缩gzip_proxied

语法:  gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
默认:  gzip_proxied off;

控制对代理请求的响应是否进行 gzip 压缩;

请求是否为代理由请求头中是否存在Via字段决定;

参数 说明
off 禁用所有代理请求的压缩
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 启用所有代理请求的压缩

指定 MIME 类型gzip_types

语法:  gzip_types mime-type ...;
默认:  gzip_types text/html;

应避免已经是压缩格式的内容;

指定哪些 MIME 类型的响应应该进行 gzip 压缩,默认情况下只压缩 HTML;示例:

http {
    gzip on;
    
    # 压缩常见文本类型
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

gzip_vary指令

语法:  gzip_vary on | off;
默认:  gzip_vary off;

在响应头中添加Vary: Accept-Encoding