在现代 Web 架构中,Nginx 往往并不直接承载业务逻辑,而是作为 统一入口(Gateway) 存在:
一个常见但容易被忽略的问题是:
**如何稳定、可控地缓存第三方静态资源?**
这些资源可能包括:
本文将介绍一种 通用、与业务无关 的解决方案: 在 Docker 环境中,通过 Nginx 网关层,对第三方静态资源进行持久化缓存。
如果前端直接请求第三方资源:
https://third-party-cdn.com/assets/xxx.woff2
会存在以下问题:
Browser
↓
Nginx Gateway(Docker)
↓
Third-party resource
前端永远只访问自己的域名,真实资源来源由 Nginx 决定。
浏览器缓存基于 HTTP 响应头:
Cache-Control: public, max-age=31536000, immutable
含义是:
| 指令 | 含义 |
|---|---|
| public | 可被浏览器和中间代理缓存 |
| max-age | 在多少秒内不重新请求 |
| immutable | 内容不会变,禁止 revalidate |
结果是:
⚠️ 但问题是:
**浏览器缓存无法跨用户、无法主动清理、无法兜底**
即使:
Nginx 依然可以兜底返回缓存内容。
请求 URL
↓
内存 keys_zone(是否命中)
↓
磁盘 cache(读取文件)
↓
返回响应
proxy_cache_path /var/cache/nginx/static
levels=1:2
keys_zone=static_cache:100m
max_size=50g
inactive=365d;
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/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 位于架构入口时,它天然就是最合适的缓存层。
觉得有用的话,分享给朋友吧