当没有后端可用时,Nginx 代理提供最后一页

当没有后端可用时,Nginx 代理提供最后一页

假设我们有一个网站,前端是 nginx,后端是 apache(使用 php 或其他语言)。这个想法是,nginx 将提供静态服务,而将对 *.php 文件的请求代理到后端。很容易实现,配置也不需要动脑子,不是吗?

现在想象一下,我们有一个行为不良的后端。它使用了一些不稳定的模块,它过去需要几秒钟才能生成页面,我们不确定页面是否会被呈现。很奇怪,但仍然可能,对吧?遗留代码等等。顺便说一句,后端可能在不同的机器上(是的,遗留:旧操作系统、旧软件、“甚至不要碰它!”等等)。

现在,我们想在后端无法响应的情况下“保护”自己。如果我们没有得到页面或收到 5xx 错误,那么提供页面的方式就很好了,就像我们上次成功提供页面的方式一样。换句话说,如果后端返回了 200 代码和页面内容,那么我们就提供它。如果我们超时或从后端收到 5xx 代码,我们将为相同 URI 提供页面,但缓存了一个。这将给我们一些时间来修复后端,同时用户至少会看到一些东西。

Nginx 是一款不错的软件。我找到了 proxy_cache_use_stale 指令以及其他一些指令,但我担心如果后端发生故障,将提供哪个版本。

我还可以想象一些 http 平衡器(例如 nginx)将检查后端状态并停止使用它,无论发生什么情况。那么第二个后端可能是一个充满了模仿原始站点的静态页面的服务器(甚至可能没有某些元素,如“登录”链接)。如果是这样,我应该如何明智地随着时间的推移更新“模仿”服务器?

哪种方法可能更好?您会选择哪种方法?

答案1

CloudFlare 在全球拥有 100 多个数据中心,它们位置优越,服务完善,而且其免费套餐的价格无与伦比。是的,如果主站点离线,CloudFlare 会显示警告,但也许他们的付费商业计划可以隐藏该警告 - 您必须询问他们。如果您不想要警告,您唯一的选择是 Nginx 或类似的缓存。

nginx 配置的关键部分是这些,位于您的位置块中。有关它们的更多信息,请参阅这篇优秀的文章基本上,它表示仅缓存 200(成功)个响应,并且仅缓存 1 秒(如果可以则增加),在更新时使用陈旧页面,并且不要对已请求的页面的请求进行排队。

proxy_cache_lock on;
proxy_cache_valid 200 1s;
proxy_cache_use_stale updating;

如果有匿名用户,页面缓存将减少服务器的负载,即使您只缓存页面 1 秒,但时间越长越好。负载的减少可能会使应用程序更加可靠。

当然你应该修复这个行为不良的应用程序。

相关内容