NGINX proxy_pass没有缓存内容

时间:2015-03-25 20:35:16

标签: caching nginx

我在让NGINX缓存我使用proxy_pass命令从Dropbox中提取的缩略图时遇到问题。在NGINX运行的同一台服务器上,我多次运行以下命令

 wget --server-response --spider  http://localhost:8181/1/thumbnails/auto/test.jpg?access_token=123

并使用X-Cache获得完全相同的响应:每次都是MISS

  

HTTP / 1.1 200好的     服务器:nginx / 1.1.19     日期:2015年3月25日星期三20:05:36 GMT     内容类型:image / jpeg     内容长度:1691     连接:保持活力     编译指示:无缓存     缓存控制:无缓存     X-Robots-Tag:noindex,nofollow,noimageindex     X-Cache:MISS

这是我的nginx.conf文件的内容..关于我在这里做错了什么的想法?

## Proxy Server Caching
proxy_cache_path  /data/nginx/cache  keys_zone=STATIC:10m max_size=1g;


## Proxy Server Setting
server {
    listen *:8181;

    proxy_cache     STATIC;
    proxy_cache_key "$request_uri";
    proxy_cache_use_stale  error timeout invalid_header updating
                   http_500 http_502 http_503 http_504;

    location ~ ^/(.*) {
    set $dropbox_api 'api-content.dropbox.com';
    set $url    '$1';

    resolver 8.8.8.8;   

    proxy_set_header    Host    $dropbox_api;

    proxy_cache     STATIC;
    proxy_cache_key     "$request_uri";
    proxy_cache_use_stale   error timeout invalid_header updating
                   http_500 http_502 http_503 http_504;

    add_header X-Cache $upstream_cache_status; 

    proxy_pass https://$dropbox_api/$url$is_args$args;
    }

    ##Error Handling
    error_page 500 502 503 504 404 /error/;  
    location = /error/ {  
    default_type text/html;
    }   
}

2 个答案:

答案 0 :(得分:7)

原来从Dropbox返回的缩略图请求包含标题

Cache-Control: no-cache

并且Nginx将遵守这些标题,除非明确忽略,这可以通过简单地使用以下将忽略任何缓存控制的配置行来完成。

proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;

我们还遇到了将“proxy_ignore_headers”选项放在nginx.conf文件中的不同区域的问题。最后,经过多次游戏,我们通过在“位置”块中明确设置它来使其工作。配置文件的完整片段可以在

下面找到
    ## Proxy Server Caching
proxy_cache_path  /data/nginx/cache  levels=1:2 keys_zone=STATIC:50m inactive=2h max_size=2g;

## Proxy Server Setting
server {
    listen *:8181;

    location ~ ^/(.*) {
    set $dropbox_api 'api-content.dropbox.com';
    set $url    '$1';

    resolver 8.8.8.8;

    proxy_set_header    Host    $dropbox_api;
    proxy_hide_header   x-dropbox-thumbcachehit;
    proxy_hide_header   x-dropbox-metadata;
    proxy_hide_header   x-server-response-time;
    proxy_hide_header   x-dropbox-request-id;

    proxy_hide_header cache-control;
    proxy_hide_header expires;

    add_header cache-control "private";
    add_header x-cache $upstream_cache_status; # HIT / MISS / BYPASS / EXPIRED

    proxy_cache     STATIC;
    proxy_cache_valid       200  1d;
    proxy_cache_use_stale   error timeout invalid_header updating
                http_500 http_502 http_503 http_504;
    proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;

    proxy_pass https://$dropbox_api/$url$is_args$args;
    }
}

答案 1 :(得分:0)

为了缓存代理响应,Nginx和origin之间的请求应该是无cookie的:

  proxy_hide_header      Set-Cookie;
  proxy_ignore_headers   Set-Cookie;

请参阅使用失效方法的完整配置:https://gist.github.com/mikhailov/9639593