在多台机器和硬盘驱动器上使用 nginx 提供静态文件

Serving static files with nginx on multiple machines and hard drives

我有一个项目将在部署后存储大量媒体内容。项目使用 Python,Django,也通过 Gunicorn 和 Supervisor 运行。

对于静态文件,我将使用 nginx。

我按照 this article 进行的基本设置,但我有一个问题,如何更动态地存储内容。一开始我有一台机器,4个硬盘,每个2Tb,以后会买更多,还有新机器(目前我只有一个).

站点位于 site.com,nginx 位于子域 i.site.com 并且根目录中有 2 个文件夹:/static 用于存储 css、js、svg、e.t.c。设计元素和 /media 将存储什么媒体内容。

问题是设置 nginx 在每个硬盘驱动器上写入媒体,每台机器都会被使用。

为了速度我需要在不同的硬盘驱动器中写入每个新文件(如rotation/loop),例如我保存file1,它写在machine1/hdd1,然后我保存 file2,它写在 machine1/hdd2...file4machine1/hdd4file5machine2/hdd1 (目前我提到我只有一台机器,但以后会更多).

所以,任何人都有经验或想法我该怎么做?我确定 nginx 至少可以在多个硬盘上写入,但是我不确定如果我需要在多台机器上写入媒体数据我该怎么办。 如果您还有其他想法,也请提出来。

您可能会在提到的文章中找到 nginx 配置示例,或者通过关注 this link. I also looking for nginx upstream module,但我实际上不确定是否可以使用它进行配置。

更新: 以前,我写答案时没有过多考虑您要解决的实际问题。您在下面的评论提出了一些我以前忽略的有趣问题。我现在重写了我的答案。希望这会有所帮助。


在这个回答的前一个版本中,我提到了负载平衡。但显然你的问题更多的是文件存储而不是管理负载。

您正在寻找的东西叫做分布式文件系统。分布式文件系统允许您插入许多磁盘并且它可以扩展到多台机器。

DFS 将所有磁盘和机器组合在一起,让您可以像访问单个磁盘一样访问它们。不仅如此,如果您愿意,DFS 软件还可以为您处理文件复制。


我没有使用任何 DFS 的经验,但我读过一些关于 GlusterFS 的内容。我听说这很好,但请随时进行研究。

让我试着解释一下 GlusterFS 是如何工作的。看看这个 图表:

                                                                / Disk 1
                                  / Machine 1 [Gluster Server] |
                                 /                              \ Disk 2
                                /
Nginx  ->  Gluster Client  ->  |
                                \
                                 \                              / Disk 1
                                  \ Machine 2 [Gluster Server] |
                                                                \ Disk 2

无需深入了解太多细节,Gluster 客户端将允许您的 Nginx 服务器从单个目录访问机器 1 和机器 2,如 /media。在这个 /media 目录中,您可以访问两台机器,就像所有数据都存储在 /media 中一样,即使它们存储在不同的机器上。


指南和教程: