Nginx proxy_cache默认不缓存206响应,仅缓存200全量响应;需配置proxy_cache_valid 206 0s禁用分片缓存,并配合max_size、inactive及sendfile优化大文件代理。

Nginx 的 proxy_cache 在代理大文件(如安装包、视频、镜像等,通常 100MB–10GB 级别)时,并不会默认缓存整个响应体,尤其当后端返回的是 206 Partial Content(Range 请求)时,缓存行为与普通 200 OK 响应有本质区别。理解这一点,是避免“缓存失效”“重复回源”或“磁盘爆满”的关键。
proxy_cache 对大文件的缓存逻辑
Nginx 的 proxy_cache 默认只缓存 完整响应(status 200),而对 206 响应默认不缓存(除非显式配置)。这是因为:
-
206是分片响应,同一资源可能被多个 Range 请求命中不同字节段,缓存键(proxy_cache_key)若未包含Range头,会导致冲突或覆盖; - 缓存一个 5GB 文件的全部内容,会占用巨大磁盘空间且难以管理;
- 大文件下载常伴随长连接、超时、断点续传,缓存中间状态易引发一致性问题。
因此,Nginx 的实际策略是:
✅ 缓存首次 200 响应(全量内容),后续相同 URL 的 200 请求可直接 HIT;
❌ 默认忽略 206 响应,不写入缓存(即使配置了 proxy_cache_valid 206 ...,也需额外配合);
⚠️ 若客户端发起 Range 请求,Nginx 会先检查是否已有完整的 200 缓存 —— 若有,就从中截取对应字节段并返回 206;若无,则回源并不缓存该 206 流。
这个机制依赖两个前提:
- 后端支持
Accept-Ranges: bytes和ETag/Last-Modified; - Nginx 配置中未禁用
proxy_cache_revalidate或强制 bypass。
如何让 proxy_cache 安全支撑大文件代理
显式控制 200 与 206 的缓存策略
proxy_cache dl_cache; proxy_cache_valid 200 7d; # 全量响应缓存 7 天 proxy_cache_valid 206 0s; # 明确禁止缓存 206 分片响应(推荐) proxy_cache_use_stale error timeout updating http_500; proxy_cache_revalidate on; # 支持条件请求验证,避免陈旧缓存
⚠️ 注意:
proxy_cache_valid 206 0s不是“缓存 0 秒”,而是完全不缓存该状态码响应。这是官方推荐做法。
CPA Update - Secure CLI Proxy API Maintenance下载安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
防止缓存污染与磁盘失控
- 设置合理
max_size和inactive:proxy_cache_path /var/cache/nginx/dl levels=1:2 keys_zone=dl_cache:50m max_size=50g inactive=30d use_temp_path=off;-
max_size=50g防止单一大文件占满整个缓存区; -
inactive=30d表示 30 天内未被访问的缓存自动清理(哪怕未过期); -
use_temp_path=off避免临时文件拷贝,提升大文件写入效率。
-
配合 sendfile 和缓冲区优化传输体验
虽然 proxy_cache 管理的是磁盘副本,但实际返回给客户端时,Nginx 会优先使用 sendfile 直接从缓存文件发送,无需用户态读取:
location /download/ {
proxy_cache dl_cache;
proxy_pass https://backend/files/;
# 关键:启用零拷贝 + 合并包
sendfile on;
tcp_nopush on;
tcp_nodelay off;
# 防止因大文件导致超时中断
proxy_read_timeout 3600;
proxy_send_timeout 3600;
proxy_buffering off; # 对大文件建议关闭缓冲,避免内存堆积
}✅
proxy_buffering off表示 Nginx 不缓存整个响应体到内存/临时文件,而是边收边转 —— 这对206场景更安全;但注意:它不影响200的磁盘缓存行为,proxy_cache仍照常工作。
不要混淆:proxy_cache vs 浏览器缓存 vs open_file_cache
| 类型 | 作用对象 | 是否影响大文件下载 | 说明 |
|---|---|---|---|
proxy_cache |
Nginx 本地磁盘(反向代理层) | ✅ 是,决定是否缓存全量 200
|
是服务端缓存,需主动管理路径与清理 |
expires / Cache-Control
|
用户浏览器(客户端层) | ✅ 是,影响下次是否发新请求 | 应设为长期(如 1y + immutable),减少重复拉取 |
open_file_cache |
Nginx 内存中的文件元数据(如 inode、mtime) | ⚠️ 间接相关 | 加速对已缓存大文件的 stat 操作,降低 I/O 开销 |
不复杂但容易忽略。


















