我如何强制nginx将caching文件夹中的响应保存在上游服务器的头文件中?

我使用Django REST Framework作为我的API,nginx作为反向代理,redis用于caching一些静态api数据。
我试图通过Cache-Control: max-age实现cachingCache-Control: max-ageLast-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'}) 

它像我所期望的那样工作,浏览器caching数据达120秒,并在客户端检查内容时使用If-Modified-Since标题。
但是,当我设置max-age标题时,nginx会将它保存在一个caching文件夹中,并且将在不碰到服务器的情况下提供所有客户端。
这里是我从本地机器testingnginxconfiguration:

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

考虑这篇文章nginxcaching指南 。

NGINX如何确定是否caching某些内容?
默认情况下,NGINX尊重源服务器的Cache-Control头。 它不cachingcaching控制设置为专用,无caching或无存储或响应头中的Set-Cookie响应。 NGINX只cachingGET和HEAD客户端请求。 您可以覆盖这些默认值,如下面的答案中所述。

我以为Cache-Contol: max-age头将强制nginx将json保存在caching文件夹中。
文件夹被创build,但这里没有数据,所有来自不同浏览器的请求都打到服务器。
我错过了什么? 或者,也许我完全误解了用nginxcaching的概念?

首先调用你在头文件中添加一个Cache-Control: 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缓存模块。

看到这里http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html