Nginx的slice模块可以将一个请求分解成多个子请求,每个子请求返回响应内容的一个片段,让大文件的缓存更有效率。。
HTTP Range请求:
HTTP客户端下载文件时,如果发生了网络中断,必须重新向服务器发起HTTP请求,这时客户端已经有了文件的一部分,只需要请求剩余的内容,而不需要传输整个文件,Range请求就可以用来处理这种问题。
如果HTTP请求的头部有Range字段,如下面所示:
表示客户端请求文件的第1025到第2048个字节,这时服务器只会响应文件的这部分内容,响应的状态码为206,表示返回是响应的一部分,如果服务器不支持Range请求,仍然会返回整个文件,这是状态码200。
实现原理:
客户端请求100个字节,起始于150,请求内容的范围是150-249。发到nginx之后根据slice配置,比如配置为100,那么就是0-100,100-200,200-300,这样就分为了3块,但是最终这个文件有多大就切分为多少块。之后nginx就会构造两个请求,第一个请求时100-199,然后第二个请求时200-300的。这两个请求返回之后会生成两个文件,第一个100-199,200-299。然后将其组合起来生成客户端要的150-249这样一个响应。
过程总结:以客户端向nginx请求一个10M文件,nginx进行4m的切片为例
-
客户端向nginx请求10M;
-
nginx发起第一个切片(主请求)请求range:0-4194303;
-

Nginx的slice模块通过将大文件请求分解为多个子请求,提高缓存效率,支持HTTPRange请求,允许客户端断点续传。当文件被切片,每个子请求的内容会被缓存为独立文件,即使源连接断开,已缓存的部分仍可使用。然而,若文件过大或切片过小可能导致文件描述符耗尽。启用slice需要配置slicesize,配合proxy_cache_key和proxy_set_headerRange来实现。
最低0.47元/天 解锁文章
1480

被折叠的 条评论
为什么被折叠?



