【问题标题】:NGINX proxy_pass not caching contentNGINX proxy_pass 不缓存内容
【发布时间】:2015-05-29 17:36:27
【问题描述】:

我在让 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 内容类型:图片/jpeg 内容长度:1691 连接:保持活动 杂注:无缓存 缓存控制:无缓存 X-Robots-标签: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;
    }   
}

【问题讨论】:

    标签: caching nginx


    【解决方案1】:

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

      proxy_hide_header      Set-Cookie;
      proxy_ignore_headers   Set-Cookie;
    

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

    【讨论】:

      【解决方案2】:

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

      Cache-Control: no-cache
      

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

      proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
      

      我们在 nginx.conf 文件的不同区域放置“proxy_ignore_headers”选项时也遇到了问题。最后,在玩了很多之后,我们通过在“位置”块中明确设置它来让它工作。配置文件的完整 sn-p 可以在下面找到

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

      【讨论】:

        【解决方案3】:

        如果以上答案没有解决你的问题,试试这个:

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

        将此添加到您正在使用或激活您的proxy_cache <keys_zone_name> 的位置。

        显然,一旦我删除proxy_cache_valid,参数缓存状态就不会出现。文档也没有说这是必填字段。让我知道这是否适合您。所以我们可能会更新文档。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-17
          • 2012-10-25
          • 2018-07-08
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          相关资源
          最近更新 更多