【问题标题】:Serving static files with nginx on multiple machines and hard drives在多台机器和硬盘上使用 nginx 提供静态文件
【发布时间】:2018-05-23 13:15:03
【问题描述】:

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

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

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

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

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

对于我需要将每个新文件写入不同硬盘驱动器(如旋转/循环)的速度,例如我保存file1,它写在machine1/hdd1,然后我保存file2,它写在machine1/hdd2...file4machine1/hdd4file5machine2/hdd1(目前我提到我只有一台机器,但将来会更多)。 p>

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

您可以在上述文章中找到 nginx 配置示例,或关注this link。我也在寻找 nginx upstream module,但实际上我不确定是否可以使用它进行配置。

【问题讨论】:

  • 你说的是什么媒体?您说的是静态文件,但您似乎在考虑用户上传的文件;是哪个?
  • @DanielRoseman 可能我没有说清楚,但我的意思是两者,将/static 文件存储在我编写的文件(CSS、JS、SVG、图标等)和/media 文件的位置由用户上传。虽然静态文件占用空间小,但媒体需要大量空间,一个 HDD 不足以存储所有文件。问题是关于如何在多个驱动器和机器上拆分它们,但要保持 URL 更清晰,而不是像 server1234hdd1.site.com 这样的东西,因为在我的情况下,拥有专辑和媒体很重要,应该像 /media/some/url/1.png, 2.png, 3 一样访问。 png 或其他类型:jpg、gif、mp4 等

标签: django nginx configuration network-programming storage


【解决方案1】:

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


在此答案的先前版本中,我提到了负载平衡。但很明显,您的问题更多是关于文件存储而不是管理负载。

您正在寻找的称为分布式文件系统。分布式文件系统允许您插入许多磁盘,并且可以横向扩展至多台机器。

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 服务器从单个目录(例如 /media)访问机器 1 和机器 2。在这个/media 目录中,您可以访问这两个机器,就像所有数据都存储在/media 中一样,即使它存储在不同的机器上。


指南和教程:

【讨论】:

  • 好的,这看起来就像我问的那样,但我只有一个未发现的问题,我目前无法测试。在您的示例中,让我们猜测每台服务器至少有 2 个 HDD,文件在一台服务器内的 nginx 配置中只有一个副本(在一个 HDD 和一台服务器上)我可以使用 try_files 从所有地方检查媒体,但是如果媒体在其他服务器?它返回什么? 404?或者它会自动向下一个服务器发出请求? (我认为 - 没有)如果没有,我该怎么办?
  • 我会尝试一下,稍后再写会发生什么。 附言我在 Debian 上有服务器。
猜你喜欢
  • 2019-02-13
  • 1970-01-01
  • 2021-09-03
  • 2015-07-30
  • 2019-02-22
  • 2018-06-06
  • 2016-05-23
  • 2017-11-19
  • 2023-03-05
相关资源
最近更新 更多