Назад | Перейти на главную страницу

Составные диапазоны в обратном прокси 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 запрос с однобайтовым диапазоном выполняется?

Я думаю, вам стоит использовать метод Блокировка кеша упомянутые в этом руководстве. Это позволит использовать несколько диапазонов байтов или полный файл. Существует альтернативный метод нарезки кеша, но, поскольку ваш контент действительно изменяется, в данном случае это не лучший выбор.

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;
}

}