2017-02-15 14 views
2

Я использую 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?

ответ

1

Первый вызов, который вы добавляете в заголовок Cache-Control: max-age, не говорит nginx ничего с ним делать. Клиент управляет тем, что делать с заголовком и как обрабатывать последующие запросы.

Что такое, вероятно, кеширование ответа nginx для URL-адреса. Не вижу проблемы с вашей конфигурацией nginx как таковой.

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

location/{ 

    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; 

    uwsgi_cache my_cache; 
    uwsgi_pass django; 
} 

И с этого момента вам нужно использовать uwsgi cache module.

См. Здесь http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html

+0

Спасибо! кеш сохраняет сейчас, но какова точка этого кеша, если все новые клиенты попадают в восходящий сервер? Извините, если я полностью не понимаю концепцию. То, что я думал, будет «Новый клиент пришел -> ударил сервер -> nginx сохраняет кеш на 120 секунд -> клиент получает ответ», а затем в 120 секунд все новые клиенты, которые вызывают этот ресурс, получают его из кеша nginx. Я думал, что «обратный прокси» означает то, что я описал выше. –

+0

Это ожидаемое поведение. Вы не видите то же самое. –

+0

нет, я напечатал код, на мой взгляд, наверняка, что сервер бьет. Когда я обслуживаю первый запрос в Chrome, удаляет сервер, а затем следующие запросы в Chrome не попадают на сервер. Но когда я отправляю запрос от Firefox, пока 'max-age' не истекает, сервер снова попадает. –

 Смежные вопросы

  • Нет связанных вопросов^_^