Я пытаюсь настроить 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;
}
}