Apache Gzip 压缩 #

压缩概述 #

为什么需要压缩? #

text
┌─────────────────────────────────────────────────────────────┐
│                    HTTP 压缩优势                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  减少传输数据量                                             │
│  ├── 文本文件可压缩 60-80%                                  │
│  ├── HTML/CSS/JS 压缩效果显著                               │
│  └── 节省带宽成本                                          │
│                                                             │
│  提升加载速度                                               │
│  ├── 减少下载时间                                          │
│  ├── 提升用户体验                                          │
│  └── SEO 排名提升                                          │
│                                                             │
│  注意事项:                                                 │
│  ├── 压缩需要 CPU 资源                                     │
│  ├── 图片/视频已压缩,无需再压缩                           │
│  └── 小文件压缩效果不明显                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

压缩类型 #

text
┌─────────────────────────────────────────────────────────────┐
│                    压缩类型对比                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Gzip                                                       │
│  ├── 最广泛支持                                             │
│  ├── 压缩率高                                               │
│  └── Apache mod_deflate                                    │
│                                                             │
│  Brotli                                                     │
│  ├── 更高压缩率                                             │
│  ├── 现代浏览器支持                                        │
│  └── 需要单独安装模块                                       │
│                                                             │
│  Deflate                                                    │
│  ├── 较老算法                                               │
│  └── 已被 Gzip 取代                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

启用 mod_deflate #

加载模块 #

bash
# Ubuntu/Debian
sudo a2enmod deflate
sudo systemctl restart apache2

# CentOS/RHEL
# 在配置文件中取消注释
# LoadModule deflate_module modules/mod_deflate.so
sudo systemctl restart httpd

基础配置 #

apache
# ============================================
# 基础 Gzip 压缩配置
# ============================================

<IfModule mod_deflate.c>
    # 压缩级别(1-9)
    DeflateCompressionLevel 6
    
    # 压缩文本类型
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AddOutputFilterByType DEFLATE text/css text/javascript
    AddOutputFilterByType DEFLATE application/javascript application/x-javascript
    AddOutputFilterByType DEFLATE application/json application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml
</IfModule>

完整压缩配置 #

压缩所有文本类型 #

apache
# ============================================
# 完整压缩配置
# ============================================

<IfModule mod_deflate.c>
    # 压缩级别
    DeflateCompressionLevel 6
    
    # HTML 类
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/xml
    
    # CSS 和 JavaScript
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    
    # 数据格式
    AddOutputFilterByType DEFLATE application/json
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/atom+xml
    
    # 字体文件(部分可压缩)
    AddOutputFilterByType DEFLATE application/x-font-ttf
    AddOutputFilterByType DEFLATE application/x-font-otf
    AddOutputFilterByType DEFLATE font/opentype
    AddOutputFilterByType DEFLATE font/ttf
    AddOutputFilterByType DEFLATE font/otf
    
    # SVG
    AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>

排除不压缩的文件 #

apache
# ============================================
# 排除不需要压缩的文件
# ============================================

