Nginx 不支持多节点原生共享缓存,proxy_cache 为本地缓存;实现集中式缓存需用 Redis(推荐 lua-resty-redis)、Memcached 或 CDN 替代,避免 NFS 共享等不安全方案。

Nginx 本身不支持多节点间原生共享缓存,它的 proxy_cache 是本地磁盘或内存缓存,各节点独立。要实现“多台边缘 Nginx 共享同一个集中式缓存”,本质是绕过本地缓存,把缓存逻辑下沉到统一后端——即用外部可共享的缓存系统(如 Redis、Memcached 或专用缓存服务)替代 Nginx 内置缓存。
用 Redis 作为集中式缓存层
这是最常用且可控的方案:Nginx 通过 ngx_http_redis2_module(需编译)或更推荐的 lua-resty-redis(配合 OpenResty)在请求阶段主动查 Redis,命中则直接返回;未命中则转发上游并写入 Redis。
- 需使用 OpenResty(含 Lua 支持),而非原生 Nginx
- 缓存键建议包含 Host、URI、Accept-Encoding、Cookie(按需)等关键变量,避免缓存污染
- 响应体较大时,Redis 存储成本高,适合中小响应(如 HTML、JSON、API 返回);大文件(如图片、视频)建议用 CDN 或对象存储 + ETag/Last-Modified 配合 Nginx 的
proxy_cache_use_stale
用 Memcached 替代(轻量级选择)
如果已有 Memcached 集群且对 TTL 和简单 key-value 满足要求,可用 ngx_http_memcached_module(Nginx 官方模块)直接对接。
- 配置简单,无需 Lua,但只支持 GET 请求,且无法处理带 Cookie 或动态头的复杂缓存策略
- Memcached 不持久、无集群一致性保障,适合读多写少、容忍短暂不一致的场景
- 注意设置合理的
memcached_pass和memcached_buffer_size,避免响应截断
不推荐:试图“同步”多个 Nginx 的 proxy_cache
有人尝试用 NFS 或 GlusterFS 挂载同一块缓存目录,让多个 Nginx 节点共用 proxy_cache_path。这在实践中问题很多:
- Nginx 缓存文件结构非并发安全,多进程/多实例同时读写易损坏索引或缓存项
- 锁机制缺失,
proxy_cache_lock只作用于单机,跨节点无效 - I/O 延迟高,网络文件系统性能远低于本地 SSD,反而拖慢响应
补充:CDN + Nginx 边缘协同方案
若目标是降低源站压力和加速用户访问,更现实的做法是:让 Nginx 边缘节点专注做 SSL 终止、路由、限流、日志等,而将缓存职责交给专业 CDN(如 Cloudflare、阿里云 CDN、Fastly),它们天然支持全局缓存共享与智能驱逐。
- Nginx 只需配置
proxy_cache_bypass和proxy_no_cache控制是否透传请求给 CDN - 通过
Cache-Control、Surrogate-Control等响应头与 CDN 协同缓存策略 - 源站返回时带上
X-Cache或X-Cache-Hits便于排查缓存路径


















