proxy_store实现按需镜像:首次请求回源拉取并落盘,后续命中直接读本地文件;依赖if (!-e $request_filename)判断、root/alias指定路径、proxy_store on开启写入,需预建目录并设权限。

用 proxy_store 实现按需镜像,核心是“首次请求拉取并落盘,后续命中直接读本地文件”,它不依赖缓存管理逻辑,而是靠文件系统是否存在来判断是否回源。
明确配置结构与关键指令作用
proxy_store 本身不是反向代理,也不做缓存调度,只负责把 proxy_pass 返回的成功响应(如 200、206)原样写入磁盘。真正实现“按需”逻辑的是 if (!-e $request_filename) 这个条件判断:
-
root /data/mirror或alias /data/mirror决定本地路径根目录,$request_filename会自动拼出完整路径(如请求/img/logo.png→ 落盘为/data/mirror/img/logo.png) -
proxy_store on开启落盘行为,仅在proxy_pass成功时触发 -
proxy_store_access user:rw group:rw all:rw确保 Nginx worker 进程对目标目录有写权限 -
proxy_temp_path可省略(现代 Nginx 版本中非必需),但若指定,需确保其父目录存在且可写
只对静态资源启用,避免误伤动态内容
不要在 location / 这类宽泛匹配下全局开启 proxy_store,否则 HTML、API 接口等动态响应也可能被写入磁盘,造成路径冲突或安全风险。推荐按后缀精准匹配:
- 例如镜像图片:
location ~* \.(gif|jpg|jpeg|png|webp|ico|svg)$ - 若还需镜像 JS/CSS:
location ~* \.(js|css|woff2?|ttf|eot)$ - 每个
location块内独立配置root和if (!-e ...),互不影响
确保路径可写且目录预先创建
Nginx 不会自动创建缺失的父目录。比如设了 root /data/mirror,当请求 /a/b/c.jpg 时,必须保证 /data/mirror/a/b/ 目录已存在,否则落盘失败,后续请求仍会反复回源:
- 提前执行:
mkdir -p /data/mirror/{img,css,js} - 设置权限:
chown -R nginx:nginx /data/mirror(假设 worker 用户为 nginx) - 验证写入:
sudo -u nginx touch /data/mirror/test.txt看是否成功
配合 expires 和 header 提升客户端体验
本地文件被直接读取时,Nginx 默认不会自动加 Expires 或 Cache-Control,需手动配置以减少重复请求:
- 在 location 块中加:
expires 7d;(浏览器端缓存 7 天) - 加标识头便于调试:
add_header X-Cached-By "proxy_store"; - 禁用上游压缩干扰:
proxy_set_header Accept-Encoding "";,防止 gzip 内容被误存为二进制乱码文件
不校验更新,适合低频变更场景
proxy_store 是“一次写入、长期服务”模式:文件一旦落地,就不会主动检查源站是否更新,也不会过期失效。这正适合静态资源(如 logo、图标、文档 PDF)基本不变的场景:
- 如需强制刷新某文件,手动删除本地对应路径即可,下次请求自动重建
- 不建议用于频繁更新的内容(如带时间戳的 JS bundle),否则需额外脚本定期清理
- 无需 purge 接口或缓存管理后台,运维更轻量


















