什么是 Gzip?
Gzip 是一种广泛使用的文件压缩程序,它采用 DEFLATE 算法来压缩文件,对于网站来说,Gzip 主要用于压缩服务器发送给浏览器的文本内容(如 HTML, CSS, JavaScript 文件)。

工作原理:
- 当用户访问你的网站时,浏览器会通过 HTTP 请求头
Accept-Encoding: gzip, deflate告诉服务器:“我支持 Gzip 或 Deflate 压缩格式”。 - 如果你的服务器配置了 Gzip 压缩,并且启用了该功能,服务器会在发送文件之前,先将其压缩成 Gzip 格式。
- 服务器在响应头中添加
Content-Encoding: gzip,告诉浏览器:“我发送给你的是压缩过的数据”。 - 浏览器接收到数据后,会自动解压,然后正常显示网页。
好处:
- 减少传输数据量: 文件体积可以减少 60% 到 90%,极大地缩短了文件的下载时间。
- 提升加载速度: 页面加载速度越快,用户体验越好,对 SEO(搜索引擎优化)也越有利。
- 节省带宽: 服务器和用户之间的网络流量大幅减少,为你节省带宽成本。
如何在 Linux 上为网站启用 Gzip?
启用 Gzip 的方法取决于你使用的 Web 服务器,下面将分别介绍最常用的 Nginx 和 Apache 的配置方法。
Nginx 配置
Nginx 的 Gzip 功能由 ngx_http_gzip_module 模块提供,该模块在 Nginx 默认安装中通常是启用的。

编辑 Nginx 配置文件
主配置文件位于 /etc/nginx/nginx.conf,但网站的具体配置可能在 /etc/nginx/sites-available/ 目录下的某个文件中(default 或你的域名配置文件),我们建议在 http、server 或 location 块中添加或修改以下配置。
# 在 http 块中配置,使其对所有网站生效
# 或者放在特定的 server 块中,使其只对某个网站生效
gzip on; # 启用 gzip 压缩
# 压缩级别,1-9,9 压缩率最高但最耗 CPU,推荐 6
gzip_comp_level 6;
# 压缩缓冲区大小
gzip_buffers 16 8k;
# 针对 MIME 类型进行压缩,text/html 默认已经包含
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# 对于 IE6 及以下版本,不开启 gzip
gzip_disable "MSIE [1-6]\.";
# 是否在响应头中添加 Vary: Accept-Encoding,建议开启
gzip_vary on;
检查并重启 Nginx
保存配置文件后,检查配置是否正确,然后重启 Nginx 使配置生效。

