温馨提示×

CentOS Apache2缓存设置技巧

小樊
38
2025-12-27 07:35:27
栏目: 智能运维

CentOS Apache2 缓存设置技巧

一 核心模块与启用方式

  • 常用模块:mod_cache(缓存框架)、mod_cache_disk(磁盘后端)、mod_expires(生成 Expires/Cache-Control)、mod_deflate(压缩)、mod_headers(自定义头)、mod_status(状态与命中率)。
  • 安装与启用(CentOS 7/8/Stream,模块多以包或 conf.modules.d 配置启用):
    • 安装模块:sudo yum install -y mod_cache mod_cache_disk mod_expires
    • 启用方式一(若包未自动启用):在 /etc/httpd/conf.modules.d/00-base.conf 或同级目录确保存在并启用相应 LoadModule 行,或手动添加:
      LoadModule cache_module modules/mod_cache.so
      LoadModule cache_disk_module modules/mod_cache_disk.so
      LoadModule expires_module modules/mod_expires.so
    • 重启生效:sudo systemctl restart httpd
  • 说明:在部分环境中,这些模块可能随 httpd 一起提供,但仍需确认已加载并处于可用状态。

二 磁盘缓存与关键参数

  • 建议仅对静态资源路径启用,例如 /static,避免缓存带会话或用户私有数据的页面。
  • 示例配置(放入 /etc/httpd/conf.d/cache.conf 或站点配置):
    <IfModule mod_cache.c>
      <IfModule mod_cache_disk.c>
        CacheEnable disk /static
        CacheRoot "/var/cache/httpd/mod_cache_disk"
        CacheDirLevels 2
        CacheDirLength 1
        CacheDefaultExpire 3600
        CacheMaxExpire 86400
        CacheIgnoreHeaders Set-Cookie
        CacheIgnoreNoLastMod On
        CacheLockPath /var/lock/httpd/mod_cache_lock
        CacheLockMaxAge 5
        # 可选:忽略查询串,避免 ?v=1 导致重复缓存
        CacheIgnoreQueryString On
      </IfModule>
    </IfModule>
    
  • 目录与权限:
    sudo mkdir -p /var/cache/httpd/mod_cache_disk
    sudo chown -R apache:apache /var/cache/httpd/mod_cache_disk
  • 关键参数说明:
    • CacheEnable disk /static:仅缓存指定前缀路径。
    • CacheRoot:缓存文件存放目录,需 Apache 可写。
    • CacheDirLevels/CacheDirLength:优化海量小文件的目录结构。
    • CacheDefaultExpire/CacheMaxExpire:默认与最大过期时间(秒)。
    • CacheIgnoreHeaders Set-Cookie:避免缓存含会话信息的响应。
    • CacheIgnoreQueryString On:忽略 URL 查询参数对缓存键的影响。
    • CacheLockPath/CacheLockMaxAge:并发写入锁,降低脏写。

三 浏览器缓存与压缩协同

  • 使用 mod_expires 为不同类型设置过期时间,生成 ExpiresCache-Control
    <IfModule mod_expires.c>
      ExpiresActive On
      ExpiresByType image/jpg  "access plus 1 year"
      ExpiresByType image/jpeg "access plus 1 year"
      ExpiresByType image/png  "access plus 1 year"
      ExpiresByType image/gif  "access plus 1 year"
      ExpiresByType text/css  "access plus 1 week"
      ExpiresByType application/javascript "access plus 1 week"
      ExpiresByType text/html "access plus 1 hour"
    </IfModule>
    
  • 对长期不变的资源,可叠加 immutable(现代浏览器支持):
    <IfModule mod_headers.c>
      <FilesMatch "\.(jpg|jpeg|png|gif|css|js)$">
        Header set Cache-Control "public, max-age=31536000, immutable"
      </FilesMatch>
    </IfModule>
    
  • 启用 mod_deflate 压缩文本类内容,减少带宽:
    <IfModule mod_deflate.c>
      AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
    </IfModule>
    
  • 提示:图片、视频等已压缩的二进制资源无需再压缩,避免无效 CPU 消耗。

四 连接与监控优化

  • 开启 KeepAlive 复用连接,降低握手开销:
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5
    
  • 启用 mod_status 观察命中率与运行情况(生产建议限制来源 IP):
    LoadModule status_module modules/mod_status.so
    <Location "/server-status">
      SetHandler server-status
      Require ip 127.0.0.1
    </Location>
    ExtendedStatus On
    
    访问 http://服务器IP/server-status,关注 CacheHitRatio 等指标,按命中率与业务新鲜度权衡 CacheDefaultExpire/CacheMaxExpire
  • 按需清理过期对象:sudo apachectl cache-flush(无需重启)。

五 验证与常见问题

  • 验证命令与预期响应头:
    curl -I https://your_domain/static/logo.png
    期望看到:
    • Cache-Control: max-age=31536000, public(或包含 immutable
    • Expires: 对应过期时间
    • 若启用压缩:Content-Encoding: gzip
  • 常见问题与规避:
    • 登录/购物车等动态页面被缓存:确保路径未纳入 CacheEnable,并使用 CacheIgnoreHeaders Set-Cookie;必要时对动态内容关闭缓存。
    • 带版本号或指纹的资源仍产生重复缓存:启用 CacheIgnoreQueryString On
    • 缓存目录不可写导致失败:检查 CacheRoot 权限与 SELinux 上下文。
    • 高并发大流量场景:考虑在 Apache 前加 Varnish/Nginx 作为反向代理缓存层,提升总体吞吐与命中率。

0