为什么这个Nginx设置不caching响应?

我有Nginx坐在gunicorn前面,反过来坐在django应用程序的前面。

核心问题是“为什么我的回复没有被caching?” 但是,我非常青睐这个,所以这里是关于应该发生什么的假设(如果我的核心理解是有缺陷的)。

请求点击Nginx请求来自REST服务的某个json 。 Nginx在它的caching中没有这个,所以它传递给了Gunicorn/Django 。 生成一个响应,通过Nginx传回,在那里被caching,最后返回给客户端。

然后!

请求B进来要求相同的资源。 Nginx在它的caching中,因此直接服务它,永远不会碰到Django的应用程序。

基于这个假设,经过大量的阅读后,我终于在我的sites-enabled了这个最小的nginxconfiguration:

 proxy_cache_path /tmp/nginx keys_zone=one:20m inactive=60m; proxy_cache_key "$host$request_uri"; server { listen 8080; server_name localhost; proxy_cache one; location / { add_header X-Proxy-Cache $upstream_cache_status; proxy_ignore_headers X-Accel-Expires Expires Cache-Control; proxy_pass http://127.0.0.1:8000; } } 

这段代码是基于nginxcaching的文档和这里的教程。

如果我testing一些请求,我得到这个回应:

 curl -X GET -I http://localhost:8080 HTTP/1.1 200 OK Server: nginx/1.4.6 (Ubuntu) Date: Wed, 06 May 2015 01:35:38 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Cookie X-Frame-Options: SAMEORIGIN Set-Cookie: csrftoken=b6UG5X4ZlGwVUYfHSIkq4PKBIxicpWxc; expires=Wed, 04-May-2016 01:35:38 GMT; Max-Age=31449600; Path=/ X-Proxy-Cache: MISS 

注意:我认为cookie没有问题,因为我没有在cache_key指令中包含它。 我可能是错的。

尽pipe对同样的资源有很多要求,但我从来没有得到caching命中。 此外,没有caching文件被写入proxy_cache_path目录中。

有人能指出我为什么没有反应被caching吗?

谢谢!

它看起来像问题是,上游服务器只是没有发送包含到期date( Expires:或cachingvalidation程序(例如, Last-Modified: Expires:响应。 (cookie过期时间与caching无关。)

HTTP 1.1规范说:

如果既没有cachingvalidation程序,也没有与响应关联的显式过期时间, 我们并不期望它被caching,但某些caching可能违反了这个期望(例如,当很less或没有networking连接可用时)。

(强调补充说。)

所以它看起来像你的Django安装程序没有打开caching。 我build议你打开每个站点的caching 。 如果你这样做,Django将在响应中生成Nginxcaching需要的头文件。

另一种select是在你的Nginxconfiguration中使用proxy_cache_valid选项。 我使用类似于你的设置,并复制你得到的行为,然后我加了proxy_cache_valid any 5m; 它告诉Nginxcaching5分钟5分钟内有任何状态码( any )的响应。 有一次,我做到了,我得到了caching命中。

试图caching一个持有Set-Cookie头的实体是个不错的主意。 除非使用proxy_ignore_headers指令进行告知,否则这是nginx 禁止的。

这个头被忽略加上Vary: Cookie回复中的Vary: Cookie头会使你的caching非常无效,因为唯一的资源将有尽可能多的caching条目作为访问者的数量。

另请注意,自1.7.7版以来,cachingalgorithm中将Vary头部考虑在内。 使用以前的nginx版本和proxy_ignore_headers Set-Cookie; 会导致大量的cookie重复,因为来自caching回复的Set-Cookie头将被发回到所有请求caching条目。