我已将 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
答案2
这些看起来都不错。你是想问为什么这不起作用吗?
我想补充的是,您的 proxy_use_stale 可能还包含其他 HTTP 错误代码。我假设,如果 php 由于容量过大而返回 503,您会希望继续从缓存中提供过时的内容。