Apache 压缩与静态文件优化
Apache Compression and Static File Optimization
概述 (Overview)
压缩和静态文件优化是提高Web应用性能的重要技术。本文将详细介绍Apache中mod_deflate模块的配置方法,包括Gzip压缩、Brotli压缩、静态文件优化和性能调优等核心技术。
Compression and static file optimization are important technologies for improving web application performance. This article will detail the configuration methods for Apache's mod_deflate module, including Gzip compression, Brotli compression, static file optimization, and performance tuning core technologies.
1. Gzip压缩配置 (Gzip Compression Configuration)
1.1 启用mod_deflate模块 (Enabling mod_deflate Module)
# 启用压缩模块
sudo a2enmod deflate
# 重启Apache
sudo systemctl restart apache2
# 验证模块是否启用
apache2ctl -M | grep deflate
1.2 基本Gzip压缩配置 (Basic Gzip Compression Configuration)
# 启用压缩引擎
<IfModule mod_deflate.c>
# 压缩文本内容
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
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
# 压缩字体文件
AddOutputFilterByType DEFLATE application/font-woff
AddOutputFilterByType DEFLATE application/font-woff2
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE font/truetype
</IfModule>
1.3 高级压缩配置 (Advanced Compression Configuration)
<IfModule mod_deflate.c>
# 启用压缩
SetOutputFilter DEFLATE
# 压缩级别(1-9,9为最高压缩比)
DeflateCompressionLevel 6
# 内存级别(1-9)
DeflateMemLevel 9
# 窗口大小(1-15)
DeflateWindowSize 15
# 排除特定浏览器
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 排除特定文件类型
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
# 设置Vary头
Header append Vary User-Agent env=!dont-vary
</IfModule>
2. Brotli压缩配置 (Brotli Compression Configuration)
2.1 启用mod_brotli模块 (Enabling mod_brotli Module)
# 启用Brotli模块(Apache 2.4.26+)
sudo a2enmod brotli
# 重启Apache
sudo systemctl restart apache2
2.2 Brotli压缩配置 (Brotli Compression Configuration)
<IfModule mod_brotli.c>
# 启用Brotli压缩
AddOutputFilterByType BROTLI_COMPRESS text/plain
AddOutputFilterByType BROTLI_COMPRESS text/html
AddOutputFilterByType BROTLI_COMPRESS text/xml
AddOutputFilterByType BROTLI_COMPRESS text/css
AddOutputFilterByType BROTLI_COMPRESS application/xml
AddOutputFilterByType BROTLI_COMPRESS application/xhtml+xml
AddOutputFilterByType BROTLI_COMPRESS application/rss+xml
AddOutputFilterByType BROTLI_COMPRESS application/javascript
AddOutputFilterByType BROTLI_COMPRESS application/x-javascript
AddOutputFilterByType BROTLI_COMPRESS application/json
# Brotli压缩质量(0-11,11为最高压缩比)
BROTLI_COMPRESSION_QUALITY 6
# Brotli窗口大小
BROTLI_WINDOW 18
# 启用Brotli预分配
BROTLI_PREALLOCATE on
</IfModule>
2.3 Gzip和Brotli优先级配置 (Gzip and Brotli Priority Configuration)
<IfModule mod_brotli.c>
# 优先使用Brotli压缩
AddOutputFilterByType BROTLI_COMPRESS text/html text/css application/javascript
</IfModule>
<IfModule mod_deflate.c>
# Brotli不可用时使用Gzip
<IfModule !mod_brotli.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
</IfModule>
</IfModule>
3. 静态文件优化 (Static File Optimization)
3.1 静态文件缓存配置 (Static File Cache Configuration)
# 静态文件优化配置
<Directory "/var/www/html/static">
# 启用ETag
FileETag MTime Size
# 设置缓存控制
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
</IfModule>
# 设置Cache-Control头
<IfModule mod_headers.c>
<FilesMatch "\.(css|js|gif|png|jpe?g|svg)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
</IfModule>
</Directory>
3.2 静态文件合并和最小化 (Static File Concatenation and Minification)
# 静态文件合并示例
<IfModule mod_rewrite.c>
RewriteEngine On
# 合并CSS文件
RewriteRule ^css/combined\.css$ /combine.php?type=css&files=style1.css,style2.css,style3.css [L]
# 合并JS文件
RewriteRule ^js/combined\.js$ /combine.php?type=js&files=script1.js,script2.js,script3.js [L]
</IfModule>
4. 文件类型优化 (File Type Optimization)
4.1 图片文件优化 (Image File Optimization)
# 图片文件优化配置
<Directory "/var/www/html/images">
# 设置适当的缓存时间
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
</IfModule>
# 设置Cache-Control头
<IfModule mod_headers.c>
<FilesMatch "\.(gif|png|jpe?g|svg|webp)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
</IfModule>
</Directory>
4.2 字体文件优化 (Font File Optimization)
# 字体文件优化配置
<Directory "/var/www/html/fonts">
# 设置CORS头(跨域字体)
<IfModule mod_headers.c>
<FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
# 设置缓存头
<FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
</IfModule>
</Directory>
5. 压缩性能调优 (Compression Performance Tuning)
5.1 压缩级别优化 (Compression Level Optimization)
<IfModule mod_deflate.c>
# 根据内容类型设置不同压缩级别
<If "%{CONTENT_TYPE} =~ /text\/html/">
DeflateCompressionLevel 6
</If>
<If "%{CONTENT_TYPE} =~ /text\/css/">
DeflateCompressionLevel 9
</If>
<If "%{CONTENT_TYPE} =~ /application\/javascript/">
DeflateCompressionLevel 9
</If>
<If "%{CONTENT_TYPE} =~ /application\/json/">
DeflateCompressionLevel 6
</If>
</IfModule>
5.2 内存使用优化 (Memory Usage Optimization)
<IfModule mod_deflate.c>
# 优化内存使用
DeflateBufferSize 8192
DeflateMemLevel 8
DeflateWindowSize 14
# 设置最小压缩文件大小
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
# 记录压缩信息
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog /var/log/apache2/deflate_log deflate
</IfModule>
6. 条件压缩 (Conditional Compression)
6.1 基于用户代理的压缩 (User-Agent Based Compression)
<IfModule mod_deflate.c>
# 排除不支持压缩的旧浏览器
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 排除移动浏览器(节省移动设备资源)
BrowserMatch \b(iPhone|iPad|Android) no-gzip
# 针对特定浏览器优化
<If "%{HTTP_USER_AGENT} =~ /Chrome/">
DeflateCompressionLevel 9
</If>
<If "%{HTTP_USER_AGENT} =~ /Firefox/">
DeflateCompressionLevel 8
</If>
</IfModule>
6.2 基于文件大小的压缩 (File Size Based Compression)
<IfModule mod_deflate.c>
# 只压缩大于1KB的文件
<If "%{REQUEST_URI} =~ /\.(css|js|html|xml)$/">
# 使用自定义脚本检查文件大小
SetEnvIf Request_URI "\.(css|js|html|xml)$" maybe_compress
SetEnvIf Content-Length "^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$" dont_compress
SetEnvIf Content-Length "^0$" dont_compress
# 应用压缩
<If "%{ENV:dont_compress} != 1">
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/html
</If>
</If>
</IfModule>
7. 压缩监控和调试 (Compression Monitoring and Debugging)
7.1 压缩状态头 (Compression Status Headers)
<IfModule mod_deflate.c>
# 添加压缩信息头
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
# 设置响应头
Header append "X-Compressed-In" "%{instream}e" expr=%{instream}
Header append "X-Compressed-Out" "%{outstream}e" expr=%{outstream}
Header append "X-Compression-Ratio" "%{ratio}e" expr=%{ratio}
</IfModule>
7.2 压缩日志配置 (Compression Log Configuration)
# 压缩日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{instream}n %{outstream}n %{ratio}n%%" compression
# 压缩访问日志
CustomLog /var/log/apache2/compression.log compression
# 压缩错误日志
ErrorLog /var/log/apache2/compression_error.log
LogLevel debug deflate:trace6
7.3 压缩测试脚本 (Compression Test Script)
#!/bin/bash
# compression-test.sh
test_compression() {
local url=${1:-"http://localhost/"}
echo "=== Compression Test ==="
echo "Testing URL: $url"
echo
# 测试Gzip压缩
echo "1. Gzip Compression Test:"
curl -H "Accept-Encoding: gzip" -s -w "Size: %{size_download} bytes\n" -o /tmp/gzip_test "$url"
gzip_size=$(stat -c%s /tmp/gzip_test)
echo " Compressed size: $gzip_size bytes"
# 测试无压缩
echo
echo "2. Uncompressed Test:"
curl -H "Accept-Encoding: identity" -s -w "Size: %{size_download} bytes\n" -o /tmp/uncompressed_test "$url"
uncompressed_size=$(stat -c%s /tmp/uncompressed_test)
echo " Original size: $uncompressed_size bytes"
# 计算压缩比
if [ $uncompressed_size -gt 0 ]; then
ratio=$(echo "scale=2; (1 - $gzip_size / $uncompressed_size) * 100" | bc)
echo " Compression ratio: ${ratio}%"
fi
# 清理临时文件
rm -f /tmp/gzip_test /tmp/uncompressed_test
echo
echo "Compression test completed!"
}
test_compression $1
8. 安全压缩配置 (Security Compression Configuration)
8.1 防止压缩炸弹 (Preventing Compression Bombs)
<IfModule mod_deflate.c>
# 设置最大压缩比限制
DeflateInflateLimitRequestBody 10485760 # 10MB
# 设置最大解压比
DeflateInflateRatioLimit 200
DeflateInflateRatioBurst 3
# 启用压缩炸弹检测
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
# 自定义日志记录可疑压缩
LogFormat "%h %l %u %t \"%r\" %>s %b %{instream}n %{outstream}n" compression_security
CustomLog /var/log/apache2/compression_security.log compression_security \
expr=%{outstream}n-%{instream}n-gt-1000000
</IfModule>
8.2 敏感内容压缩控制 (Sensitive Content Compression Control)
# 防止敏感内容被压缩
<Location "/admin/">
<IfModule mod_deflate.c>
RemoveOutputFilter DEFLATE
</IfModule>
<IfModule mod_brotli.c>
RemoveOutputFilter BROTLI_COMPRESS
</IfModule>
</Location>
<Location "/api/sensitive/">
<IfModule mod_deflate.c>
RemoveOutputFilter DEFLATE
</IfModule>
</Location>
小结 (Summary)
通过本文学习,你应该掌握:
- Apache Gzip压缩的配置和优化方法
- Brotli压缩的启用和配置技术
- 静态文件缓存和优化策略
- 不同文件类型的优化配置
- 压缩性能调优技术
- 条件压缩和用户代理适配
- 压缩监控和调试方法
- 安全压缩配置和压缩炸弹防护
压缩和静态文件优化是提升Web应用性能的重要手段,正确配置这些技术能够显著减少传输数据量并提升用户体验。在下一篇文章中,我们将详细介绍Apache性能调优技术。