nginx在https下稳定返回大视频分片需五者协同:客户端发range请求、nginx启用http/1.1并配置slice+缓存键含$slice_range、后端真实支持206、https证书链完整、调大proxy缓冲区防截断。

要让Nginx在HTTPS环境下稳定返回大视频文件的分片响应(206 Partial Content),关键不是“加个slice就行”,而是客户端请求、Nginx代理行为、后端能力、缓存策略和HTTPS传输层五者严丝合缝。常见白屏、加载中断、反复重试等问题,90%源于其中一环断裂。
确保HTTPS链路本身不破坏Range语义
HTTPS本身不干扰Range,但配置不当会间接导致206失效:
- 必须启用HTTP/1.1:在location中加proxy_http_version 1.1;,否则Nginx可能降级为HTTP/1.0,无法正确处理Range头
- 清理连接干扰头:proxy_set_header Connection "";,避免上游或中间设备因Connection: close等头误判连接状态
- 证书链必须完整:Android、curl、部分播放器无法自动补全中间CA,若证书链断裂,TLS握手失败,根本发不出Range请求——用openssl s_client -connect your.com:443 -showcerts验证是否返回多张证书
启用slice并强制分片回源与缓存
slice模块只对proxy_pass生效,且必须配合缓存使用:
- 在location中设置切片大小,例如slice 2m;(视频建议2–5MB,兼顾并发与单次IO)
- 把Nginx生成的区间注入后端:proxy_set_header Range $slice_range;
- 缓存键必须唯一区分每一片:proxy_cache_key "$scheme$proxy_host$uri$is_args$args$slice_range";(漏掉$slice_range会导致所有片写入同一缓存项,后续206全部命中错误内容)
- 显式允许206进缓存:proxy_cache_valid 200 206 24h;
调大缓冲区,避免HTTPS下206响应被截断
HTTPS加解密消耗CPU,加上大视频分片响应体长,极易触发默认缓冲区溢出,导致响应不完整、浏览器报“net::ERR_INCOMPLETE_CHUNKED_ENCODING”:
- 增大响应头缓冲:proxy_buffer_size 128k;
- 扩大响应体缓冲池:proxy_buffers 32 256k;(总容量达8MB)
- 控制繁忙时可发送上限:proxy_busy_buffers_size 256k;
- 禁用临时文件写入(可选):proxy_max_temp_file_size 0;,强制全程走内存,降低I/O延迟
后端与客户端协同要点
Nginx不主动预热,一切由请求驱动:
- 后端必须真实支持206:返回Content-Range: bytes 0-2097151/10485760且带Accept-Ranges: bytes头;静态服务(如Nginx源站、S3、OSS)通常原生支持,自研接口需手动实现Range解析
- 客户端需发Range请求:现代H5播放器、curl -H "Range: bytes=0-2097151"、wget -c、aria2c均天然支持;普通浏览器直接访问URL默认发完整GET,Nginx仍会内部按slice分片回源,但对外返回200
- 禁用proxy_buffering off;:该指令会彻底关闭slice功能,务必保持默认on











