我正在尝试将 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;
}
}