删除 NGINX 缓存会导致关键的 Unlink 错误进入错误日志
已出版: 2025年2月15日 UTC 11:25:01
本文介绍如何从 NGINX 的缓存中删除项目,而不会让日志文件充斥着错误消息。虽然通常不推荐这种方法,但在某些特殊情况下可能会有用。
Deleting NGINX Cache Puts Critical Unlink Errors in Error Log
本文中的信息基于在 Ubuntu Server 14.04 x64 上运行的 NGINX 1.4.6 上的 FastCGI 缓存。它可能对其他版本有效,也可能无效。
(2025 年更新:从我写原始帖子到现在,很多事情都发生了变化。服务器速度更快,价格更便宜,因此我实际上不推荐本文中描述的方法,即我尝试微观管理缓存过期,只是为了节省几代额外的动态内容。我会将内容留在这里以供将来参考,以防有人出于某种原因确实需要它。不过,我还没有确认这是否仍然适用于当前版本的 NGINX,但我认为它确实有效)。
将几个网站从 Apache 迁移到 NGINX 之后,我开始非常喜欢它的内置缓存功能,它在大多数情况下运行得非常好,不需要我进行太多干预。
但是,对于其中一个网站,我确实需要能够自己清除缓存(包括完全清除和删除单个条目)。NGINX 的免费社区版仅支持基于时间的缓存过期(即,您可以将其设置为检查一小时、一天等之后是否有变化)。但是,如果没有可靠的方法提前确定某个资源何时会发生变化,该怎么办?例如,我不知道我回来编辑这篇文章时是一小时、一天还是一年后——如果缓存一天就可以了,为什么只缓存一小时呢?
这时就需要手动清除缓存(或者让您的 Web 应用程序通知 NGINX 应该清除某些内容)的功能。NGINX 背后的人显然意识到了这一点的必要性,因为该功能在其产品的付费版本中得到支持 - 但尽管他们当然有权以任何他们想要的方式设置他们的许可,但当此功能是我真正需要的唯一付费功能时,价格对我来说有点高。
幸运的是,事实证明您可以自己从缓存目录中删除文件,NGINX 会发现这一点并从后端顺利获取新副本。但是,如果您在不调整配置的情况下执行此操作,一段时间后您可能会在错误日志中看到一大堆类似于此的消息:
这些错误似乎是在 NGINX 本身尝试在fastcgi_cache_path指令的inactive参数指定的时间之后删除缓存条目时发生的。默认值只有 10 分钟,但您可以将其设置为您想要的任何值。如果您将其设置为 10 年,则您不太可能在此期间没有重新启动服务器,因此内存中的关键索引在此期间会被清除。如果您这样做,您是否需要确保自己清除缓存,NGINX 将不再为您执行此操作。
我发现,由于缓存条目不存在而无法删除,这被视为严重错误,这真的很奇怪。它的严重性分类如此之高,意味着不可能仅通过忽略低于某个阈值的日志条目来消除它。一旦从后端获取新副本,该条目就会再次存在,所以在我看来,这最多应该是一个警告。
现在,如果由于权限问题或第三方问题而无法删除缓存条目,那将是一个严重错误,因为它可能导致 NGINX 在缓存过期之后很长时间继续提供缓存内容,但清理过程似乎并没有做出这种区分。