Nginx 过期缓存和 proxy_cache_path

Nginx 过期缓存和 proxy_cache_path

我已将 Nginx 放在 php 应用服务器前面作为反向代理来缓存动态内容并将一些命中保存到 php。

我已使用以下设置配置了 Nginx,希望能够实现以下行为。

1)Nginx 将缓存 200 状态代码内容 20 分钟,然后尝试从应用服务器重新获取

2)缓存将保留最多 7 天,以处理不经常访问的内容的陈旧请求。

3)在内容最初缓存 20 分钟后收到的请求将向后端发出请求以获取最新更新,但将提供过时的版本,以便客户端能够立即获得响应。

proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=staticfilecache:512m inactive=7d max_size=15000m;
proxy_cache_use_stale timeout updating error invalid_header;
proxy_cache_valid 200 20m; 
proxy_cache_valid       404 1m;
proxy_cache_valid       any 15m;

更新:在运行了更多测试并查看了服务器日志之后,看来超过 20 分钟的内容并未作为陈旧内容从缓存中提供,而是只是在 cache_file_system 中积累。

有没有办法让 Nginx 长时间提供陈旧内容?用例基本上是缓存不经常访问的内容,这些内容在我的应用服务器上生成起来成本很高。当命中最终到来时,能够在缓存中过期几天后提供陈旧项目将大大提高性能。如果 Nginx 无法做到这一点,我愿意考虑其他代理/缓存选项(我仅将此 Nginx 实例用作缓存)。

答案1

事实证明并非如此目前可能使用 Nginx。我最终设置了 Varnish,设置了较长的 TTL(7 天)以及较长的宽限期(2 天)。然后我每隔几天让一个脚本访问每个 URL,强制缓存预热

考虑到我需要缓存的内容量以及每个项目的访问频率,我起初担心运行 Varnish 的成本会过高(所有 RAM!)——这就是为什么我研究 Nginx 的基于文件的缓存。然而,Varnish 确实有一个文件支持的缓存选项,对我来说效果很好。到目前为止,我的缓存大约有 80GB,性能非常好!

答案2

这些看起来都不错。你是想问为什么这不起作用吗?

我想补充的是,您的 proxy_use_stale 可能还包含其他 HTTP 错误代码。我假设,如果 php 由于容量过大而返回 503,您会希望继续从缓存中提供过时的内容。

相关内容