nginx 作为缓存代理不缓存任何内容

问题描述 投票:0回答:5

我正在尝试缓存静态内容,这些内容基本上位于虚拟服务器配置中的以下路径内。由于某些原因,文件没有被缓存。我在缓存目录中看到了几个文件夹和文件,但它总是大约 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;

这是默认的虚拟服务器。

**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;
    }
}
linux caching proxy nginx reverse-proxy
5个回答
58
投票

确保您的后端不会返回

Set-Cookie
标头。如果 Nginx 看到它,它会禁用缓存。

如果这是您的情况,最好的选择是修复您的后端。当无法修复后端时,可以指示 Nginx 忽略

Set-Cookie
header

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

参见文档

proxy_ignore_header
将确保进行缓存。
proxy_hide_header
将确保 Cookie 负载不包含在缓存的负载中。这对于避免通过 NGINX 缓存泄漏 cookie 非常重要。


22
投票

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

在我的配置中,我设置了

proxy_buffering on
并且它按预期启用了缓存。


17
投票

在查看了多个答案和评论后,我发现这个配置终于可以工作了:

10m
=
10mb
密钥缓存,
max_size
2GB
inactive=120m
(120分钟不活动后从源刷新),
use_temp_path=off
(减少io)

proxy_cache_valid
- 缓存
200
302
的状态 60 分钟

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

2
投票

我刚刚遇到的另一个原因是nginx服务器系统时钟在未来(或者与定义过期标头的源服务器的时钟相比,未来有太多漂移),它只会考虑内容不被缓存,因为它已经过期(根据它自己的时间参考)。服务器未与 NTP 同步...

来自 https://www.nginx.com/blog/nginx-caching-guide/ :

NGINX 缓存响应仅当源服务器包含带有未来日期和时间的 Expires 标头,或带有设置为非零值的 max-age 指令的 Cache-Control 标头。


1
投票

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

以centos7为例,带有配置选项

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

nginx 实际上将文件缓存在:

/tmp/systemd-private-phJlfG/tmp/my_nginx_cache
© www.soinside.com 2019 - 2024. All rights reserved.