这是扩展 Nginx 以提供静态内容服务的合理方法吗?

这是扩展 Nginx 以提供静态内容服务的合理方法吗?

我需要设置一些 VPS 来提供静态内容(许多小文件)。我计划为此使用 Nginx,并希望对其进行设置,以便我们能够相对轻松地进行扩展。要求如下:

  • 许多文件(至少数十万个)。
  • 文件大小小(小于 10KB)。
  • 邻近服务器上的应用程序不断添加文件。
  • 新文件必须立即可供所有 Nginx 服务器使用。

我目前的计划是:

  • 拥有一个带有 NFS 共享的“主”服务器,其中包含所有文件。
  • 生成新文件的应用程序仅与主文件交互。
  • 有多个 Nginx 服务器挂载此 NFS 共享。
  • 跨 Nginx 实例进行负载平衡。

一个明显的问题是,“主”服务器是单点故障(有什么补救措施吗?)。 我还忽略了其他潜在问题吗?这里是否存在无法通过这种方式很好地扩展的元素?有人会建议采用其他方法吗?

关于内存要求,我假设我应该为每个 Nginx 服务器提供尽可能多的内存,以便可以缓存热门文件(通过 OS?Nginx?),而不必不断地从 NFS 共享中请求。

最后,我不使用 CDN 是不是疯了?

答案1

NFS 无法扩展。它会增加每一个请求,最终会成为太大的瓶颈。我们在工作中也遇到过类似的问题,但涉及照片(因此,文件大得多),我们编写了自己的软件来分片和分发它们。对于像您这样的几 GB 文件,您可能能够通过对所有服务器执行 HTTP PUT 并在服务器离线时重新同步来避免上传过程。

或者用另一种方法解决这个问题:拥有一个(一组)中央服务器,其中包含所有文件和缓存反向代理(squid、pound、varnish),它们实际上将文件提供给客户。

不使用 CDN 并不会让你发疯。但如果你不调查一下它是否值得,那你就是疯了 :-)

答案2

使用缓存文件(以及带有 cachefs 的最新 Linux 内核)将 NFS 文件缓存到本地 HD。这样,每次读取 nfs 时都会将文件复制到 /var/cache/fs 目录,下一次读取将从那里开始,内核会在 nfs 中检查内容是否仍然有效。

这样,您就可以拥有一个中央 NFS,但又不会损失本地文件的性能

当可用大小/ inode 达到配置的级别时,Cachefilesd 将负责清理旧文件,这样你就可以从 NFS 提供不常见的数据,并从 HD 提供常见请求

设置完成后,使用 varnish 来传递内容,它将缓存最常用的请求,从而节省大量对 nginx/NFS 的请求。

这里是一个小型的 cachefilesd 操作指南。

答案3

我建议为此获取单个(可能专用)服务器,而不是使用多个单独的 VPS 服务器和nginx通过 连接的单独实例nfs。如果您正在考虑使用 VPS 和 NFS,我认为您对可扩展性的担忧是不合理的。

nginx几乎所有的缓存都是通过机器的文件系统进行的,因此,如果您要为此使用 nginx,则必须确保拥有具有出色文件系统性能和缓存的操作系统。确保您的内核有足够的缓存vnodes等。

如果您仍在考虑使用单独的机器(我的建议与上述相同,即使用一台机器和一个 nginx),那么研究一下 可能是有意义的varnish。Varnish 在虚拟内存中执行所有缓存,因此,您不必担心 vnode 或较小文件的缓存效率低下。由于它使用虚拟内存,因此其缓存可以与物理内存 + 交换一样大。

我强烈建议不要使用 squid。如果您想知道原因,只需查看 varnish 演示文稿,其中描述了为什么虚拟内存是加速代理的最佳选择。但 varnish 只能加速,因此如果您使用的是具有静态文件和良好文件系统缓存的单个主机(例如 FreeBSD),那么 nginx 可能是最佳选择(否则,使用 varnish,您最终会在多个位置对相同的内容进行双重缓存)。

答案4

任何生产服务器设计都不可能存在单一故障点。

因此,您至少需要两台机器作为负载均衡器,您可以使用类似的负载均衡器HAProxy。它具有您可能需要的所有功能,请查看此 HAproxy 架构示例。您将面临的实际请求负载是通过 NFS 存储系统进行的“大量小文件请求”。

缓存的数量取决于您的资源和客户端请求。可以配置 HAProxy 以添加或删除缓存服务器。

NFS 文件请求是最苛刻的操作,因此您需要在“缓存”机器中使用某种形式的缓存。

缓存服务器有 3 个存储层,您希望最常用的文件在本地可用,最好在 RAM 中。

  • NFS,迄今为止最慢。(远程)
  • 本地存储,速度快。(本地)
  • Ram,超快。(本地)

这可以通过 nginx、squid 或 varnish 来解决。

nginx 可以使用以下方式在本地缓存文件慢速文件系统,这是一个很好的慢速文件系统教程

使用此系统的 Nginx 将文件存储在本地文件系统磁盘中并从那里提供它们。您可以使用 PURGE 从缓存中删除已修改的文件。这就像在请求字符串中使用单词“purge”发出请求一样简单。

具有 Slow FS 的 Nginx 使用操作系统提供的 RAM,增加操作系统可用的 nginx RAM 将提高请求平均速度。但是,如果您的存储超出了服务器 RAM 大小,您仍然需要在本地文件系统中缓存文件。

Nginx 是一个多用途服务器,它的速度不是特别快。至少没有 squid 或 varnish 等静态缓存服务器快。但是,如果您的问题是 NFS,那么 Nginx 可以解决 90% 的问题。

Squid 和 Varnish 速度非常快,并且具有从缓存中删除文件的 API。

Squid 使用 RAM 和本地文件系统作为缓存。Varnish 使用 RAM 作为缓存。

Squid 已经很旧了,并且大多数基准测试表明,varnish 比 squid 调度静态文件的速度更快。

然而,当 varnish 崩溃时,内存缓存会丢失,整个服务器可能需要很长时间才能恢复。因此,崩溃对 varnish 来说是一个大问题。

Squid 可以更好地处理崩溃,因为它也使用本地存储磁盘,并且可以从那里重新启动一些缓存,而不是使用 NFS。

为了获得提供小型静态文件的最佳性能,您可以使用 Nginx 和 Squid 或 Varnish。

其他文件大小需要采用不同的方法。

相关内容