NGINX缓存上游服务器时,它不应该';不可能
我想设置一个NGINX服务器,它提供以下功能:NGINX缓存上游服务器时,它不应该';不可能,nginx,caching,Nginx,Caching,我想设置一个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作业查找和删除方式更好的解决方案。