# 检查 Nginx 配置语法 sudo nginx -t # 如果输出如下,说明配置正确: # nginx: the configuration file /etc/nginx/nginx.conf syntax is ok # nginx: configuration file /etc/nginx/nginx.conf test is successful # 重启 Nginx sudo systemctl restart nginx
Apache 配置
Apache 有两种主要的模块可以实现 Gzip 压缩:mod_deflate 和 mod_gzip。mod_deflate 是目前更现代、更推荐的模块。
确保 mod_deflate 模块已启用
# 对于 Debian/Ubuntu 系统 sudo a2enmod deflate # 对于 CentOS/RHEL 系统 sudo dnf install mod_deflate # 或 sudo yum install mod_deflate
编辑 Apache 配置文件
你可以在主配置文件 /etc/apache2/apache.conf (Debian/Ubuntu) 或 /etc/httpd/conf/httpd.conf (CentOS/RHEL) 中添加配置,或者在 /etc/apache2/mods-enabled/deflate.conf (Debian/Ubuntu) 中创建或编辑配置文件。
# 在 <IfModule mod_deflate.c> ... </IfModule> 标签内添加或修改以下内容
<IfModule mod_deflate.c>
# 启用压缩
SetOutputFilter DEFLATE
# 压缩级别,1-9,9 压缩率最高但最耗 CPU
DeflateCompressionLevel 6
# 压缩特定的 MIME 类型
<IfModule mod_mime.c>
# AddOutputFilterByType DEFLATE application/json
# AddOutputFilterByType DEFLATE application/javascript
# AddOutputFilterByType DEFLATE application/xml+rss
# AddOutputFilterByType DEFLATE image/svg+xml
# AddOutputFilterByType DEFLATE text/plain
# AddOutputFilterByType DEFLATE text/css
# AddOutputFilterByType DEFLATE text/html
# AddOutputFilterByType DEFLATE text/xml
# AddOutputFilterByType DEFLATE text/javascript
# 更简洁的写法
AddOutputFilterByType DEFLATE text/*
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
# 排除不需要压缩的文件类型(如已经压缩过的图片、视频)
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|pdf|zip|tar|bz2|mp3|wav|mov|avi|mp4|rm|swf)$ no-gzip dont-vary
# 对于不支持压缩的客户端,不进行压缩
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE\s7\.0 no-gzip
BrowserMatch \bMSI[E]\s(?!.*SV1) no-gzip
# 在响应头中添加 Vary: Accept-Encoding
Header append Vary Accept-Encoding
</IfModule>
检查并重启 Apache
保存配置文件后,检查配置并重启 Apache。
# 对于 Debian/Ubuntu 系统 sudo apache2ctl configtest # 或 sudo apachectl configtest # 对于 CentOS/RHEL 系统 sudo apachectl configtest # 如果输出 Syntax OK,说明配置正确 # 重启 Apache sudo systemctl restart apache2 # (Debian/Ubuntu) sudo systemctl restart httpd # (CentOS/RHEL)
如何验证 Gzip 是否生效?
配置完成后,你需要验证网站是否真的在使用 Gzip 压缩,这里有几种简单有效的方法:
使用浏览器开发者工具 (最常用)
- 在 Chrome 或 Firefox 中打开你的网站。
- 按
F12打开开发者工具,切换到 Network (网络) 标签页。 - 勾选 "Disable cache (禁用缓存)"(确保每次都是真实请求)。
- 刷新页面。
- 在请求列表中,找到你的 HTML, CSS, JS 文件。
- 查看该请求的 Headers (标头)。
- 在 Response Headers (响应标头) 部分,你应该能看到
Content-Encoding: gzip。 - 对比 Size (大小) 列,你会发现 "Content (内容)" 的大小远小于 "Transfer (传输)" 的大小。
- 在 Response Headers (响应标头) 部分,你应该能看到
使用在线测试工具
有许多网站可以提供 Gzip 测试服务,你只需输入你的网站 URL,它们会自动分析并告诉你是否启用了 Gzip 压缩。
- GzipWiz
- PageSpeed Insights (Google 的工具,会检查 Gzip 并给出优化建议)
使用 curl 命令 (命令行工具)
在 Linux 终端中,使用以下命令可以快速检查。
# -I 表示只获取响应头,-H 模拟浏览器发送支持的编码 curl -I -H "Accept-Encoding: gzip, deflate" https://www.your-website.com # 如果成功,响应头中会包含: # Content-Encoding: gzip
最佳实践和注意事项
- 不要压缩二进制文件: 对于图片(jpg, png, gif)、视频(mp4, avi)和已压缩的文件(如 .zip, .pdf),再进行 Gzip 压缩效果甚微,甚至会浪费 CPU 资源,配置时应排除这些文件类型。
- 权衡压缩级别: 压缩级别越高,文件越小,但 CPU 占用也越高,对于大多数网站,
gzip_comp_level 6(Nginx) 或DeflateCompressionLevel 6(Apache) 是一个很好的平衡点。 - 服务器资源: Gzip 压缩会增加服务器的 CPU 负载,如果你的服务器流量巨大且 CPU 已经不堪重负,可能需要监控 CPU 使用情况,或考虑使用 Brotli 算法(比 Gzip 压缩率更高,CPU 开销也略大)。
- 缓存: 启用 Gzip 的同时,务必配置好浏览器缓存(通过设置
Cache-Control,Expires,ETag等响应头),这样浏览器可以将解压后的文件缓存起来,再次访问时就不需要重新下载和解压了。
进阶:Brotli 压缩
Brotli 是一种比 Gzip 更新的压缩算法,由 Google 推出,压缩率通常比 Gzip 高 15-25%,现代浏览器(Chrome, Firefox, Edge, Opera)都已支持。
Nginx 配置 Brotli:
需要安装 ngx_brotli 模块。
# 在 http 块中添加 brotli on; brotli_comp_level 6; brotli_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
Apache 配置 Brotli:
需要安装 mod_brotli 模块。
# 启用模块
sudo a2enmod brotli
# 在配置文件中
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/*
AddOutputFilterByType BROTLI_COMPRESS application/javascript
AddOutputFilterByType BROTLI_COMPRESS application/json
AddOutputFilterByType BROTLI_COMPRESS application/xml
AddOutputFilterByType BROTLI_COMPRESS application/rss+xml
AddOutputFilterByType BROTLI_COMPRESS image/svg+xml
</IfModule>
Brotli 的配置和验证方法与 Gzip 类似,浏览器会通过 Accept-Encoding: br 来请求。
为 Linux 上的网站启用 Gzip 压缩是一项投入小、回报高的优化,无论是使用 Nginx 还是 Apache,配置都非常简单,完成配置后,务必使用工具进行验证,确保它能正常工作,从而显著提升你的网站性能和用户体验。
