什么是 Gzip?

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

linux 网站 gzip
(图片来源网络,侵删)

工作原理:

  1. 当用户访问你的网站时,浏览器会通过 HTTP 请求头 Accept-Encoding: gzip, deflate 告诉服务器:“我支持 Gzip 或 Deflate 压缩格式”。
  2. 如果你的服务器配置了 Gzip 压缩,并且启用了该功能,服务器会在发送文件之前,先将其压缩成 Gzip 格式。
  3. 服务器在响应头中添加 Content-Encoding: gzip,告诉浏览器:“我发送给你的是压缩过的数据”。
  4. 浏览器接收到数据后,会自动解压,然后正常显示网页。

好处:

  • 减少传输数据量: 文件体积可以减少 60% 到 90%,极大地缩短了文件的下载时间。
  • 提升加载速度: 页面加载速度越快,用户体验越好,对 SEO(搜索引擎优化)也越有利。
  • 节省带宽: 服务器和用户之间的网络流量大幅减少,为你节省带宽成本。

如何在 Linux 上为网站启用 Gzip?

启用 Gzip 的方法取决于你使用的 Web 服务器,下面将分别介绍最常用的 NginxApache 的配置方法。

Nginx 配置

Nginx 的 Gzip 功能由 ngx_http_gzip_module 模块提供,该模块在 Nginx 默认安装中通常是启用的。

linux 网站 gzip
(图片来源网络,侵删)

编辑 Nginx 配置文件

主配置文件位于 /etc/nginx/nginx.conf,但网站的具体配置可能在 /etc/nginx/sites-available/ 目录下的某个文件中(default 或你的域名配置文件),我们建议在 httpserverlocation 块中添加或修改以下配置。

# 在 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 使配置生效。

linux 网站 gzip
(图片来源网络,侵删)
# 检查 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_deflatemod_gzipmod_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 压缩,这里有几种简单有效的方法:

使用浏览器开发者工具 (最常用)

  1. 在 Chrome 或 Firefox 中打开你的网站。
  2. F12 打开开发者工具,切换到 Network (网络) 标签页。
  3. 勾选 "Disable cache (禁用缓存)"(确保每次都是真实请求)。
  4. 刷新页面。
  5. 在请求列表中,找到你的 HTML, CSS, JS 文件。
  6. 查看该请求的 Headers (标头)
    • Response Headers (响应标头) 部分,你应该能看到 Content-Encoding: gzip
    • 对比 Size (大小) 列,你会发现 "Content (内容)" 的大小远小于 "Transfer (传输)" 的大小。

使用在线测试工具

有许多网站可以提供 Gzip 测试服务,你只需输入你的网站 URL,它们会自动分析并告诉你是否启用了 Gzip 压缩。

使用 curl 命令 (命令行工具)

在 Linux 终端中,使用以下命令可以快速检查。

# -I 表示只获取响应头,-H 模拟浏览器发送支持的编码
curl -I -H "Accept-Encoding: gzip, deflate" https://www.your-website.com
# 如果成功,响应头中会包含:
# Content-Encoding: gzip

最佳实践和注意事项

  1. 不要压缩二进制文件: 对于图片(jpg, png, gif)、视频(mp4, avi)和已压缩的文件(如 .zip, .pdf),再进行 Gzip 压缩效果甚微,甚至会浪费 CPU 资源,配置时应排除这些文件类型。
  2. 权衡压缩级别: 压缩级别越高,文件越小,但 CPU 占用也越高,对于大多数网站,gzip_comp_level 6 (Nginx) 或 DeflateCompressionLevel 6 (Apache) 是一个很好的平衡点。
  3. 服务器资源: Gzip 压缩会增加服务器的 CPU 负载,如果你的服务器流量巨大且 CPU 已经不堪重负,可能需要监控 CPU 使用情况,或考虑使用 Brotli 算法(比 Gzip 压缩率更高,CPU 开销也略大)。
  4. 缓存: 启用 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,配置都非常简单,完成配置后,务必使用工具进行验证,确保它能正常工作,从而显著提升你的网站性能和用户体验。