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