Я использую Django REST Framework для моего API, nginx как обратный прокси и redis для кэширования некоторых статических данных api.
Я пытался реализовать кеширование с Cache-Control: max-age
и Last-Modify
заголовков.
В двух словах это выглядит следующим образом:Как я могу заставить nginx сохранять ответ в папке с кешем, с заголовками от восходящего сервера?
class SomeViewSet(viewsets.ModelViewSet):
....
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
cache_key = self._get_cache_key() # get a key for reddis
response = self._get_data_from_cache(cache_key) # get a data from reddis
if response:
# If data in redis return Response with a same Last-Modify
# and 'Cache-Control': 'max-age=120'
return response
# Setting up new value for this viewset in a reddis
serializer = self.get_serializer(queryset, many=True)
now = datetime.datetime.now()
cache.set(cache_key, [now, serializer.data])
return Response(serializer.data, headers={'Last-Modified': now, 'Cache-Control': 'max-age=120'})
Он работает, как я ожидал, кэширование данных браузера в течение 120 секунд, и когда он истекает содержание проверки клиента с If-Modified-Since
заголовком.
Но, хотя я настраиваю заголовки max-age
, nginx сохранит его в папке с кешем и будет обслуживать всех клиентов, не ударяя по серверу.
вот мой тестирование Nginx конфигурации с локальной машины:
upstream django {
server 127.0.0.1:8002;
}
proxy_cache_path /home/ivan/projects/kors/test_prod/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 8000;
server_name 127.0.0.1; #
charset utf-8;
client_max_body_size 75M;
location /media {
alias /path/to/media;
expires 1y;
log_not_found off;
access_log off;
}
location /static {
alias /path/to/static;
expires 1y;
log_not_found off;
access_log off;
}
location/{
uwsgi_pass django;
include /path/to/uwsgi_params;
uwsgi_param Host $host;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
proxy_cache my_cache;
}
}
Рассмотрим эту статью nginx-caching-guide.
Как NGINX определяет, что-то или не нужно что-то забыть?
По умолчанию NGINX уважает заголовки Cache-Control от исходных серверов. Он не кэширует ответы с помощью Cache-Control в Private, No-Cache или No-Store или с Set-Cookie в заголовке ответа. NGINX только кэширует запросы клиентов GET и HEAD. Вы можете переопределить эти значения по умолчанию, как описано в ответах ниже.
Я думал, что заголовок Cache-Contol: max-age
заставит nginx сохранить json в папке с кешированием.
Папка была создана, но здесь нет данных, и все мои запросы из отдельных браузеров попадают на сервер.
Что я пропустил? Или, может быть, я совершенно неправильно понял концепцию кеширования с nginx?
Спасибо! кеш сохраняет сейчас, но какова точка этого кеша, если все новые клиенты попадают в восходящий сервер? Извините, если я полностью не понимаю концепцию. То, что я думал, будет «Новый клиент пришел -> ударил сервер -> nginx сохраняет кеш на 120 секунд -> клиент получает ответ», а затем в 120 секунд все новые клиенты, которые вызывают этот ресурс, получают его из кеша nginx. Я думал, что «обратный прокси» означает то, что я описал выше. –
Это ожидаемое поведение. Вы не видите то же самое. –
нет, я напечатал код, на мой взгляд, наверняка, что сервер бьет. Когда я обслуживаю первый запрос в Chrome, удаляет сервер, а затем следующие запросы в Chrome не попадают на сервер. Но когда я отправляю запрос от Firefox, пока 'max-age' не истекает, сервер снова попадает. –