小杰的小窝
  • 关于我
  • 作品集
  • 技术笔记
  • 生活随笔
  • 找我聊聊
小杰的小窝
© 2026 Liu Jie·蜀ICP备2026002183号-1
返回博客

使用 Docker + Nginx 网关层实现第三方静态资源的永久缓存

2026-01-155分钟
架构

在现代 Web 架构中,Nginx 往往并不直接承载业务逻辑,而是作为 统一入口(Gateway) 存在:

  • 反向代理后端服务
  • 承载 HTTPS
  • 处理静态资源
  • 做缓存与限流

一个常见但容易被忽略的问题是:

**如何稳定、可控地缓存第三方静态资源?**

这些资源可能包括:

  • 图片
  • 音频 / 视频
  • 字体文件
  • 前端构建产物
  • 第三方 CDN 资源

本文将介绍一种 通用、与业务无关 的解决方案: 在 Docker 环境中,通过 Nginx 网关层,对第三方静态资源进行持久化缓存。


一、问题背景

如果前端直接请求第三方资源:

https://third-party-cdn.com/assets/xxx.woff2

会存在以下问题:

  • 请求完全绕过自己的服务器
  • 无法统一缓存策略
  • 第三方不稳定会直接影响页面
  • 无法主动清缓存
  • 多项目场景下无法隔离

二、核心设计思想

1️⃣ 所有资源请求必须经过自己的网关

Browser
 ↓
Nginx Gateway(Docker)
 ↓
Third-party resource

2️⃣ Nginx 负责三件事

  • 路径路由
  • 磁盘缓存
  • 缓存头控制

前端永远只访问自己的域名,真实资源来源由 Nginx 决定。


三、浏览器缓存是如何工作的?

浏览器缓存基于 HTTP 响应头:

Cache-Control: public, max-age=31536000, immutable

含义是:

指令 含义
public 可被浏览器和中间代理缓存
max-age 在多少秒内不重新请求
immutable 内容不会变,禁止 revalidate

结果是:

  • 浏览器直接使用本地缓存
  • 不发起 HTTP 请求
  • 性能最好

⚠️ 但问题是:

**浏览器缓存无法跨用户、无法主动清理、无法兜底**

四、为什么还需要 Nginx 缓存?

Nginx 缓存的是:HTTP 响应本身

  • 缓存在磁盘
  • 多用户共享
  • 可以主动删除
  • 不依赖浏览器行为

即使:

  • 用户清了浏览器缓存
  • 换了设备
  • 浏览器不支持强缓存

Nginx 依然可以兜底返回缓存内容。


五、Nginx proxy_cache 的工作原理

两层结构

1️⃣ 内存区(keys_zone)

  • 存储 URL → 缓存文件映射
  • 命中判断在内存中完成
  • 速度极快

2️⃣ 磁盘区(cache path)

  • 存储真实响应内容
  • 可持久化
  • 可被手动删除
请求 URL
 ↓
内存 keys_zone(是否命中)
 ↓
磁盘 cache(读取文件)
 ↓
返回响应

六、通用 Nginx 缓存配置示例

nginx.conf(定义缓存区)

proxy_cache_path /var/cache/nginx/static
  levels=1:2
  keys_zone=static_cache:100m
  max_size=50g
  inactive=365d;

server 配置

location ^~ /assets/ {
  proxy_pass https://third-party-cdn.com/;

  proxy_cache static_cache;
  proxy_cache_valid 200 301 302 365d;
  proxy_cache_lock on;

  expires 1y;
  add_header Cache-Control "public, max-age=31536000, immutable" always;
}

这段配置:

  • 与文件类型无关
  • 只要请求命中 /assets/
  • 成功响应就会被缓存

七、Docker 场景下的缓存持久化

volumes:
- ./nginx/cache:/var/cache/nginx

这样可以做到:

  • 容器重启缓存不丢失
  • 可项目级划分子目录
  • 支持手动清理

八、多项目 / 多缓存区设计

proxy_cache_path /var/cache/nginx/app1 keys_zone=app1_cache:50m;
proxy_cache_path /var/cache/nginx/app2 keys_zone=app2_cache:50m;

优点:

  • 缓存完全隔离
  • 可以单独清理
  • 不影响其他项目

九、这种方案适合什么场景?

✅ 第三方静态资源 ✅ 私有 CDN ✅ 字体 / 音频 / 图片 ✅ 多项目共用网关 ✅ Docker / K8s 网关层

不适合:

❌ 强实时数据 ❌ 用户私有内容 ❌ 带鉴权的接口响应


十、总结

  • 浏览器缓存解决“单用户性能”

  • Nginx 缓存解决“系统级稳定性”

  • Nginx 缓存的是 HTTP 响应,而不是文件类型

  • 路径是缓存策略的边界

  • Docker 挂载目录让缓存持久化成为可能

    当 Nginx 位于架构入口时,它天然就是最合适的缓存层。

觉得有用的话,分享给朋友吧