Nginx通过ngx_http_slice_module实现大文件分片回源与缓存,需配置slice指令、proxy_cache_key含$slice_range、支持206响应及Content-Range头透传。

要让 Nginx 在回源大文件时自动分片拉取、分片缓存并高效转发,核心是启用并正确配置 ngx_http_slice_module(Nginx 内置模块,无需额外编译,1.9.8+ 默认可用)。它不负责客户端上传分片,而是将一个大响应体按固定大小切分成多个子请求回源,再拼装返回——这对 CDN 边缘节点缓存大静态资源(如视频、镜像包、安装器)非常关键。
启用 slice 模块并配置基础分片回源
该模块必须配合 proxy_cache 使用,且只对 proxy_pass 响应生效。关键点:
- 在
http或server块中定义缓存区域(proxy_cache_path),确保inactive足够长(如inactive=24h),避免分片被过早清理; - 在
location中启用slice指令,并设置合理分片大小(如slice 1m;表示每片 1MB); -
proxy_cache_key必须包含$slice_range,否则所有分片会写入同一个缓存 key,导致覆盖或命中失败; - 需显式添加
Range和Content-Range头处理逻辑,Nginx 不自动透传原始响应头。
完整可运行的分片回源配置示例
以下配置实现:对 /downloads/ 下所有文件启用 1MB 分片回源 + 缓存,支持断点续传与并发拉取:
proxy_cache_path /var/cache/nginx/slice levels=1:2 keys_zone=slice_cache:100m inactive=24h max_size=50g;
<p>server {
listen 80;
server_name example.com;</p><pre class="brush:php;toolbar:false;">location ^~ /downloads/ {
# 启用分片,每片 1MB
slice 1m;
# 回源地址(源站)
proxy_pass https://origin.example.com$uri$is_args$args;
# 关键:缓存 key 必须含 $slice_range
proxy_cache_key "$scheme$proxy_host$uri$is_args$args$slice_range";
# 启用该缓存区
proxy_cache slice_cache;
# 缓存有效时间(按状态码区分)
proxy_cache_valid 200 206 12h;
proxy_cache_valid 404 1m;
# 允许缓存 206(Partial Content)
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
# 透传 Range 请求头,并让后端识别
proxy_set_header Range $http_range;
proxy_set_header X-Slice-Range $slice_range;
# 正确处理 206 响应头(关键!)
proxy_ignore_headers X-Accel-Redirect;
proxy_hide_header ETag;
proxy_hide_header Last-Modified;
# 强制添加 Accept-Ranges,告知客户端支持分片
add_header Accept-Ranges bytes;
add_header X-Cache-Status $upstream_cache_status;
}}
为什么必须处理 206 响应与 Range 头?
当客户端发起 Range: bytes=0-1048575 请求时,Nginx 会用 $slice_range(如 bytes=0-1048575)构造子请求回源。源站若返回 206 响应,Nginx 需确保:
- 不丢弃
Content-Range头(默认可能被隐藏),需用proxy_hide_header显式放行或不屏蔽; - 不强制重写
Content-Length(分片响应长度 ≠ 原始文件长度),应保留源站返回的实际值; - 客户端看到的是标准 206 +
Content-Range,才能继续发下一个Range请求,实现无缝续传。
验证与调优建议
部署后可通过 curl 验证行为:
-
curl -I http://example.com/downloads/big.zip→ 应返回Accept-Ranges: bytes; -
curl -H "Range: bytes=0-1023" http://example.com/downloads/big.zip -i→ 应返回206及正确Content-Range; - 检查
/var/cache/nginx/slice/目录下是否生成多级哈希目录及分片文件(如c/2a/xxx),确认缓存已分片落盘。
调优重点:分片大小不宜过小(增加回源请求数)或过大(降低并发粒度),1–5MB 是常见平衡点;缓存路径 max_size 需预留足够空间容纳全部分片;若源站不支持 Range,此方案无效,需先确保源站兼容。

















