nginx slice模块在cdn中发挥价值需与proxy_cache严密协同:将大文件按1mb分片、独立缓存、按需回源、并发组装。必须满足五个前提——编译含--with-http_slice_module、仅限location块配置、搭配proxy_pass使用、后端支持accept-ranges和range请求、客户端带range头;核心配置缺一不可:proxy_set_header range $slice_range、proxy_cache_key含$slice_range、启用http/1.1;缓存策略须同时覆盖200/206响应、开启cache_lock、合理设置cache_path,且禁用proxy_buffering。

要让 Nginx 的 slice 模块在 CDN 场景下真正发挥价值,关键不是单独启用模块,而是把它和 proxy_cache 严密协同——把一个几 GB 的视频或安装包,拆成 1MB 一片、独立缓存、按需回源、并发组装,才能扛住突发流量又不压垮源站。
必须满足的五个硬性前提
slice 模块不会自动生效,缺一不可:
-
nginx 编译时含
--with-http_slice_module(主流发行版通常默认开启,可用nginx -V 2>&1 | grep http_slice验证) - 配置只能写在
location块内,http或server级别无效 - 必须搭配
proxy_pass使用;静态服务(root/alias)不走 slice 流程 - 后端必须响应
Accept-Ranges: bytes,且能正确处理Range: bytes=x-y请求(如标准 Web 服务器、OSS、S3、兼容 RFC 7233 的 API) - 客户端请求需自带
Range头(例如下载器、播放器发起的分段请求),普通 GET 不触发切片
核心配置三要素(少一个就失效)
只写 slice 1m 是没用的。以下三项必须同时存在:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
传递分片范围:用
proxy_set_header Range $slice_range;,让每个子请求精准携带如bytes=0-1048575的头 -
区分缓存键:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args$slice_range";,确保每一片单独缓存,避免覆盖或错乱 -
启用 HTTP/1.1 协议栈:加
proxy_http_version 1.1;和proxy_set_header Connection "";,因为Range是 HTTP/1.1 特性,且需清除连接头防复用干扰
缓存策略必须适配分片逻辑
没有缓存,slice 反而增加延迟——每次请求都触发多轮回源,带宽压力不降反升:
- 缓存有效期需同时覆盖
200(整文件)和206(分片)响应:proxy_cache_valid 200 206 1h; - 建议开启缓存锁:
proxy_cache_lock on;,防止相同分片的并发请求穿透到后端 - 缓存路径需合理规划,例如:
proxy_cache_path /var/cache/nginx/slice levels=1:2 keys_zone=slice_cache:100m inactive=3h max_size=50g; - 禁用
proxy_buffering off—— 它会直接禁用 slice 功能,二者不兼容
CDN 架构下的典型部署示意
适用于边缘节点缓存大文件(如 MP4、ISO、ZIP):
location /media/ {
slice 1m;
proxy_cache slice_cache;
proxy_cache_valid 200 206 1h;
proxy_cache_key "$scheme$request_method$host$uri$is_args$args$slice_range";
proxy_cache_lock on;
proxy_set_header Range $slice_range;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass https://origin-server$uri$is_args$args;
}
这样配置后,一个 2GB 视频首次被请求某一段(如 Range: bytes=10000000-19999999),Nginx 自动拆成两个 1MB 子请求回源,缓存两片;后续同类请求直接从本地磁盘读取并组装返回,源站零压力。










