温馨提示×

CentOS Apache缓存策略

小樊
32
2025-12-17 13:14:07
栏目: 智能运维

CentOS 上 Apache 缓存策略实践指南

一 缓存类型与适用场景

  • HTTP 内容缓存(mod_cache + mod_disk_cache/mod_mem_cache):基于 URI 的键存储,可缓存本地或反向代理内容,适用于高命中、可共享的响应。注意该模块在 Apache 中标记为 Experimental
  • 文件句柄/内存映射缓存(mod_file_cache):在服务器启动时打开文件或映射文件到内存,适合极少变更的静态文件;对运行时变更不敏感,变更需重启。
  • 键值共享对象缓存(mod_socache_*):用于 SSL 会话认证结果 等,不直接缓存页面内容,常与 SSL/TLS 优化配合使用。

二 启用模块与基础检查

  • CentOS 7/8 上,安装 httpd 后通常已包含相关模块,建议通过 /etc/httpd/conf.modules.d/*.conf 显式加载所需模块,便于管理:
# 示例:/etc/httpd/conf.modules.d/00-cache.conf
LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
# LoadModule mem_cache_module modules/mod_mem_cache.so   # 可选:内存缓存
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
# LoadModule file_cache_module modules/mod_file_cache.so   # 可选:文件句柄/内存映射
  • 语法检查与生效:
sudo apachectl configtest
sudo systemctl restart httpd

三 配置方案示例

  • 方案A 反向代理/本地内容缓存(磁盘后端,生产常用)
<IfModule mod_cache.c>
  <IfModule mod_disk_cache.c>
    CacheRoot   /var/cache/httpd/proxy
    CacheEnable  disk  /
    CacheDirLevels  2
    CacheDirLength  1
    CacheSize      256000   # 单位 KB,示例约 250 MB
    CacheMaxFileSize  1048576 # 1 MB
    CacheMinFileSize  10

    # 过期策略:无显式过期时使用的默认与上限
    CacheDefaultExpire  3600
    CacheMaxExpire      86400

    # 计算过期:基于 Last-Modified 的启发式因子
    CacheLastModifiedFactor 0.5

    # 容错与覆盖:忽略客户端 no-cache/no-store;允许无 Last-Modified 的响应进入候选
    CacheIgnoreCacheControl On
    CacheIgnoreNoLastMod    On

    # 可选:即使客户端中断,也尽量完成缓存写入(提升命中)
    CacheForceCompletion 80
  </IfModule>
</IfModule>
  • 方案B 浏览器端强缓存(静态资源,提升首屏与带宽利用率)
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 1 hour"
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "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 image/svg+xml             "access plus 1 year"
  ExpiresByType font/woff2                "access plus 1 year"
</IfModule>

<IfModule mod_headers.c>
  # 对匹配的资源补充 Cache-Control(可与 Expires 叠加)
  <FilesMatch "\.(css|js|jpe?g|png|gif|svg|woff2)$">
    Header set Cache-Control "public, max-age=31536000, immutable"
  </FilesMatch>
</IfModule>
  • 方案C 启动期文件句柄/内存映射缓存(仅对极稳定静态文件)
# 注意:变更文件后需重启 httpd 才会生效
LoadModule file_cache_module modules/mod_file_cache.so

CacheFile /var/www/html/index.html
CacheFile /var/www/html/static/logo.png

# 或使用内存映射(谨慎:不跟踪内存占用,子进程复制可能导致内存放大)
# MMapFile /var/www/html/index.html
  • 生效与验证:
sudo apachectl configtest
sudo systemctl restart httpd
curl -I https://your-domain/static/app.js
# 期望看到:Cache-Control: public, max-age=31536000 或 Expires: <未来时间>

四 关键指令与行为要点

  • CacheEnable/Disable:按 URI 前缀启用/禁用缓存;可同时配置多种存储后端(如 mem/fd/disk),按顺序尝试直到命中。
  • 过期计算顺序:若响应含 Expires 则以其为准;否则若含 Last-Modified 则按 CacheLastModifiedFactor 启发式计算;若均无则使用 CacheDefaultExpire;但任何情况下不超过 CacheMaxExpire
  • 可缓存性限制:带 Authorization 或显式 no-cache/no-store 的响应默认不缓存;使用 CacheIgnoreCacheControl On 可强制入库(仍受授权限制)。
  • 不缓存的状态码:通常仅缓存 200、203、300、301、410 等;对 206 分块传输流式内容需结合 CacheForceCompletion 提升命中。
  • 磁盘后端参数CacheDirLevels/CacheDirLength 控制目录层级与长度;CacheSize 限制总缓存体积;CacheMaxFileSize/CacheMinFileSize 过滤过大/过小对象。

五 验证与运维建议

  • 验证要点:
    • 使用 curl -I 检查响应头是否包含期望的 Cache-Control/Expires
    • 观察命中情况与目录增长(磁盘后端),必要时调整 CacheSize 与清理策略。
  • 运维与安全:
    • 为缓存目录设置专用 SELinux 上下文与最小权限(如 httpd_sys_rw_content_t),避免泄露敏感内容。
    • 对含有用户身份信息的动态内容避免入库,或通过 VaryCache-Control: private 精细控制。
    • 变更静态资源时采用 文件名哈希或版本号,避免强缓存导致更新不可达。

0