<IfModule mod_deflate.c>
    DeflateCompressionLevel 6
    
    # 压缩文本类型
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AddOutputFilterByType DEFLATE text/css text/javascript
    AddOutputFilterByType DEFLATE application/javascript application/json
    
    # 排除已压缩的文件类型
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
    SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip
    SetEnvIfNoCase Request_URI \.(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip
    SetEnvIfNoCase Request_URI \.(?:woff|woff2)$ no-gzip
    
    # 排除小文件
    # DeflateMinFileSize 1000
</IfModule>

压缩级别 #

级别选择 #

text
┌─────────────────────────────────────────────────────────────┐
│                    压缩级别选择                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  级别范围:1-9                                              │
│                                                             │
│  1 - 最快压缩,最低压缩率                                   │
│  2 - 快速压缩,较低压缩率                                   │
│  3 - 较快压缩                                               │
│  4 - 平衡                                                   │
│  5 - 推荐级别                                               │
│  6 - 推荐级别(默认)                                       │
│  7 - 较高压缩率                                             │
│  8 - 高压缩率                                               │
│  9 - 最高压缩率,最慢速度                                   │
│                                                             │
│  推荐设置:                                                 │
│  - 一般网站:6                                              │
│  - 高流量网站:5                                            │
│  - CPU 资源充足:7-8                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

配置示例 #

apache
# ============================================
# 压缩级别配置
# ============================================

<IfModule mod_deflate.c>
    # 推荐级别
    DeflateCompressionLevel 6
    
    # 或根据服务器资源调整
    # DeflateCompressionLevel 5  # CPU 资源有限
    # DeflateCompressionLevel 8  # CPU 资源充足
</IfModule>

高级配置 #

压缩统计 #

apache
# ============================================
# 压缩统计(用于调试)
# ============================================

<IfModule mod_deflate.c>
    DeflateCompressionLevel 6
    AddOutputFilterByType DEFLATE text/html text/css application/javascript
    
    # 记录压缩统计
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio
    
    # 在日志中记录
    LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
    CustomLog ${APACHE_LOG_DIR}/deflate.log deflate
</IfModule>

条件压缩 #

apache
# ============================================
# 条件压缩配置
# ============================================

<IfModule mod_deflate.c>
    DeflateCompressionLevel 6
    
    # 仅对支持的浏览器压缩
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    
    # 压缩类型
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AddOutputFilterByType DEFLATE text/css application/javascript
</IfModule>

最小文件大小 #

apache
# ============================================
# 最小文件大小限制
# ============================================

<IfModule mod_deflate.c>
    DeflateCompressionLevel 6
    
    # 仅压缩大于 1KB 的文件
    DeflateMinFileSize 1024
    
    # 最大文件大小限制
    DeflateMaxFileSize 10000000
    
    AddOutputFilterByType DEFLATE text/html text/css application/javascript
</IfModule>

.htaccess 配置 #

apache
# ============================================
# .htaccess 压缩配置
# ============================================

<IfModule mod_deflate.c>
    # 压缩级别
    DeflateCompressionLevel 6
    
    # 压缩文本类型
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/json
    
    # 排除已压缩文件
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip
    SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip
    SetEnvIfNoCase Request_URI \.(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip
    SetEnvIfNoCase Request_URI \.(?:woff|woff2)$ no-gzip
</IfModule>

验证压缩 #

使用 curl 测试 #

bash
# 测试是否启用压缩
curl -H "Accept-Encoding: gzip" -I https://example.com

# 输出应包含
# Content-Encoding: gzip
# Vary: Accept-Encoding

# 查看压缩前后大小
curl -s https://example.com | wc -c
curl -s -H "Accept-Encoding: gzip" https://example.com | wc -c

在线测试工具 #

text
┌─────────────────────────────────────────────────────────────┐
│                    压缩测试工具                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  GIDNetwork:                                               │
│  https://www.gidnetwork.com/tools/gzip-test.php            │
│                                                             │
│  Varvy:                                                    │
│  https://varvy.com/tools/gzip/                             │
│                                                             │
│  Chrome DevTools:                                          │
│  Network 面板查看 Content-Encoding 和 Size                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Brotli 压缩 #

安装 Brotli #

bash
# Ubuntu/Debian
sudo apt install libapache2-mod-brotli
sudo a2enmod brotli
sudo systemctl restart apache2

# CentOS/RHEL
sudo yum install mod_brotli

Brotli 配置 #

apache
# ============================================
# Brotli 压缩配置
# ============================================

<IfModule mod_brotli.c>
    # 压缩级别(0-11)
    BrotliCompressionQuality 6
    
    # 压缩窗口大小
    BrotliCompressionWindow 18
    
    # 最小文件大小
    BrotliMinFileSize 256
    
    # 压缩类型
    AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml
    AddOutputFilterByType BROTLI_COMPRESS text/css text/javascript
    AddOutputFilterByType BROTLI_COMPRESS application/javascript application/json
    AddOutputFilterByType BROTLI_COMPRESS application/xml application/xhtml+xml
    AddOutputFilterByType BROTLI_COMPRESS image/svg+xml
</IfModule>

Gzip + Brotli 组合 #

apache
# ============================================
# Gzip + Brotli 组合配置
# ============================================

# 优先使用 Brotli
<IfModule mod_brotli.c>
    BrotliCompressionQuality 6
    AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml
    AddOutputFilterByType BROTLI_COMPRESS text/css application/javascript
</IfModule>

# 回退到 Gzip
<IfModule mod_deflate.c>
    DeflateCompressionLevel 6
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AddOutputFilterByType DEFLATE text/css application/javascript
</IfModule>

完整配置示例 #

apache
# ============================================
# 完整压缩配置示例
# ============================================

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html
    
    # Gzip 压缩
    <IfModule mod_deflate.c>
        DeflateCompressionLevel 6
        
        AddOutputFilterByType DEFLATE text/html text/plain text/xml
        AddOutputFilterByType DEFLATE text/css text/javascript
        AddOutputFilterByType DEFLATE application/javascript application/json
        AddOutputFilterByType DEFLATE application/xml application/xhtml+xml
        AddOutputFilterByType DEFLATE image/svg+xml
        
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
        SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip
        SetEnvIfNoCase Request_URI \.(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip
        SetEnvIfNoCase Request_URI \.(?:woff|woff2)$ no-gzip
        
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    </IfModule>
    
    # 添加 Vary 头
    <IfModule mod_headers.c>
        Header append Vary User-Agent
        Header append Vary Accept-Encoding
    </IfModule>
    
    <Directory /var/www/html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

下一步 #

掌握了 Gzip 压缩后,继续学习 性能优化,了解 Apache 的全面性能调优策略!

最后更新:2026-03-29