在 Nginx 上永远在内存中缓存一个静态文件?

Cache a static file in memory forever on Nginx?

我在 Docker 容器中安装了 Nginx 运行,它提供一些静态文件。这些文件将 永远不会 在运行时更改 - 如果它们确实更改,容器将停止,图像将被重建,并启动一个新容器。

因此,为了提高性能,如果 Nginx 只从磁盘读取静态文件一次,然后永远从内存中为它提供服务,那将是完美的。我找到了一些配置缓存的配置选项,但至少从我所看到的 none 来看,它们提供了我正在寻找的这种 "forever" 行为。

这可能吗?如果是这样,我需要如何配置 Nginx 才能实现此目的?

操作系统默认在内存中缓存。它被称为 page cache. In addition, you can enable sendfile 以避免在内核 space 和用户 space 之间复制数据。

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

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

可能的解决方法

Nginx社区的回答是:没问题,让OS为你做内存缓存!OS是聪明人写的(真) 并知道缓存的内容、时间、位置和方式(仅仅是意见)。因此,他们说,定期将您的静态文件 cat 到 /dev/null 并相信它会为您缓存您的东西!对于那些疑惑和思考的人,cat /dev/null 引用与缓存有什么关系?继续阅读以了解更多信息(提示:不要这样做!)。

它是如何工作的?

事实证明,Linux 是一只精巧的野兽,它对进出缓存的内容非常敏锐。那个缓存东西叫做页面缓存。页面缓存是一种内存存储,经常访问的文件部分或全部存储在其中,以便快速访问。内核负责跟踪缓存在内存中的文件、何时需要更新或何时需要将其逐出。可用的空闲 RAM 越多,页面缓存越大,缓存“越好”。

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