代码之家  ›  专栏  ›  技术社区  ›  Mojtaba

在多个django(VMs)服务器之间共享媒体

  •  1
  • Mojtaba  · 技术社区  · 4 年前

    我们已经部署了django服务器(nginx/gunicorn/django),但是为了扩展服务器,同一个django应用程序有多个实例在运行。

    以下是示意图(架构):

    enter image description here

    每个蓝色矩形都是一个虚拟机。

    HAProxy向示例发送所有请求。com/admin到服务器3。其他请求在服务器1和服务器2之间分配。(负载平衡)。

    老问题:

    每台机器都有一个媒体文件夹,当管理员上传内容时,上传的媒体只在服务器3上。(普通用户无法上传任何内容)

    我们通过向示例发送所有请求来解决这个问题。com/media/*到服务器3,来自服务器3的nginx提供所有静态文件和媒体。

    现在的问题

    我们也在使用sorl缩略图。

    例如,当一个请求出现时。com/,sorl thumbnail尝试访问媒体文件,但此计算机上不存在该文件,因为它位于服务器3上。

    因此,现在所有对该机器(服务器1或服务器2)的请求都会得到该媒体文件的404。

    想到的一个解决方案是在所有3台机器之间创建一个共享分区,并将其用作介质。 另一个解决方案是在每次上传后同步所有媒体文件夹,但这个解决方案存在问题,即我们每秒有近2000个请求,有时同步速度可能不够快,sorl缩略图会创建空文件的数据库记录,并发生404次。

    提前谢谢,很抱歉问了这么长时间。

    0 回复  |  直到 4 年前
        1
  •  2
  •   Amrit    4 年前

    你应该使用对象存储来保存和服务你的用户上传的文件。 django-storages 使实现变得非常简单。

    如果您不想使用基于云的AWS S3或同等产品,您可以使用 minio .

    在您当前的设置中,我看不到任何简单的方法来修复虚拟机数量随负载而变化的问题。

    如果你有部署自动化,那就试试吧 rsync 因此,虚拟机负责与其他虚拟机同步文件。

        2
  •  0
  •   Mojtaba    4 年前

    问题:问题是什么?

    我们在其他机器上得到了404,因为正常的请求(请求模板)会得到一个在缩略图媒体上找不到的404。 真正的问题是sorl缩略图模板标签。

    以下是我们最终的行动:

    在需要缩略图的模型中,我们添加了创建特定缩略图的函数。

    使用 post-save signal 在管理机器中,调用所有这些函数,以确保保存后创建所有缩略图,并填充sorl缩略图的表格。

    现在在模板中,我们不再调用sorl缩略图模板标记,而是在模型中调用函数。