【问题标题】:Cache a static file in memory forever on Nginx?在 Nginx 上永久缓存内存中的静态文件?
【发布时间】:2016-12-13 07:05:43
【问题描述】:

我在 Docker 容器中运行 Nginx,它提供一些静态文件。文件将永远在运行时更改 - 如果它们确实发生更改,则容器将停止,图像将重新构建,并启动一个新容器。

所以,为了提高性能,如果 Nginx 只从磁盘读取一次静态文件,然后永远从内存中提供它,那将是完美的。我找到了一些配置缓存的配置选项,但至少从我所看到的情况来看,它们都没有提供我正在寻找的这种“永久”行为。

这可能吗?如果是这样,我需要如何配置 Nginx 来实现这一点?

【问题讨论】:

  • 我猜你已经试过这个答案了吗? *.com/a/20026096/90800
  • 不,但这正是我一直在寻找的(以及我无法找到的)。所以,如果你把你的评论变成答案,我很乐意接受。谢谢:-)!
  • 又是我:对不起,但我不确定它是否真的是我一直在寻找的东西:如果我得到正确的,这将启用客户端缓存,但是我正在寻找服务器端的缓存(我不希望 Nginx 不止一次地接触文件系统)。这是通过这个实现的,还是我在这里遗漏了什么?
  • 我不确定。如果您将文件放在 RAM 磁盘中并将 nginx 指向这个特定的“卷”会怎样?
  • 是的,这可能是可行的。问题是:Nginx 中是否已经有一个选项可以用来实现相同的目标?

标签: caching nginx static-content


【解决方案1】:

操作系统默认在内存中缓存。它被称为page cache。另外,可以开启sendfile,避免内核空间和用户空间之间的数据拷贝。

【讨论】:

  • 所以,换句话说:我不需要做任何事情来获得我想要的行为?
  • 对。如果你有足够的内存来缓存文件,它将被操作系统缓存。
【解决方案2】:

Nginx 作为 HTTP 服务器无法对静态文件或页面进行内存缓存。

Nginx 是一个功能强大且成熟的 HTTP 和代理服务器。但是它在缓存方面的能力似乎有些混乱。 Nginx 服务器在作为纯 Web 服务器运行时无法对文件进行内存缓存。还有……等等什么!?让我换个说法:Nginx HTTP 服务器无法对文件或页面进行内存缓存。

可能的解决方法

Nginx 社区的回答是:没问题,让操作系统为你做内存缓存! 操作系统是由聪明人编写的(真的),并且知道什么、何时、何地以及如何缓存(仅是意见)。因此,他们说,定期将您的静态文件转移到 /dev/null 并相信它会为您缓存您的东西!对于那些好奇和思考的人来说, cat /dev/null 引用与缓存有什么关系?继续阅读以了解更多信息(提示:不要这样做!)。

它是如何工作的?

事实证明,Linux 是一头经过微调的野兽,它对进出缓存的内容保持警惕。该缓存的东西称为页面缓存。页面缓存是内存存储,经常访问的文件部分或全部存储在其中,因此可以快速访问。内核负责跟踪缓存在内存中的文件、何时需要更新或何时需要驱逐。可用的空闲 RAM 越多,页面缓存越大,缓存就“越好”。

更深入的解释请参考下图:

【讨论】:

    最近更新 更多