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)

通过本文学习,你应该掌握:

  1. Apache Gzip压缩的配置和优化方法
  2. Brotli压缩的启用和配置技术
  3. 静态文件缓存和优化策略
  4. 不同文件类型的优化配置
  5. 压缩性能调优技术
  6. 条件压缩和用户代理适配
  7. 压缩监控和调试方法
  8. 安全压缩配置和压缩炸弹防护

压缩和静态文件优化是提升Web应用性能的重要手段,正确配置这些技术能够显著减少传输数据量并提升用户体验。在下一篇文章中,我们将详细介绍Apache性能调优技术。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-08-29 15:40:15

results matching ""

    No results matching ""