nginx原生不支持按range切片缓存;slice模块仅用于分片代理请求,不影响proxy_cache的缓存粒度;优化大文件缓存需关闭proxy_buffering、启用proxy_cache_lock、缩短inactive时间并强制添加cache-control头。

直接说结论:Nginx 原生不支持“缓存切片”(如 HTTP Range 请求的按块缓存),slice 模块仅用于分片请求代理,不能替代或增强 proxy_cache 的缓存粒度;真正优化大文件缓存,靠的是关闭 proxy_buffering、禁用临时文件、配合 proxy_cache_lock 和合理的 inactive 时间。
为什么 slice 模块不是“缓存切片”工具
很多人看到 slice 就以为能实现“把一个 500MB 视频按 1MB 切块分别缓存”,这是误解。slice 实际作用是:把客户端发来的单个 Range: bytes=0-1048575 请求,拆成多个带 Range 头的子请求发给后端,并合并响应——它发生在 请求转发阶段,和 proxy_cache 完全无关。
-
slice不改变缓存 key:整个资源仍以原始 URI + Host 为 key 缓存,不是按 byte range 分 key -
slice不影响缓存存储:即使开了proxy_cache,Nginx 也不会为每个Range子请求单独存一份缓存文件 - 开启
slice后若未显式配置proxy_cache_bypass或proxy_no_cache,反而可能因多次子请求触发重复回源或缓存锁竞争
大文件缓存必须关掉 proxy_buffering
对视频、安装包等 ≥10MB 的资源,开启 proxy_buffering on 是性能杀手:Nginx 会把整个响应体先收全再发,内存/磁盘压力陡增,还容易超时。正确做法是彻底关闭它,并让缓存行为退回到“流式透传 + 状态头标记”模式:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 在对应
location块中加:proxy_buffering off; - 此时
proxy_buffers、proxy_busy_buffers_size、proxy_max_temp_file_size全部失效,不用调 -
proxy_cache仍可工作,但只缓存响应头(如Content-Length、ETag)和首段响应体(取决于proxy_buffer_size),后续数据流式转发 - 务必同步设置:
proxy_cache_lock on;防止多客户端并发请求同一 Range 时反复回源
proxy_cache_path 的 inactive 时间要设短
大文件访问稀疏且局部(用户通常只看前几分钟),若沿用默认 inactive=60m,会导致大量冷数据长期占满 /var/cache/nginx,磁盘很快写满。实际应激进清理:
- 对视频类资源,建议:
inactive=10m;—— 10 分钟内无访问即淘汰 - 若业务允许,可进一步缩至
inactive=2m;,配合max_size=5g;双保险 -
keys_zone内存大小需匹配:每 1MB keys_zone 约支持 8000 个缓存 key;10 万文件至少配keys_zone=video_cache:128m; - 注意:
inactive不是 TTL,它只管“是否被访问过”,不校验后端内容是否已更新
真正起效的缓存状态头必须加 always
当 proxy_buffering off 时,Nginx 对 Range 请求返回的响应头常被后端覆盖(比如 PHP-FPM 默认不发 Cache-Control),导致浏览器或 CDN 不缓存。必须强制注入:
- 用
add_header Cache-Control "public, max-age=3600" always;——always是关键,否则 Range 响应里根本不会出现该头 - 避免用
expires:它无法控制public或immutable等语义,对大文件分片场景表达力不足 - 验证方式:用
curl -I -H "Range: bytes=0-1023" https://yoursite.com/video.mp4,确认响应含X-Cache-Status: HIT且Cache-Control正确
最易被忽略的一点:切片逻辑和缓存逻辑永远不该混在同一 location。要么用 slice 做纯代理分片(关 cache),要么用 proxy_cache 做整资源缓存(关 buffering),强行揉在一起只会放大超时、锁等待和磁盘 IO 问题。










