apache通过mod_cache与mod_cache_disk缓存后端生成的完整html响应,需按序启用模块、创建授权缓存目录、路径级配置cacheenable并忽略set-cookie等干扰头,配合public+max-age响应头实现高效服务端缓存。
apache 本身不执行 php 或 python 脚本,但可以通过 mod_cache + mod_cache_disk 缓存后端已生成的完整 html 响应,让重复请求直接返回磁盘缓存内容,跳过后端处理——这是减轻数据库、应用进程压力最直接有效的方式。
启用必要模块并验证加载
缺一不可,且顺序不能错:
-
mod_cache:缓存逻辑框架,必须最先加载 -
mod_cache_disk:提供磁盘存储能力,必须紧随其后 -
mod_headers和mod_expires:用于补头或兜底控制缓存时长
Debian/Ubuntu 执行:sudo a2enmod cache cache_disk headers expires
然后重启:sudo systemctl restart apache2
验证是否生效:apache2ctl -M | grep -E 'cache|headers|expires'
输出中必须同时出现 cache_module、cache_disk_module、headers_module 等。
创建并授权缓存目录
路径必须本地、可写、有足够空间(建议 ≥5GB),且不能是 NFS、tmp 或同步目录:
- 创建目录:
sudo mkdir -p /var/cache/apache2/dynamic_cache - 赋权(以 Debian 默认用户
www-data为例):sudo chown -R www-data:www-data /var/cache/apache2/dynamic_cache - 确认权限:
ls -ld /var/cache/apache2/dynamic_cache应显示drwxr-xr-x 2 www-data www-data
在虚拟主机中配置缓存规则
不要全局开启 CacheEnable disk /,应按路径精细控制。例如只缓存文章页和分类页:
<ifmodule mod_cache.c><ifmodule mod_cache_disk.c>
CacheRoot /var/cache/apache2/dynamic_cache
CacheDirLevels 2
CacheDirLength 1
CacheIgnoreHeaders Set-Cookie
CacheIgnoreNoLastMod On
CacheIgnoreURLSessionIdentifiers PHPSESSID session_id
CacheDisable /admin/
CacheDisable /user/
CacheDisable /api/
CacheEnable disk /blog/
CacheEnable disk /category/
</ifmodule></ifmodule>
关键点:
-
CacheIgnoreHeaders Set-Cookie防止因后端输出 Cookie 头而跳过缓存(前提是业务已剥离用户态,如登录页不走此路径) -
CacheIgnoreNoLastMod On允许缓存无Last-Modified头的响应(多数 PHP 页面默认不输出) -
CacheDisable明确排除管理后台、用户中心、API 接口等敏感或高动态路径
配合后端设置或 Apache 补充缓存头
Apache 默认只缓存带明确 Cache-Control: public, max-age=N 的响应。两种做法任选其一:
-
推荐在 PHP 中设置:对文章页输出
header('Cache-Control: public, max-age=3600'); -
若后端无法修改,在 Apache 配置中补头:
Header set Cache-Control "public, max-age=3600" "expr=%{REQUEST_URI} =~ m#^/blog/#"
务必避免 private、no-store、Vary: * 或含 Set-Cookie 的响应——它们会直接导致缓存失效。
验证缓存是否命中
用 curl 检查响应头:
curl -I https://yoursite.com/blog/article-1- 成功命中会看到
X-Cache: HIT from your-server(取决于 Apache 版本,也可能是X-Cache: HIT) - 未命中或被跳过则显示
X-Cache: MISS或无该头 - 同时检查缓存目录:
ls /var/cache/apache2/dynamic_cache是否有新增文件
缓存效果立竿见影,相同 GET 请求的后端调用次数可下降 80% 以上,CPU 和数据库负载明显回落。











