1. 启用必要的缓存模块
在Debian上,Apache的缓存功能依赖mod_cache(核心缓存模块)和mod_cache_disk(磁盘缓存实现模块)。首先通过以下命令安装并启用它们:
sudo apt update
sudo apt install libapache2-mod-cache libapache2-mod-cache-disk
sudo a2enmod cache
sudo a2enmod cache_disk
安装后需重启Apache使模块生效:sudo systemctl restart apache2。
2. 配置磁盘缓存基础参数
磁盘缓存是Apache最常用的缓存方式,需设置缓存目录、层级结构和过期策略。在配置文件(如/etc/apache2/apache2.conf或虚拟主机配置文件)中添加:
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheEnable disk / # 启用磁盘缓存,"/"表示缓存所有路径(可根据需求调整为特定路径,如"/static")
CacheRoot "/var/cache/apache2/mod_cache_disk" # 缓存文件存储根目录(需确保目录存在且有写入权限)
CacheDirLevels 2 # 缓存目录层级(建议2-3层,避免单目录文件过多影响性能)
CacheDirLength 1 # 每层目录名称长度(1-2位,平衡目录数量与路径长度)
CacheDefaultExpire 3600 # 默认缓存过期时间(秒,默认1小时,可根据内容更新频率调整)
</IfModule>
</IfModule>
注意:需手动创建缓存目录并设置正确权限:
sudo mkdir -p /var/cache/apache2/mod_cache_disk
sudo chown -R www-data:www-data /var/cache/apache2/mod_cache_disk # Apache默认运行用户为www-data
sudo chmod -R 755 /var/cache/apache2/mod_cache_disk
3. 设置缓存规则(按文件类型/路径优化)
针对静态资源(图片、CSS、JS等)和动态内容设置差异化缓存策略,提升缓存命中率:
FilesMatch指令匹配特定扩展名,设置更长过期时间(如静态资源缓存1周~1个月):<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
<FilesMatch "\.(jpg|jpeg|png|gif|css|js|woff2|ico)$">
CacheEnable disk /
CacheIgnoreHeaders Set-Cookie # 忽略Set-Cookie头(避免缓存带会话信息的动态内容)
CacheIgnoreNoLastMod On # 忽略没有Last-Modified头的文件
CacheDefaultExpire 86400 # 默认过期时间1天(静态资源通常可更长)
CacheMaxExpire 604800 # 最大过期时间1周(防止过期时间过短)
</FilesMatch>
</IfModule>
</IfModule>
/static)设置缓存,避免全局缓存影响动态内容:<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
<Location "/static/">
CacheEnable disk /
CacheIgnoreHeaders Set-Cookie
CacheDefaultExpire 3600
CacheMaxExpire 86400
</Location>
</IfModule>
</IfModule>
4. 配合Expires模块增强浏览器缓存
mod_expires模块可设置HTTP响应头中的Expires和Cache-Control,让浏览器直接缓存资源,减少服务器请求。在配置文件中添加:
<IfModule mod_expires.c>
ExpiresActive On # 启用Expires模块
ExpiresByType text/html "access plus 1 hour" # HTML文件缓存1小时(动态内容更新频繁)
ExpiresByType text/css "access plus 1 week" # CSS文件缓存1周
ExpiresByType application/javascript "access plus 1 week" # JS文件缓存1周
ExpiresByType image/jpeg "access plus 1 month" # JPEG图片缓存1个月
ExpiresByType image/png "access plus 1 month" # PNG图片缓存1个月
ExpiresByType image/gif "access plus 1 month" # GIF图片缓存1个月
</IfModule>
提示:Expires是绝对时间(基于服务器时间),Cache-Control是相对时间(如max-age=3600),两者结合可兼容更多浏览器。
5. 优化缓存性能的关键参数
CacheIgnoreHeaders指令忽略Set-Cookie、Authorization等头信息,避免缓存动态内容(如用户登录状态):CacheIgnoreHeaders Set-Cookie Authorization
CacheIgnoreNoLastMod On可忽略没有Last-Modified头的文件(如某些动态生成的内容),防止缓存无效资源。6. 验证缓存是否生效
使用curl命令查看响应头,确认缓存是否生效:
curl -I http://yourwebsite.com/static/image.jpg
若响应头中出现以下字段则表示缓存生效:
X-Cache: HIT(表示缓存命中,来自Apache缓存)Cache-Control: max-age=86400, public(表示浏览器可缓存)Expires: Wed, 02 Jan 2023 00:00:00 GMT(表示过期时间)。7. 高级优化建议(可选)
wget)预先加载热点静态资源(如首页、热门图片),填充缓存,减少首次访问延迟。mod_status模块(需启用)或第三方工具(如GoAccess)监控缓存命中率,根据命中率调整缓存过期时间和规则(如命中率低则缩短过期时间)。mod_mem_cache模块(内存缓存)进一步提升性能(需足够内存支持)。