Nginx 反向代理中的多部分范围

Nginx 反向代理中的多部分范围

我正在尝试将 Nginx 设置为反向代理。上游服务器正在提供一些媒体文件。

由于这些文件的请求量很大,并且这些文件至少在几周内都不会改变,所以我在 Nginx 中缓存上游响应并从缓存中提供所有后续请求。

proxy_cache_path /home/bandc/content levels=1:2 keys_zone=content_cache:10m max_size=10g inactive=15d use_temp_path=off;

upstream mycdn {
    server myserver.dev;
}

location / { 
    proxy_cache content_cache;
    proxy_pass http://mycdn;
    proxy_cache_methods GET HEAD;
    proxy_cache_valid 200 302 7d;
    proxy_cache_valid 404    10m;
    add_header x-cache $upstream_cache_status;
    ....
}

客户端可以发送Range大型媒体文件的请求。上游服务器支持范围请求。

问题是,如果我在发送任何GET或单个Range请求之前发送具有多个字节范围的请求(即,在此多字节范围请求之前尚未缓存响应),则 Nginx 将使用200 OK而不是使用传递整个文件206 Partial Content。 但是,一旦内容被缓存,所有多部分范围请求都可以流畅地工作。

我环顾四周,发现这篇博文

NGINX 如何处理字节范围请求?如果文件在缓存中是最新的,则 NGINX 会接受字节范围请求并仅向客户端提供该项目的指定字节。如果文件未缓存或过时,则 NGINX 会从源服务器下载整个文件。如果请求的是单个字节范围,则 NGINX 会在下载流中遇到该范围后立即将其发送给客户端。如果请求指定同一文件中的多个字节范围,则 NGINX 会在下载完成时将整个文件传送给客户端

有什么方法可以确保如果文件尚未缓存,则应单独从上游提供多部分范围(无需缓存),并在 Nginx 缓存它之后从本地缓存提供,GET或者Range执行单个字节范围的请求?

答案1

我认为你应该使用方法缓存锁本指南中提到。这将允许多个字节范围或完整文件。还有一种替代的缓存切片方法,但由于您的内容确实发生了变化,因此在这种情况下这不是一个好的选择。

proxy_cache_path /tmp/mycache keys_zone=mycache:10m;

server {
listen 80;

proxy_cache mycache;

slice              1m;
proxy_cache_key    $host$uri$is_args$args$slice_range;
proxy_set_header   Range $slice_range;
proxy_http_version 1.1;
proxy_cache_valid  200 206 1h;

location / {
    proxy_pass http://origin:80;
}

}

相关内容