NGINX缓存上游服务器时,它不应该';不可能

NGINX缓存上游服务器时,它不应该';不可能,nginx,caching,Nginx,Caching,我想设置一个NGINX服务器,它提供以下功能: 当NGINX请求在/path/to/page获取页面时,它在/path/to/page获取页面 如果上游服务器关闭或NGINX由于某种原因无法连接到它,NGINX将返回页面的缓存版本(如果有) 如果缓存的文件超过6小时,不要使用它,只需返回502即可 如果上游服务器可用,请不要使用缓存 我在这里有一个NGINX配置,根据我对文档的理解,我认为它应该可以工作,但它没有,我也不明白为什么。问题在于第(4)点,即使上游服务器在线,该NGINX服务器也会返

我想设置一个NGINX服务器,它提供以下功能:

  • 当NGINX请求在/path/to/page获取页面时,它在/path/to/page获取页面
  • 如果上游服务器关闭或NGINX由于某种原因无法连接到它,NGINX将返回页面的缓存版本(如果有)
  • 如果缓存的文件超过6小时,不要使用它,只需返回502即可
  • 如果上游服务器可用,请不要使用缓存
  • 我在这里有一个NGINX配置,根据我对文档的理解,我认为它应该可以工作,但它没有,我也不明白为什么。问题在于第(4)点,即使上游服务器在线,该NGINX服务器也会返回文件的缓存版本

    daemon off;
    error_log /dev/stdout info;
    
    events {
    }
    
    http {
        proxy_cache_path
            "/home/jack/Code/NGINX Caching/Codebase/cache"    # Cache path
            keys_zone=cache:10m # Name of cacahe, max size for keys 10 megabytes
            levels=1:2              # Don't store all cached files in a single directory
            max_size=500m           # Max size of cache
            inactive=6h;            # Cached file deleted if not used within six hours
        proxy_cache_valid 6h;
        proxy_cache_key "$request_method$request_uri";
    
        access_log /dev/stdout;
    
        server {
            listen 8080;
    
            location ~ ^/(.+)$ {
                proxy_pass http://0.0.0.0:8000/$1;
                proxy_cache cache;
                proxy_cache_valid 6h;
                proxy_buffering on;
                proxy_cache_use_stale error timeout;
            }
        }
    }
    

    代理缓存路径
    替换为计算机上目录的路径,并在端口8000上运行另一个Web服务器。当我在端口8000上修改服务器提供的文件时,NGINX在清除缓存之前不会看到更改。问题在于NGINX而不是我的客户端(Firefox),即使我关闭浏览器中的缓存,NGINX也会返回一个包含旧文件内容的200。请检查这两个指令是否对您有帮助:

    代理缓存重新验证日期:

    代理\u缓存\u使用\u过时:


    nginx.conf'17在线上有一段视频,描述了您可以通过缓存实现的所有酷东西:。也许这也是您感兴趣的。

    因此,我似乎误解了NGINX代理缓存指令。这些文件在这个问题上很混乱,所以我将逐一阐述

    给出了各种指令的一个不错的概述,但是它没有提到一些事实证明是理解NGINX缓存工作原理的一个非常重要的概念构建块:缓存文件过时的概念

    NGINX的默认行为是始终使用缓存(如果缓存在那里),而不是查询上游服务器。使用此配置(缓存的最小配置),NGINX将在第一次访问页面时查询上游服务器,然后永远使用缓存版本:

    events {
    }
    
    http {
        proxy_cache_path
            /path/to/cache
            keys_zone=my_cache:10m;
            proxy_cache_key "$request_method$request_uri";
    
        server {
            listen 8080;
    
            location ~ ^/(.+)$ {
                proxy_pass http://0.0.0.0:8000/$1;
                proxy_cache cache;
            }
        }
    }
    
    您可以使用
    proxy\u cache\u valid
    指令告知NGINX何时应将缓存文件视为“过时”。例如,如果我们将代理缓存设置为有效,则在创建缓存文件5分钟后,NGINX将停止为其提供服务,并在下一个请求时再次查询上游服务器。如果上游关闭,NGINX将返回502。然而,在这五分钟内,即使上游服务器可用,NGINX仍将使用缓存,因此这仍然不是我们想要的

    NGINX还有另一条指令,
    proxy\u cache\u use\u stale
    ,它给出了NGINX可以使用缓存文件的条件,即使这些文件已经过时。我们可以将这些结合在一起,得到一个服务器,该服务器缓存页面,使页面立即(或几乎立即)过时,然后仅在上游关闭时使用它们:

    events {
    }
    
    http {
        proxy_cache_path
            /path/to/cache
            keys_zone=my_cache:10m;
            proxy_cache_key "$request_method$request_uri";
    
        server {
            listen 8080;
    
            location ~ ^/(.+)$ {
                proxy_pass http://0.0.0.0:8000/$1;
                proxy_cache cache;
                proxy_cache_valid 1s;
                proxy_cache_use_stale error timeout;
            }
        }
    }
    
    这个配置几乎具有我们想要的行为,除了如果上游服务器宕机一段时间,NGINX将无限期地继续使用缓存。据我所知,没有办法告诉NGINX在给定的时间后完全失效/清除缓存文件。通常情况下,这就是代理缓存有效的目的,但我们已经将其用于另一个目的,使文件在1秒后过时,因此它们仅在上游关闭时使用。在“stale”之后,我们需要下一个级别,这意味着文件完全无效,但我认为NGINX中不存在这种情况

    因此,最简单的解决方案就是手动清除缓存。只需删除缓存目录(或其子目录)中上次修改时间超过6小时的所有文件,或您希望的任何过期时间,就足够了。在Linux系统上,您可以每5分钟运行一次此脚本,例如:

    find /path/to/cache -type f -mmin +360 -delete
    

    不,不是真的。嘿,杰克,我正在我的实验室环境中测试你的方案,并让你知道结果。没必要,我知道了。我误解了
    proxy\u cache\u use\u stale
    proxy\u cache\u valid
    指令的工作原理。仅供参考:有一个指令。但我认为这只在nginx plus中可用。你可以看到我在回答中提到的一个例子。我想这并不是比您提到的手动/cron作业查找和删除方式更好的解决方案。