nginx作为缓存代理不缓存任何东西

Bru*_*ria 19 linux proxy caching reverse-proxy nginx

我正在尝试缓存静态内容,这些内容基本上位于虚拟服务器配置中的下面路径中.由于某种原因,文件未被缓存.我在缓存目录中看到了几个文件夹和文件,但它总是像20mb那样不高不低.如果它是缓存图像,例如将占用至少500mb的空间.

这是nginx.conf缓存部分:

** nginx.conf **
proxy_cache_path /usr/share/nginx/www/cache levels=1:2 keys_zone=static$
proxy_temp_path /usr/share/nginx/www/tmp;
proxy_read_timeout 300s;
Run Code Online (Sandbox Code Playgroud)

这是默认的虚拟服务器.

**sites-available/default**
server {
    listen   80; 

    root /usr/share/nginx/www;
    server_name myserver;
    access_log /var/log/nginx/myserver.log main;
    error_log /var/log/nginx/error.log;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location ~* ^/(thumbs|images|css|js|pubimg)/(.*)$ {
            proxy_pass http://backend;
            proxy_cache static;
            proxy_cache_min_uses 1;
            proxy_cache_valid 200 301 302 120m;
            proxy_cache_valid 404 1m;
            expires max;
    }

    location / {
            proxy_pass http://backend;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*rov 44

确保您的后端不返回Set-Cookie标题.如果Nginx看到它,它会禁用缓存.

如果是这种情况,最好的选择是修复后端.当修复后端不是一个选项时,可以指示Nginx忽略Set-Cookie标题

proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
Run Code Online (Sandbox Code Playgroud)

请参阅文档

proxy_ignore_header将确保缓存发生.proxy_hide_header将确保Cookie有效负载不包含在缓存的有效负载中.这对于避免通过NGINX缓存泄漏cookie非常重要.

  • 如果其他人遇到与我相同的问题:“proxy_buffering off;”将阻止缓存 (8认同)
  • 如果我理解正确,那么你几乎总是想要设置`proxy_hide_header"Set-Cookie",或者你将为所有访问者提供为第一个请求资源的用户生成的cookie. (7认同)
  • 实际上它不是设置cookie而是缓存控制.我发现IIS实际上是缓存静态文件,而对nginx的响应是不会缓存那些文件,因为它已经缓存了它.一旦我从iis缓存中删除了这些文件就可以了.:) (6认同)
  • @alexander我更新了你的答案,没有proxy_hide_header的proxy_ignore_headers是一个巨大的安全风险. (5认同)

Ove*_*ryd 13

我想补充一点,多个配置选项和组合可以禁用Nginx中的代理缓存.不幸的是,这个记录很少.

在我的配置中,我设置了proxy_buffering on它并按预期启用了缓存.

  • 那么,`proxy_buffering on`是如何相关的,你能解释一下吗? (2认同)
  • 我一直在寻找有关代理缓冲和代理缓存之间关系的官方文档,但是在这里找不到任何好的资源可以引用。我添加了这个答案,因为关闭`proxy_buffering`只会禁用所有已配置的缓存行为,而不会发出警告或其他任何信息。我的猜测是,如果不进行缓冲,nginx将无法存储并因此缓存来自其代理服务器的响应。这个答案暗示了一些事情,甚至可以问给出答案的Tero Kilkanen:http://serverfault.com/a/692585/144118 (2认同)
  • 打开票来记录这些废话:https://trac.nginx.org/nginx/ticket/2048 (2认同)

Jam*_*Tan 8

在浏览了多个答案和评论后,我发现这个配置终于有效了:

10m= 10mbkey cache, max_sizeto 2GB, inactive=120m(在非活动状态 120 分钟后从源刷新), use_temp_path=off(减少 io)

proxy_cache_valid-20030260 分钟的缓存状态

proxy_cache_path /tmp/cache levels=1:2 keys_zone=default_cache:10m max_size=2g
                 inactive=120m use_temp_path=off;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 60m;

server {
    listen       80;
    server_name  example.com;

    # https://www.nginx.com/blog/nginx-caching-guide
    location / {
        proxy_cache default_cache;
        proxy_buffering on;
        proxy_ignore_headers Expires;
        proxy_ignore_headers X-Accel-Expires;
        proxy_ignore_headers Cache-Control;
        proxy_ignore_headers Set-Cookie;

        proxy_hide_header X-Accel-Expires;
        proxy_hide_header Expires;
        proxy_hide_header Cache-Control;
        proxy_hide_header Pragma;

        add_header X-Proxy-Cache $upstream_cache_status;
        proxy_pass http://ip-of-host:80;

        #set            $memcached_key "$uri?$args";
        #memcached_pass 127.0.0.1:11211;
        # error_page     404 502 504 = @fallback;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 良好而清晰的答案。我关注并解决了我的问题。 (3认同)