nginx没有在磁盘上缓存代理响应,尽管我要求它这样做



我使用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开始使用缓存?

官方文档告诉如果头中包含"Set-Cookie"字段,则不会缓存这样的响应

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

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

我试着用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;
    }
}

相关内容

最新更新