NGINX proxy_pass 不缓存内容

NGINX proxy_pass not caching content

我在让 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 OK Server: nginx/1.1.19 Date: Wed, 25 Mar 2015 20:05:36 GMT Content-Type: image/jpeg Content-Length: 1691 Connection: keep-alive pragma: no-cache cache-control: no-cache 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    '';

    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;
    }   
}

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

  proxy_hide_header      Set-Cookie;
  proxy_ignore_headers   Set-Cookie;

查看带有失效方法的完整配置:https://gist.github.com/mikhailov/9639593

原来从 Dropbox 返回的缩略图请求包括 header

Cache-Control: no-cache

并且 Nginx 将遵守这些 headers 除非它们被显式忽略 这可以通过简单地使用以下将忽略任何缓存控制的配置行来完成。

proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;

我们在 nginx.conf 文件的不同区域放置 "proxy_ignore_headers" 选项时也遇到了问题。最后,经过大量尝试,我们通过在 "location" 块中明确设置它来使其工作。可以在下面找到配置文件的完整片段

    ## 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    '';

    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;
    }
}

如果以上答案未能解决您的问题,请尝试以下操作:

proxy_cache_valid 200 2d; (或者你想要的任何时间和任何响应代码)

在您使用或激活 proxy_cache <keys_zone_name> 的地方添加这个。

显然对我来说,一旦我删除 proxy_cache_valid 参数缓存状态就不会显示。文档也没有说这是必填字段。如果这对你有用,请告诉我。所以我们可能会更新文档。

我希望 proxy_cache 开始页面应该显示您至少需要 3 个这些参数才能开始:proxy_cache_pathproxy_cacheproxy_cache_valid