Debian 上配置 Apache 缓存的完整指南
一 方案总览
- 在 Debian 上,Apache 的缓存通常分为三层:
- 磁盘缓存:使用 mod_cache_disk 将可缓存的响应落到磁盘,适合代理或动态内容加速。
- 浏览器缓存:使用 mod_expires 设置 Cache-Control/Expires,让客户端长期复用资源。
- 文件句柄/静态文件缓存:使用 mod_file_cache 将静态文件常驻内存,减少磁盘 I/O。
二 启用模块
- 安装所需模块(若尚未安装):
- sudo apt-get update
- sudo apt-get install libapache2-mod-cache libapache2-mod-cache-disk
- 启用模块:
- sudo a2enmod cache
- sudo a2enmod cache_disk
- sudo a2enmod expires
- sudo a2enmod file_cache
- 使配置生效:
- sudo systemctl restart apache2
- 说明:在部分系统上,相关模块可能已预装,上述命令为幂等操作,未安装时会自动安装,已安装则提示已启用。
三 配置磁盘缓存 CacheEnable disk
- 准备缓存目录并设置权限:
- sudo mkdir -p /var/cache/apache2/mod_cache_disk
- sudo chown -R www-data:www-data /var/cache/apache2/mod_cache_disk
- sudo chmod -R 755 /var/cache/apache2/mod_cache_disk
- 全局或虚拟主机启用磁盘缓存(示例为全局配置,也可放入 或 /):
-
CacheEnable disk /
CacheRoot "/var/cache/apache2/mod_cache_disk"
CacheDirLevels 2
CacheDirLength 1
CacheIgnoreHeaders Set-Cookie
CacheIgnoreNoLastMod On
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheMinExpire 600
CacheLockOnPost On
CacheLockPath /tmp/mod_cache_lock
CacheLockMaxAge 5
CacheStorePrivateFiles On
CacheableMimeType text/html text/css application/javascript
- 仅对特定路径启用(示例):
- <Location “/static”>
CacheEnable disk
CacheDefaultExpire 3600
- 关键参数说明:
- CacheEnable disk [/path]:对指定路径启用磁盘缓存;/ 表示全局。
- CacheRoot:缓存根目录,需可写且归属 www-data。
- CacheDirLevels/CacheDirLength:缓存目录层级与长度,利于海量小文件存储。
- CacheIgnoreHeaders Set-Cookie:遇到 Set-Cookie 时不缓存(避免私有会话泄露)。
- CacheIgnoreNoLastMod On:无 Last-Modified 也允许缓存(配合默认过期)。
- CacheDefaultExpire/CacheMaxExpire/CacheMinExpire:默认/最大/最小过期时间(秒)。
- CacheLockOnPost/CacheLockPath/CacheLockMaxAge:并发写保护,避免重复生成。
- CacheStorePrivateFiles On:允许缓存带 Cache-Control: private 的响应(按需开启)。
- CacheableMimeType:仅缓存指定 MIME 类型,提升命中率与安全性。
四 配置浏览器缓存 mod_expires
- 在 或 中启用:
-
ExpiresActive On
ExpiresDefault "access plus 1 week"
ExpiresByType text/html "access plus 1 hour"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
- 说明:为不同类型设置差异化 max-age,静态资源(如图片、字体、视频)可设置更长周期;text/html 通常较短或配合协商缓存(ETag/Last-Modified)。
五 验证与注意事项
- 验证配置与生效:
- 语法检查:sudo apache2ctl configtest
- 重启服务:sudo systemctl restart apache2
- 查看响应头:curl -I https://your-domain/static/app.js
- 期望看到:Cache-Control: public, max-age=… 或 Expires: …;命中磁盘缓存时,部分环境会带 X-Cache: HIT(取决于是否启用相关模块/代理)。
- 常见问题与建议:
- 动态、带 Set-Cookie、带 Authorization 或用户私有内容不应被缓存;必要时使用 Vary 与更严格的 Cache-Control。
- 静态资源建议配合 强缓存(长 max-age)+ 文件名哈希 或 ETag,实现“长期缓存 + 变更即失效”。
- 目录权限与磁盘空间:确保 /var/cache/apache2/mod_cache_disk 可写且磁盘充足;定期清理陈旧缓存。
- 高并发写入场景建议开启 CacheLockOnPost 并合理设置 CacheLockMaxAge,避免“缓存击穿”。
- 若需对少量热点静态文件做极致加速,可结合 mod_file_cache 的 CacheFile 指令(适合体积较小且极少变更的文件)。