Miklix

删除 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 会发现这一点并从后端顺利获取新副本。但是,如果您在不调整配置的情况下执行此操作,一段时间后您可能会在错误日志中看到一大堆类似于此的消息:

2015/03/04 17:35:24 [crit] 16665#0: unlink() \"/path/to/nginx/cache/9/a0/53eb903773998c16dcc570e6daebda09\" failed (2: No such file or directory)

这些错误似乎是在 NGINX 本身尝试在fastcgi_cache_path指令的inactive参数指定的时间之后删除缓存条目时发生的。默认值只有 10 分钟,但您可以将其设置为您想要的任何值。如果您将其设置为 10 年,则您不太可能在此期间没有重新启动服务器,因此内存中的关键索引在此期间会被清除。如果您这样做,您是否需要确保自己清除缓存,NGINX 将不再为您执行此操作。

我发现,由于缓存条目不存在而无法删除,这被视为严重错误,这真的很奇怪。它的严重性分类如此之高,意味着不可能仅通过忽略低于某个阈值的日志条目来消除它。一旦从后端获取新副本,该条目就会再次存在,所以在我看来,这最多应该是一个警告。

现在,如果由于权限问题或第三方问题而无法删除缓存条目,将是一个严重错误,因为它可能导致 NGINX 在缓存过期之后很长时间继续提供缓存内容,但清理过程似乎并没有做出这种区分。

分享至 Bluesky在 Facebook 上分享在 LinkedIn 上分享在 Tumblr 上分享分享至 X在 LinkedIn 上分享在Pinterest上固定

米克尔·邦·克里斯滕森

关于作者

米克尔·邦·克里斯滕森
迈克尔 是 miklix.com 的创建者和所有者。他拥有 20 多年的专业计算机程序员/软件开发人员经验,目前全职受雇于一家大型欧洲 IT 公司。不写博客时,他把业余时间花在各种兴趣、爱好和活动上,这在一定程度上反映在本网站涵盖的各种主题上。