![通过 NFS 使用 nginx 提供静态文件服务?](https://linux22.com/image/567342/%E9%80%9A%E8%BF%87%20NFS%20%E4%BD%BF%E7%94%A8%20nginx%20%E6%8F%90%E4%BE%9B%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
我有一个网站,它在 nginx 服务器上每秒收到大约 7k 个请求。此服务器既处理对 Apache 服务器的重写,也直接提供静态文件、图像等。静态文件是其中最大的部分,大约有 5k 个请求。
通过架构升级,我考虑使用一个中央文件服务器,通过 NFS 导出包含这些静态文件的目录。这些文件没有写访问权限,因此该目录可以以只读方式挂载在 nginx 计算机上。我主要关心的是:
NFS 的速度够快吗?NFS 可以处理的请求数有限制吗?这样做时,是否有一些“必备”选项?
补充:除了 NFS 之外,还有其他的替代方案吗?
谢谢!
答案1
通过设置中央 NFS 服务器,您会在设计中引入单点故障。仅这一点就应该成为交易的破坏者。如果不是这样,NFS 的速度足以满足这样的负载。关键因素是拥有足够的 RAM 来缓存文件、低延迟互连(Gig-E 或更好)和调优(比以前更少)。
您还应该认真考虑使用 rsync 或类似工具来保持每个单独的 Web 服务器上静态文件更新的本地副本。另一个选择可能是 SAN 或冗余 NFS 服务器解决方案(两者都比 rsync 想法复杂得多且成本高得多)。
答案2
我用缓存文件(以及带有 cachefs 的最新 Linux 内核)将 NFS 文件缓存到本地 HD。这样,每次读取 nfs 时都会将文件复制到 /var/cache/fs 目录,下一次读取将从那里开始,内核会在 nfs 中检查内容是否仍然有效。
这样,您就可以拥有一个中央 NFS,但又不会损失本地文件的性能
当可用大小/ inode 达到配置的级别时,Cachefilesd 将负责清理旧文件,这样你就可以从 NFS 提供不常见的数据,并从 HD 提供常见请求
当然,也可以使用 varnish 来缓存更常见的请求,从而节省 nginx/NFS 的服务时间。
这里是一个小的cachefilesd howto
答案3
速度取决于许多因素:
- 您的服务器将如何连接到 NFS 目标?单个双端口 SAS 磁盘可以利用 6gbit/s 的传输速度。如果您计划使用 1gig 以太网(可以从中减去 20% 的 TCP 开销),请记住这一点。
- NFS 服务器将获得哪种类型的缓存?您是否使用具有大量缓存的企业级阵列控制器?读取缓存是此设置的关键
- 有多少服务器将同时访问同一个文件?NFS 锁定可能会造成严重影响
通过 NFS 打开文件的限制是主机操作系统的限制。例如,FreeBSD 有许多不同的调整选项来支持大的打开文件的数量,但这取决于服务器的 RAM 数量。
中央文件服务器的替代方案是使用 Web 服务器之间的同步/复制(如 Chris S 所建议的)。rsync 或 DRBD 可能是一种很好且经济高效的选择。
答案4
我建议不要使用 NFS,除非你在其中添加一些缓存。nginx 缓存总比没有好,但 Varnish 更好。
话虽如此,如果您的负载变为更多动态内容而不是静态内容,那么从本地磁盘提供应用程序文件将变得更加重要。
如果引入 NFS,请确保具有冗余。