nginx没有在磁盘上缓存代理响应,即使我要求它

时间:2014-11-06 20:58:13

标签: caching nginx proxy

我使用nginx作为负载平衡代理,我也希望它将其响应缓存在磁盘上,因此它不必经常访问上游服务器。

我尝试按照http://wiki.nginx.org/ReverseProxyCachingExample的说明操作。我使用了Docker提供的nginx 1.7。

这是我的nginx.conf(已安装到nginx/conf.d/中):

upstream balancer53 {
    server conceptnet-api-1:10053;
    server conceptnet-api-2:10053;
}

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:1g max_size=1g;

server {
    listen 80;
    gzip on;
    gzip_proxied any;
    gzip_types application/json;
    charset utf-8;
    charset_types application/json;

    location /web {
        proxy_pass http://balancer53;
        proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for;
        proxy_cache STATIC;
        proxy_cache_valid 200 1d;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset;
    }
    location /data/5.3 {
        proxy_pass http://balancer53;
        proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for;
        proxy_cache STATIC;
        proxy_cache_valid 200 1d;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset;
    }

    location /data/5.2 {
        # serve the old version
        proxy_pass http://conceptnet52:10052/;
        proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for;
        proxy_cache STATIC;
        proxy_cache_valid 200 1d;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset;
    }
    location / {
        root /var/www;
        index index.html;
        autoindex on;
        rewrite ^/static/(.*)$ /$1;
    }
}

尽管有这样的配置,但/data/nginx/cache中没有任何内容显示出来。

以下是来自上游服务器的响应标头的示例:

$ curl -vs http://localhost:10053/data/5.3/assoc/c/en/test > /dev/null
* Hostname was NOT found in DNS cache
*   Trying ::1...
* Connected to localhost (::1) port 10053 (#0)
> GET /data/5.3/assoc/c/en/test HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:10053
> Accept: */*
> 
< HTTP/1.1 200 OK
* Server gunicorn/19.1.1 is not blacklisted
< Server: gunicorn/19.1.1
< Date: Thu, 06 Nov 2014 20:54:52 GMT
< Connection: close
< Content-Type: application/json
< Content-Length: 1329
< Access-Control-Allow-Origin: *
< X-RateLimit-Limit: 60
< X-RateLimit-Remaining: 59
< X-RateLimit-Reset: 1415307351
< 
{ [data not shown]
* Closing connection 0

每个上游服务器都在执行速率限制,但我可以忽略缓存响应的速率限制。我不确定这些标题是否阻止了缓存,这就是为什么我告诉nginx忽略它们。

我需要做些什么才能让nginx开始使用缓存?

2 个答案:

答案 0 :(得分:1)

官方文档告诉如果标题包含“Set-Cookie”字段,则不会缓存此类响应。请查看here

要使缓存工作使用隐藏和忽略技术:

location /web {
  ...
  proxy_hide_header      Set-Cookie;
  proxy_ignore_headers   Set-Cookie;
}

答案 1 :(得分:1)

我尝试单独使用nginx.conf运行nginx,并发现它抱怨某些选项无效。我想我从来没有成功构建过一个新的nginx容器。

特别是,事实证明,您不必在proxy_ignore_headers选项中添加任何旧标头。它只需要特定的头作为参数,代理系统关心的那些。

这是我修改过的nginx.conf,它起作用了:

upstream balancer53 {
    server conceptnet-api-1:10053;
    server conceptnet-api-2:10053;
}

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:100m max_size=100m;

server {
    listen 80;
    gzip on;
    gzip_proxied any;
    gzip_types application/json;
    charset utf-8;
    charset_types application/json;

    location /web {
        proxy_pass http://balancer53;
        proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for;
        proxy_cache STATIC;
        proxy_cache_valid 200 1d;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
    }
    location /data/5.3 {
        proxy_pass http://balancer53;
        proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for;
        proxy_cache STATIC;
        proxy_cache_valid 200 1d;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
    }
    location / {
        root /var/www;
        index index.html;
        autoindex on;
        rewrite ^/static/(.*)$ /$1;
    }
}