当前位置: 首页 > 知识库问答 >
问题:

NGINX proxy_pass不缓存内容

文凯康
2023-03-14

让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日期:Wed,2015年3月25日20:05:36 GMT内容类型:image/jpeg内容长度:1691连接:keep alive pragma:无缓存缓存控制:无缓存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;
    }   
}

共有3个答案

霍财
2023-03-14

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

proxy_cache_valid 200 2d (或任何时间和任何您想要的响应代码

将此添加到您正在使用或激活的proxy_cache

显然,对我来说,只要我删除代理缓存_valid参数缓存状态就不会显示。另外,文档中没有说明这是必填字段。让我知道这对你是否有效。所以我们可能会更新文档。

我希望expect proxy_cache get started(代理缓存启动)页面应该显示至少需要3个参数才能启动:代理缓存路径代理缓存代理缓存有效

陶宏浚
2023-03-14

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

  proxy_hide_header      Set-Cookie;
  proxy_ignore_headers   Set-Cookie;

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

张英范
2023-03-14

结果表明,Dropbox返回的缩略图请求包含标题

Cache-Control: no-cache

Nginx将坚持这些头,除非它们被显式忽略,这可以通过简单地使用下面的配置行来完成,它将忽略任何缓存控件。

proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;

我们在nginx.conf文件中的不同区域放置“proxy_ignore_headers”选项也有问题。最后,经过大量的尝试,我们通过在“位置”块中显式设置它来让它工作。配置文件的完整片段可以在下面找到

    ## 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;
    }
}
 类似资料:
  • 问题内容: 我正在尝试缓存静态内容,这些内容基本上位于虚拟服务器配置中的以下路径内。由于某些原因,文件没有被缓存。我在缓存目录中看到了几个文件夹和文件,但总是像20mb一样高或低。例如,如果要缓存图像,则将至少占用500mb的空间。 这是nginx.conf缓存部分: 这是默认的虚拟服务器。 问题答案: 确保您的后端不返回标头。如果Nginx看到它,它将禁用缓存。 如果是这种情况,最好的选择是修复

  • 是否有可能在内存中实现缓存以避免完全堆消耗? 我的spring boot java应用程序使用内存缓存,过期策略设置为1小时(咖啡因库用于缓存目的)。在此之后,所有缓存实例都处于旧代,需要收集完整的GC。现在,当XMX设置为10GB时,我可以看到经过几个小时的测试,我的缓存包含大约100k个实例,但在heap中(正好是旧一代),我可以找到数百万个缓存对象的实例。是否有可能在内存中使用缓存并避免这种

  • 主要内容:1. 介绍,2. 启用响应缓存,3. 涉及缓存的NGINX进程,4. 指定要缓存的请求,5. 限制或绕过缓存,6. 从缓存中清除内容,7. 字节缓存,8. 组合配置示例本节介绍如何启用和配置从代理服务器接收的响应的缓存。主要涉及以下内容 - 缓存介绍 启用响应缓存 涉及缓存的NGINX进程 指定要缓存的请求 限制或绕过缓存 从缓存中清除内容 配置缓存清除 发送清除命令 限制访问清除命令 从缓存中完全删除文件 缓存清除配置示例 字节缓存 组合配置示例 1. 介绍 当启用缓存时,NGINX

  • 在我的Android应用程序中,我使用Volley在自定义列表视图中加载图像。 当我多次刷新(删除所有项目并加载tiems)listview时,我的应用程序就会被这条消息杀死 我该怎么修好它?

  • 我使用的是spring-boot-starter-parent版本2.0.1 这是我想要缓存结果的java方法。 我没有redis或缓存的任何其他配置。虽然它不抛出任何错误,但它不缓存任何东西。我和Redis-Cli核实了。

  • 我在docker中有两个服务后端和前端(nodejs),它们通过nginx(也在docker中)处理。 Nginx配置: 我使用nginx location将所有请求代理给