Django 如何强制nginx将响应保存在缓存文件夹中,并使用来自上游服务器的头文件?

Django 如何强制nginx将响应保存在缓存文件夹中,并使用来自上游服务器的头文件?,django,caching,nginx,Django,Caching,Nginx,我的API使用Django REST框架,nginx作为反向代理,redis用于缓存一些静态API数据。 我试图用缓存控制:max age和Last Modify头实现缓存。 简而言之,它看起来是这样的: class SomeViewSet(viewsets.ModelViewSet): .... def list(self, request, *args, **kwargs): queryset = self.get_queryset() cac

我的API使用Django REST框架,nginx作为反向代理,redis用于缓存一些静态API数据。
我试图用
缓存控制:max age
Last Modify
头实现缓存。
简而言之,它看起来是这样的:

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秒,当数据过期时,客户端将使用
检查内容(如果自
标题修改)。
但我认为,当我设置
max age
headers时,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如何确定是否缓存某些内容?
默认情况下,NGINX尊重源服务器的缓存控制头。它不会缓存将“缓存控制”设置为“专用”、“无缓存”或“无存储”的响应,也不会在响应标头中设置为“Cookie”。NGINX仅缓存GET和HEAD客户端请求。您可以按照以下答案中的说明覆盖这些默认值

我认为
缓存控制:max age
头将强制nginx将json保存在缓存文件夹中。
文件夹已创建,但此处没有数据,来自不同浏览器的所有请求都会访问服务器。

我错过了什么?或者我完全误解了nginx缓存的概念

首先,在标题中添加
缓存控件:max age
不会告诉nginx使用它做任何事情。客户机管理如何处理标头以及如何处理后续请求

您可能需要的是针对url的nginx响应缓存。您的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缓存模块


请看这里

谢谢!缓存现在可以保存,但是如果所有新客户端都访问上游服务器,那么缓存的意义何在?对不起,如果我完全误解了一个概念。我所想的是
新客户机来了->点击服务器->nginx保存缓存120秒->客户机得到响应
,然后在120秒后,所有调用该资源的新客户机都从nginx缓存中得到响应。我认为
反向代理
正是我上面描述的意思。这是预期的行为。不,我在视图中打印了代码,以确保服务器正在运行。当我在Chrome中提供第一个请求时,服务器会命中,然后Chrome中的下一个请求不会命中服务器。但当我在
max age
未过期的情况下从Firefox发送请求时,服务器会再次受到攻击。您能否查看wsgi忽略头
uwsgi\u忽略头“变化”似乎使它正常工作,非常感谢。但我并没有得到一个答案,“首先,添加缓存控件:头中的max age不会告诉nginx使用它做任何事情”。如果没有提供的头,nginx将不会将来自该资源的数据保存到缓存中。