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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9230812/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 04:31:08  来源:igfitidea点击:

nginx as cache proxy not caching anything

linuxcachingproxynginxreverse-proxy

提问by Bruno Faria

I'm trying to cache static content which are basically inside the paths below in virtual server configuration. For some reason files are not being cached. I see several folders and files inside the cache dir but its always something like 20mb no higher no lower. If it were caching images for example would take at least 500mb of space.

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

Here is the nginx.conf cache part:

这是 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;

Heres the default virtual server.

这是默认的虚拟服务器。

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

采纳答案by Alexander Azarov

Make sure your backend does not return Set-Cookieheader. If Nginx sees it, it disables caching.

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

If this is your case, the best option is to fix your backend. When fixing the backend is not an option, it's possible to instruct Nginx to ignore Set-Cookieheader

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

proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";

See the documentation

查看文档

proxy_ignore_headerwill ensure that the caching takes place. proxy_hide_headerwill ensure the Cookie payload is not included in the cached payload. This is important to avoid leaking cookies via the NGINX cache.

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

回答by Overbryd

I would like to add that multiple configuration options and combinations can disable proxy caching in Nginx. Unfortunately this is poorly documented.

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

In my configuration I set proxy_buffering onand it enabled caching as expected.

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

回答by Russell

For what it's worth, my experience is that nginx does not always cache things where you tell it to.

就其价值而言,我的经验是 nginx 并不总是在您告诉它的地方缓存内容。

For example, on centos7, with the configuration option

比如在centos7上,用配置选项

proxy_cache_path /tmp/my_nginx_cache levels=1:2 keys_zone=my_zone:10m inactive=24h max_size=1g;

nginx actually caches the files at:

nginx 实际上将文件缓存在:

/tmp/systemd-private-phJlfG/tmp/my_nginx_cache

回答by James Tan

after going through multiple answers and comments, i found this configuration finally works:

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

10m= 10mbkey cache, max_sizeto 2GB, inactive=120m(refresh from source after 120minutes of inactive), use_temp_path=off(to reduce io)

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

proxy_cache_valid- cache status of 200and 302for 60 minutes

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