Django 如何强制nginx将响应保存在缓存文件夹中,并使用来自上游服务器的头文件?
我的API使用Django REST框架,nginx作为反向代理,redis用于缓存一些静态API数据。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
我试图用
缓存控制: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将不会将来自该资源的数据保存到缓存中。