这是一个合理的方式来缩放Nginx的静态内容服务?

我需要设置一些VPS来提供静态内容(很多小文件)。 我打算为此使用Nginx,并希望将其设置为使我们能够相对容易地扩展。 要求是:

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

我目前的计划是:

  • 有一个包含所有文件的NFS共享的“主”服务器。
  • 生成新文件的应用程序仅与主服务器交互。
  • 有多个Nginx服务器挂载这个NFS共享。
  • 在Nginx实例之间进行负载平衡。

一个明显的问题是,“主”服务器是单点故障(对此有任何补救措施?)。 还有其他潜在的问题,我忽略了吗? 这里有哪些元素不能很好地扩展? 有人会build议一种替代方法?

关于内存要求,我假设我应该尽可能地给每个Nginx服务器,以便热文件可以被caching(通过OS?Nginx?),不必从NFS共享中不断地被请求。

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

NFS不会扩展。 它增加了每个请求的延迟,并最终成为一个太大的瓶颈。 我们在工作上有类似的问题,但是有照片(所以文件要大得多),编写我们自己的软件来分解和分发。 对于像你这样的几GB的文件,你可能能够摆脱上传过程,对所有的服务器做HTTP PUT,并在服务器脱机时进行重新同步。

或者以另一种方式解决:有一套(中央服务器)具有所有文件和caching反向代理(鱿鱼,磅,清漆)实际上为客户提供文件。

而你不疯狂不使用CDN。 你疯了,如果你不调查是否值得,但:-)

使用cachefilesd (和最近的linux内核,使用cachefs)将NFS文件caching到本地HD。 这样,nfs中的每个读取操作都会将文件复制到/ var / cache / fs目录,然后将从那里读取下一个读取内容,如果内容仍然有效,内核将检查nfs。

这样你可以有一个中央的NFS,但不会丢失本地文件的性能

当空闲大小/ inode达到configuration级别时,Cachefilesd将负责清理旧文件,以便可以从NFS中提供非常见数据,并从HD中提供常见请求

设置完成后,使用清漆来传递内容,它将caching大部分使用的请求,从而为nginx / NFS节省大量的请求。

这里是一个小的cachefilesd howto。

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

nginx几乎可以通过机器的文件系统完成所有的caching,所以,如果你打算使用nginx,你必须确保有一个具有出色文件系统性能和caching的操作系统。 确保你的内核有足够的vnodes

如果你还在考虑单独的机器(我的build议,如上所述,使用一台机器与一个nginx),那么调查varnish可能是有意义的。 Varnish在虚拟内存中执行所有的caching操作,因此,您不必担心vnodes或caching文件较小的低效率问题。 由于它使用虚拟内存,因此其caching可以与物理内存+交换一样大。

我会强烈build议对付鱿鱼。 如果你想知道为什么,只要看一下清漆演示,它描述了为什么虚拟内存是加速代理的最佳方式。 但是,清漆只能加速,所以如果你使用一个具有静态文件和良好的文件系统caching(例如FreeBSD)的主机,那么nginx可能是最好的select(否则,用清漆,你会得到相同的内容双caching在多个地方)。

没有生产服务器devise可以有一个单一的故障点。

因此,您至less需要两台机器作为负载平衡器,您可以使用像HAProxy这样的负载平衡器。 它具有您可能需要的所有function,请查看此HAproxy结构示例。 您将面临的实际请求负载是NFS存储系统上的“大量小文件请求”。

caching的数量取决于您的资源和客户端请求。 HAProxy可以configuration为添加或删除caching服务器。

NFS文件请求是最苛刻的操作,因此在“caching”机器中需要一种cachingforms。

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

  • NFS,是目前最慢的。 (远程)
  • 本地存储,快速。 (本地)
  • 拉姆,超快。 (本地)

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

nginx可以使用SlowFscaching本地文件,这是一个很好的慢速教程

带有这个系统的Nginx将文件存储在本地文件系统磁盘中,并从那里提供服务。 您可以使用PURGE从caching中删除已修改的文件。 这与在请求string中使用“清除”一词发出请求一样简单。

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

Nginx是一个多用途的服务器,它不是非常快。 至less不如静态caching服务器(如squid或varnish)快。 但是,如果你的问题是NFS,那么Nginx解决了90%的问题。

鱿鱼和清漆速度非常快,并有apis从caching中删除文件。

Squid使用RAM和本地文件系统来caching。 清漆使用RAM来caching。

鱿鱼是旧的,大多数基准显示,清漆速度比鱿鱼更糟糕的静态文件。

但是,当清漆崩溃,RAMcaching丢失,整个服务器可能需要很多时间恢复。 因此,碰撞是清漆的一大问题。

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

为了获得最佳性能,可以使用Nginx和Squid或Varnish。

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