Apache可通过mod_proxy+mod_cache_disk组合实现正向代理缓存,需启用proxy、proxy_http、proxy_connect、cache、cache_disk等模块,配置CacheRoot与CacheEnable disk /,并设置CacheIgnoreHeaders Set-Cookie等策略,仅对带合法缓存头的GET/HEAD请求生效。

Apache 本身不直接提供完整的正向代理缓存功能(比如像 Squid 那样原生支持完整 HTTP 缓存策略),但可以通过 mod_cache + mod_proxy 组合,在开启正向代理的前提下,对部分外网响应做简单缓存——前提是目标资源支持缓存(如带 Cache-Control、Expires、Last-Modified 等头),且 Apache 配置正确。
注意:Apache 的正向代理(ProxyRequests On)和缓存(mod_cache)是两个独立模块,需协同配置,且缓存仅对 GET/HEAD 请求生效,不缓存 POST 或带认证的请求。
启用正向代理并启用缓存的关键步骤
✅ 必须加载的模块
在 httpd.conf 中确保以下模块已启用(取消注释或添加):
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_connect_module modules/mod_proxy_connect.so # 支持 HTTPS CONNECT LoadModule cache_module modules/mod_cache.so LoadModule cache_disk_module modules/mod_cache_disk.so # 推荐用磁盘缓存 LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so
⚠️ 注意:
mod_cache_disk是mod_cache的后端实现,必须加载;mod_expires和mod_headers用于控制缓存行为,强烈建议启用。
✅ 开启正向代理基础配置
ProxyRequests On
ProxyVia On
<proxy>
Require ip 192.168.1.0/24 # 替换为你的可信内网段(Apache 2.4+ 语法)
</proxy>
Apache 2.4 起弃用
Order/Deny/Allow,改用Require指令。若仍用 2.2,请用Order deny,allow+Allow from 192.168.1.0/24。
✅ 配置磁盘缓存路径与策略
# 定义缓存根目录(需 Apache 进程有读写权限) CacheRoot "/var/cache/apache2/proxy" CacheEnable disk / CacheDirLevels 5 CacheDirLength 3 CacheIgnoreNoLastMod On CacheIgnoreCacheControl Off # 允许尊重后端的 Cache-Control(推荐设为 Off 以兼容多数外网服务) CacheIgnoreHeaders Set-Cookie # 防止 Cookie 干扰缓存(关键!) CacheMaxFileSize 10485760 # 最大缓存文件 10MB CacheMinFileSize 1 # 最小 1 字节 CacheIgnoreQueryString Off # 默认不忽略 query string;若需去参缓存,设为 On 并配合 CacheIgnoreURLSessionID
? 提示:
CacheIgnoreCacheControl Off表示 Apache 会尊重源站返回的Cache-Control: no-cache或max-age=0,避免缓存不可缓存内容;若想强制缓存(如调试用),可设为On,但不推荐用于生产环境。
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
✅ (可选)增强缓存兼容性
有些外网站点返回 Cache-Control: private 或 no-store,Apache 默认不缓存。如确需缓存,可覆盖响应头:
# 在 <proxy> 或全局作用域中添加
<ifmodule mod_headers.c>
# 移除阻止缓存的响应头
Header unset Cache-Control
Header unset Pragma
Header always set Cache-Control "public, max-age=3600"
</ifmodule></proxy>
⚠️ 此操作违反 HTTP 协议语义,仅限测试或内部可控场景;对外网服务慎用,可能造成数据陈旧或安全风险。
✅ 日志与验证建议
- 开启
cache日志辅助调试:CacheLock on CacheLockMaxAge 5 CacheLockPath /var/cache/apache2/cache-lock
- 查看缓存命中:在
CustomLog中加入%{CACHE_STATUS}e变量,例如:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{CACHE_STATUS}e" combined_with_cache CustomLog logs/access_log combined_with_cache日志中出现
HIT/MISS/REVALIDATE即表示缓存生效。
缓存效果取决于外网资源本身的 HTTP 缓存头是否合理。多数 CDN 或现代网站(如 GitHub、npm registry)会返回强缓存策略,Apache 就能有效复用;而动态接口(如 /api/*)通常禁用缓存,Apache 也不会缓存。
不复杂但容易忽略的是权限与路径配置——确保 CacheRoot 目录存在、属主为 Apache 运行用户(如 www-data 或 apache),且 SELinux/AppArmor(如启用)未拦截写入。











