温馨提示×

怎样在Apache中优化静态资源

小樊
37
2026-01-01 10:46:10
栏目: 编程语言

Apache静态资源优化实操指南

一 启用压缩与连接复用

  • 启用模块:在 Debian/Ubuntu 执行 sudo a2enmod deflate;在 CentOS/RHEL 确认已安装 mod_deflate
  • 推荐配置(/etc/apache2/mods-enabled/deflate.conf 或 httpd.conf):
    <IfModule mod_deflate.c>
        # 压缩文本与脚本类资源
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css \
                                 application/javascript application/x-javascript application/xml \
                                 application/xhtml+xml image/svg+xml
    
        # 避免对已经压缩的二进制图片重复压缩
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    
        # 兼容老浏览器
        BrowserMatch ^Mozilla/4 gzip-only-text/html
    
        # 让缓存按 Accept-Encoding 区分版本
        Header append Vary Accept-Encoding
    
        # 压缩级别:1-9,默认通常为 6,兼顾压缩率与 CPU
        DeflateCompressionLevel 6
    </IfModule>
    
  • 启用长连接(建议值):
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5
    
  • 验证:重启后在浏览器开发者工具或 curl -I 中查看响应头是否出现 Content-Encoding: gzip

二 设置强缓存与验证

  • 启用模块:在 Debian/Ubuntu 执行 sudo a2enmod expires headers;在 CentOS/RHEL 确认已加载 mod_expiresmod_headers
  • 推荐配置(在 VirtualHost 或全局配置中):
    # 1) 使用 Expires 模块设置 Expires 与 Cache-Control
    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresByType image/jpg  "access plus 1 year"
        ExpiresByType image/jpeg "access plus 1 year"
        ExpiresByType image/gif  "access plus 1 year"
        ExpiresByType image/png  "access plus 1 year"
        ExpiresByType text/css  "access plus 1 month"
        ExpiresByType application/javascript "access plus 1 month"
        ExpiresByType application/x-javascript "access plus 1 month"
        ExpiresByType image/svg+xml "access plus 1 year"
    </IfModule>
    
    # 2) 用 Headers 精细控制
    <IfModule mod_headers.c>
        # 对带指纹/版本号的资源设置“强缓存”
        <FilesMatch "\.(css|js|png|jpe?g|gif|svg|woff2?|ico)$">
            Header set Cache-Control "public, max-age=31536000, immutable"
        </FilesMatch>
    
        # 对可能频繁变动的资源设置“协商缓存”
        <FilesMatch "\.(html|json)$">
            Header set Cache-Control "public, max-age=0, must-revalidate"
        </FilesMatch>
    </IfModule>
    
  • 缓存时间写法要点:
    • access plus 1 monthnow plus 30 daysA2592000(从访问时计算)
    • modification plus 5 hours 3 minutesM604800(从文件最后修改时间计算,M 仅对静态文件有效)
  • 验证:检查响应头是否包含 Cache-Control: max-age=…Expires,以及 Vary: Accept-Encoding

三 启用 HTTP/2 与资源分发

  • 启用 HTTP/2(Apache 2.4.17+):
    • 模块:sudo a2enmod http2(Debian/Ubuntu);编译时加入 --enable-http2(源码)。
    • 在 VirtualHost 中:
      <IfModule mod_http2.c>
          Protocols h2 http/1.1
      </IfModule>
      
  • 使用 CDN:将图片、字体、JS/CSS 等静态资源托管到 CDN,可显著降低源站带宽与首包时间,并配合上述压缩与缓存策略提升命中率与回源效率。

四 资源本身与运维优化

  • 图片优化:使用 ImageOptim、TinyPNG、imagemin 等工具无损/有损压缩,减少体积。
  • 资源合并与版本化:合并与压缩前端资源,并通过文件名加 hash(如 app.a1b2c3.js)解决强缓存更新问题。
  • 减少不必要模块:禁用不使用的模块(如 a2dismod <module>),降低内存占用与攻击面。
  • 监控与压测:使用 Apache Bench(ab)WebPageTest 等工具持续评估 TTFB、RPS、带宽、CPU 等指标,按结果微调压缩级别与缓存策略。

五 一键检查与常见问题

  • 模块是否已启用:
    • Debian/Ubuntu:apache2ctl -M | egrep 'deflate_module|expires_module|headers_module|http2_module'
    • CentOS/RHEL:httpd -M | egrep 'deflate_module|expires_module|headers_module|http2_module'
  • 配置语法与生效:
    • 语法检查:sudo apache2ctl configtest(Debian/Ubuntu)或 sudo httpd -t(CentOS/RHEL)
    • 重启服务:sudo systemctl restart apache2(或 httpd
  • 常见问题与要点:
    • 已压缩的 GIF/JPG/PNG 不要再压缩,节省 CPU 并避免潜在质量损失。
    • 设置 Vary: Accept-Encoding,确保 CDN/浏览器 能正确区分并缓存压缩与非压缩版本。
    • 强缓存资源务必使用 文件名哈希 或版本号,避免用户端长期拿到旧文件。

0