怎样配置Apache缓存提高性能
Apache缓存是提升网站性能的关键手段,通过减少重复内容的生成和传输,可显著降低服务器负载、缩短响应时间。以下是具体的配置步骤及优化建议:
Apache的缓存功能依赖mod_cache(核心缓存框架)和mod_cache_disk(磁盘缓存实现)模块。首先需安装并启用这些模块:
yum安装模块,然后编辑httpd.conf启用:sudo yum install mod_cache mod_cache_disk
sudo systemctl restart httpd
在配置文件中添加:LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
a2enmod命令启用模块,然后重启Apache:sudo a2enmod cache cache_disk
sudo systemctl restart apache2
通过mod_cache_disk设置缓存存储位置和目录结构,避免缓存文件混乱:
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
# 启用磁盘缓存(指定URL路径,如/static/表示仅缓存该目录下的内容)
CacheEnable disk /static/
# 缓存根目录(需确保Apache用户有读写权限)
CacheRoot "/var/cache/apache2/mod_cache_disk"
# 缓存目录层级(2层,如01/23/)
CacheDirLevels 2
# 每层目录名长度(1位字符,如0-9)
CacheDirLength 1
# 默认缓存过期时间(3600秒=1小时)
CacheDefaultExpire 3600
# 最大缓存过期时间(86400秒=1天)
CacheMaxExpire 86400
# 最小缓存过期时间(600秒=10分钟)
CacheMinExpire 600
</IfModule>
</IfModule>
说明:CacheEnable disk指定缓存类型为磁盘,CacheRoot需设置为绝对路径且具备正确权限(如chown -R apache:apache /var/cache/apache2/mod_cache_disk)。
mod_expires模块可根据文件类型设置明确的过期时间,让浏览器直接缓存静态资源,减少服务器请求:
<IfModule mod_expires.c>
ExpiresActive On
# HTML文件:1小时后过期
ExpiresByType text/html "access plus 1 hour"
# 图片(jpg/jpeg/png/gif):1周后过期
ExpiresByType image/jpg "access plus 1 week"
ExpiresByType image/jpeg "access plus 1 week"
ExpiresByType image/png "access plus 1 week"
ExpiresByType image/gif "access plus 1 week"
# CSS/JS文件:1周后过期
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>
注意:需配合mod_headers模块设置Cache-Control头,增强缓存控制:
<IfModule mod_headers.c>
<FilesMatch "\.(jpg|jpeg|png|gif|css|js|html)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
</IfModule>
通过mod_deflate模块压缩文本内容(HTML/CSS/JS),减少传输数据量,提升加载速度:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
</IfModule>
说明:避免压缩图片(如jpg/png),因为图片本身已压缩,再次压缩效果有限甚至增加CPU负担。
动态内容(如包含Set-Cookie的会话页面)不应缓存,需通过mod_cache的忽略指令排除:
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
# 忽略Set-Cookie头(防止缓存会话页面)
CacheIgnoreHeaders Set-Cookie
# 忽略没有Last-Modified头的资源(避免缓存无效内容)
CacheIgnoreNoLastMod On
# 忽略Pragma头(兼容旧浏览器)
CacheIgnoreHeaders Pragma
</IfModule>
</IfModule>
限制缓存目录大小,避免占用过多磁盘空间:
<IfModule mod_cache_disk.c>
# 单个缓存文件最大大小(10MB)
CacheMaxFileSize 10485760
# 单个缓存文件最小大小(1字节)
CacheMinFileSize 1
# 缓存总大小(1GB)
CacheMaxSize 1073741824
# 清理过期缓存的间隔(3600秒=1小时)
CacheCleanInterval 3600
</IfModule>
KeepAlive允许客户端在一个TCP连接上发送多个请求,减少连接建立的时间:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
说明:MaxKeepAliveRequests限制单个连接的最大请求数,KeepAliveTimeout设置连接保持时间(秒)。
通过curl命令检查响应头,确认缓存策略是否生效:
curl -I http://yourdomain.com/static/image.jpg
预期结果:响应头中应包含以下字段:
Cache-Control: max-age=604800, public
Expires: Wed, 10 Nov 2025 03:00:00 GMT
Last-Modified: Tue, 09 Oct 2025 12:00:00 GMT
若存在X-Cache: HIT(部分配置下),则表示缓存命中。
CacheRoot目录的权限正确(如755或775),避免Apache无法写入。PHPSESSID)、实时数据(如股票行情)的页面,防止显示过期信息。cron任务定期清理过期缓存(如每天凌晨执行find /var/cache/apache2/mod_cache_disk -type f -mtime +7 -delete)。通过以上配置,Apache缓存的性能提升效果将逐步显现,尤其对静态资源(图片、CSS、JS)的加速效果最为明显。