Apache缓存配置指南(以mod_cache+mod_cache_disk为例)
Apache的缓存功能依赖mod_cache(核心缓存框架)和mod_cache_disk(磁盘缓存后端)模块。大多数Linux发行版(如CentOS、Ubuntu)的Apache默认安装这些模块,但需手动启用:
yum安装模块并启用:sudo yum install mod_cache mod_cache_disk
sudo systemctl enable httpd && sudo systemctl restart httpd
a2enmod启用模块并重启Apache:sudo a2enmod cache cache_disk
sudo systemctl restart apache2
httpd.conf或apache2.conf)中取消以下行注释:LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
在Apache配置文件(如httpd.conf、apache2.conf或conf.d/cache.conf)中,添加以下基础缓存设置:
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
# 启用磁盘缓存,指定缓存URL路径(如"/static"表示缓存/static目录下的内容)
CacheEnable disk /static
# 缓存根目录(需确保Apache用户有读写权限,通常设为755或777)
CacheRoot "/var/cache/httpd/mod_cache_disk"
# 缓存目录结构(2级目录,每级目录名长度为1字符,避免单目录文件过多)
CacheDirLevels 2
CacheDirLength 1
# 缓存过期控制
CacheDefaultExpire 3600 # 默认过期时间(1小时,未指定Expires/Cache-Control时生效)
CacheMaxExpire 86400 # 最大过期时间(1天,避免缓存过久)
CacheMinExpire 60 # 最小过期时间(1分钟,避免频繁更新)
# 其他优化参数
CacheIgnoreHeaders Set-Cookie # 忽略Set-Cookie头,防止缓存动态内容(如登录状态)
CacheIgnoreNoLastMod On # 忽略无Last-Modified头的资源(强制缓存)
CacheLockPath /var/lock/httpd/mod_cache_lock # 缓存锁路径(避免并发写入冲突)
CacheLockMaxAge 5 # 缓存锁最大存活时间(5秒)
</IfModule>
</IfModule>
关键参数说明:
CacheEnable disk /static:仅缓存/static路径下的内容(如图片、CSS、JS),避免缓存动态页面(如/index.php)。CacheRoot:缓存文件存储目录,需提前创建并赋予权限:sudo mkdir -p /var/cache/httpd/mod_cache_disk
sudo chown -R apache:apache /var/cache/httpd/mod_cache_disk # Apache用户组通常为apache或www-data
若需为不同类型的资源设置不同缓存策略,可使用<Directory>、<Files>或<Location>指令。例如,缓存/static/images目录下的图片(延长过期时间):
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
<Directory "/var/www/html/static/images">
CacheEnable disk /static/images
CacheDefaultExpire 86400 # 默认1天
CacheMaxExpire 604800 # 最大1周
CacheIgnoreQueryString On # 忽略URL查询字符串(如image.jpg?version=1),避免重复缓存
</Directory>
</IfModule>
</IfModule>
或缓存所有.jpg、.png、.css、.js文件:
<FilesMatch "\.(jpg|jpeg|png|css|js)$">
<IfModule mod_cache.c>
CacheEnable disk /
CacheDefaultExpire 3600
</IfModule>
</FilesMatch>
mod_expires模块可自动生成Expires和Cache-Control头,进一步规范浏览器缓存行为。启用并配置如下:
sudo a2enmod expires
sudo systemctl restart apache2
<IfModule mod_expires.c>
ExpiresActive On # 开启Expires功能
ExpiresByType text/html "access plus 1 hour" # HTML文件1小时过期
ExpiresByType image/jpeg "access plus 1 week" # JPEG图片1周过期
ExpiresByType image/png "access plus 1 week" # PNG图片1周过期
ExpiresByType application/javascript "access plus 1 month" # JS文件1个月过期
ExpiresByType text/css "access plus 1 month" # CSS文件1个月过期
</IfModule>
效果:浏览器会根据Expires或Cache-Control头自动缓存资源,减少对服务器的请求。
完成所有配置后,重启Apache服务:
sudo systemctl restart httpd
sudo systemctl restart apache2
使用curl命令检查响应头,确认是否包含Cache-Control或Expires头:
curl -I http://yourwebsite.com/static/image.jpg
预期结果:应看到类似以下响应头,表示缓存生效:
HTTP/1.1 200 OK
Date: Wed, 10 Oct 2025 08:00:00 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 03 Oct 2025 08:00:00 GMT
ETag: "34aa387-d-1568eb00"
Cache-Control: max-age=3600, public
Expires: Wed, 10 Oct 2025 09:00:00 GMT
若Cache-Control中包含public或max-age,且Expires为未来时间,则说明缓存配置成功。
CacheRoot目录的权限正确(Apache用户可读写),否则会导致缓存失败。Set-Cookie、Authorization头的动态页面(如登录页面),可通过CacheIgnoreHeaders指令实现。CacheRoot目录下的旧文件(可通过cron任务自动化)。mod_mem_cache模块(需调整MCacheSize、MCacheMaxObjectSize等参数)。