Ubuntu上Apache2配置缓存技巧
Apache2的缓存功能依赖mod_cache(核心缓存模块)和mod_cache_disk(磁盘缓存后端)模块。在Ubuntu中,可通过以下命令快速启用:
sudo a2enmod cache cache_disk # 启用模块
sudo systemctl restart apache2 # 重启Apache使模块生效
若未安装,可通过sudo apt install apache2-mod-cache apache2-mod-cache-disk安装。
在Apache配置文件(如/etc/apache2/conf-available/cache.conf)中添加以下内容,启用磁盘缓存并设置核心参数:
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheEnable disk / # 对根路径启用缓存(可替换为特定路径,如/static)
CacheRoot "/var/cache/apache2/mod_cache_disk" # 缓存文件存储目录(需确保Apache有读写权限)
CacheDirLevels 2 # 缓存目录层级(建议2-3层,避免单目录文件过多)
CacheDirLength 1 # 每层目录名称长度(1-2位,优化目录结构)
CacheDefaultExpire 3600 # 默认缓存过期时间(秒,默认1小时)
</IfModule>
</IfModule>
启用配置文件并重启Apache:
sudo a2enconf cache # 启用conf-available中的cache.conf
sudo systemctl restart apache2
```。
### 3. 高级缓存规则优化
#### 3.1 特定路径/文件类型缓存
通过`<Location>`或`<FilesMatch>`指令,针对静态资源(如图片、CSS、JS)或特定目录设置更长的缓存时间:
```apache
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
# 缓存/static目录下的所有内容,过期时间设为1天
<Location "/static">
CacheEnable disk
CacheDefaultExpire 86400
CacheIgnoreHeaders Set-Cookie # 忽略Set-Cookie头(避免缓存带会话信息的页面)
</Location>
# 缓存所有图片、CSS、JS文件,过期时间设为1个月
<FilesMatch "\.(jpg|jpeg|png|gif|css|js)$">
CacheEnable disk
CacheDefaultExpire 2592000
CacheMaxExpire 3067200 # 最大过期时间(避免资源更新后长期不刷新)
</FilesMatch>
</IfModule>
</IfModule>
```。
#### 3.2 控制缓存行为
通过以下指令优化缓存策略,平衡性能与实时性:
```apache
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheIgnoreNoLastMod On # 即使资源未修改,也使用缓存(减少服务器请求)
CacheLastModifiedFactor 0.5 # 根据Last-Modified头计算过期时间(0.5表示50%的修改时间作为缓存时间)
CacheStorePrivate On # 缓存私有内容(如用户个性化页面)
CacheStorePublic Off # 不缓存公共内容(如新闻页面,需根据实际情况调整)
CacheRemoveHeaders Set-Cookie # 删除响应中的Set-Cookie头(避免缓存带会话的页面)
</IfModule>
</IfModule>
```。
### 4. 配置浏览器端缓存(Expires模块)
通过`mod_expires`模块设置HTTP响应头,让浏览器缓存静态资源,减少重复请求:
```apache
<IfModule mod_expires.c>
ExpiresActive On # 启用Expires功能
ExpiresDefault "access plus 1 week" # 默认缓存时间(1周)
ExpiresByType text/html "access plus 1 week" # HTML页面缓存1周
ExpiresByType text/css "access plus 1 month" # CSS文件缓存1个月
ExpiresByType application/javascript "access plus 1 month" # JS文件缓存1个月
ExpiresByType image/jpeg "access plus 1 month" # JPEG图片缓存1个月
ExpiresByType image/png "access plus 1 month" # PNG图片缓存1个月
</IfModule>
启用配置文件并重启Apache:
sudo a2enmod expires # 启用mod_expires
sudo systemctl restart apache2
```。
### 5. 验证缓存生效
使用`curl`命令检查响应头,确认缓存是否生效:
```bash
curl -I http://your-domain.com/static/image.jpg
若返回结果中包含以下头部,则表示缓存配置成功:
Cache-Control: max-age=2592000, public # 浏览器缓存时间
Expires: Wed, 21 Oct 2025 07:28:00 GMT # 过期时间
ETag: "123456789" # 资源标识(用于协商缓存)
```。
### 6. 监控与调优
#### 6.1 查看缓存命中率
通过Apache的`access.log`或`mod_cache`的统计功能(需开启`CacheDetailHeader On`)监控缓存命中率,分析缓存效果。
#### 6.2 调整缓存参数
- **增大缓存目录层级**:若缓存文件过多(如超过10万),可增加`CacheDirLevels`(如3层)和`CacheDirLength`(如2位),避免单目录性能下降。
- **调整过期时间**:根据资源更新频率调整`CacheDefaultExpire`(如静态资源设为1个月,动态内容设为1小时)。
- **清理缓存**:手动清理缓存目录(`/var/cache/apache2/mod_cache_disk`),或在配置中添加`CacheCleanInterval 300`(每5分钟自动清理过期缓存)。