apache中mod_proxy缓存外部api需搭配mod_cache及mod_cache_disk等模块,且完全依赖后端返回的cache-control、expires等http缓存头;缺一不可,否则几乎不命中。

Apache 中用 mod_proxy 实现对外部 API 接口的缓存,核心不是靠代理本身,而是必须搭配 mod_cache 及其存储模块(如 mod_cache_disk),且整个链路严格依赖后端 API 返回的 HTTP 缓存头。不满足条件时,缓存几乎不会命中。
必须启用并串联的关键模块
缺一不可,否则缓存功能无法启动:
-
mod_proxy和mod_proxy_http:负责转发请求到外部 API 服务 -
mod_cache:提供缓存逻辑框架(不存储,只调度) -
mod_cache_disk(或mod_cache_socache):提供实际缓存落盘能力 -
mod_headers(推荐):用于调试或补全响应头,尤其当外部 API 不可控时
典型加载方式(写入 httpd.conf 或启用对应 .load 文件):
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule cache_module modules/mod_cache.so LoadModule cache_disk_module modules/mod_cache_disk.so LoadModule headers_module modules/mod_headers.so
缓存行为完全由后端响应头驱动
mod_cache 默认不缓存任何响应,它只认以下字段:
-
Cache-Control(如public, max-age=600)——最常用、最可靠 -
Expires—— 若存在且时间有效,也可触发缓存 -
Last-Modified或ETag—— 用于后续验证(304 响应),缺失时需显式配置CacheIgnoreNoLastMod On
常见失败原因:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 外部 API 返回
Cache-Control: private或无max-age→ 默认不缓存 - 返回了
Set-Cookie头 → Apache 默认跳过缓存(需加CacheIgnoreHeaders Set-Cookie) - 状态码非 200/301/404 → 不缓存(可配合
CacheIgnoreCacheControl On强制覆盖,但慎用)
关键配置段要与代理路径对齐
缓存指令必须作用于被 ProxyPass 覆盖的路径,而非后端真实路径。例如:
ProxyPass /api/ http://thirdparty.com/v1/ ProxyPassReverse /api/ http://thirdparty.com/v1/
那么缓存应启用在 /api/,而不是 /v1/:
<ifmodule cache_module> CacheRoot "/var/cache/apache2/mod_cache_disk" CacheEnable disk /api/ CacheIgnoreHeaders Set-Cookie CacheIgnoreNoLastMod On CacheMaxExpire 3600 </ifmodule>
注意:CacheRoot 目录需确保 Apache 进程用户(如 www-data)有读写权限,否则日志中会报 (13)Permission denied。
调试与验证建议
上线前建议分步验证:
- 先用简单静态路径测试缓存是否工作,如
CacheEnable disk /static/ - 开启响应头观察:添加
Header set X-Cache "$cache_status" env=cache_status,查看响应中是否出现X-Cache: HIT或MISS - 若外部 API 无法修改响应头,可在代理层临时注入(仅限测试):
Header set Cache-Control "public, max-age=300" env=proxy - 避免直接缓存含敏感信息的接口(如带用户 token 的 GET 请求),必要时用
cache_bypass或no_cache规则排除
不复杂但容易忽略。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










