gpt4 book ai didi

django - 在 docker 容器中运行 django worker 和 daphne

转载 作者:行者123 更新时间:2023-12-02 18:08:49 25 4
gpt4 key购买 nike

我有在 docker 容器中运行的 django 应用程序。最近我发现我需要将 websockets 接口(interface)添加到我的应用程序中。我在 nginx 和 redis 后面使用带有 daphne 的 channel 作为缓存。问题是我必须在 1 个容器中运行 django worker 和 daphne。在容器启动时运行的脚本:

#!/usr/bin/env bash

python wait_for_postgres.py
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --no-input

python manage.py runworker --only-channels=http.* --only-channels=websocket.* -v2
daphne team_up.asgi:channel_layer --port 8000 -b 0.0.0.0

但它依赖于运行一个 worker。我试过 nohup 但它似乎不起作用。如果我使用 docker exec 直接从容器运行 daphne,一切正常。

最佳答案

这是一个老问题,但我想我还是会回答它,因为我最近遇到了同样的问题,并且认为我可以对此有所了解。

Django channel 如何工作

Django Channels 是 Django 之上的另一层,它有两种进程类型:

  • 一个接受 HTTP/Websockets 的
  • 运行 Django View 、Websocket 处理程序、后台任务等的一个

基本上,当一个请求进来时,它首先到达接口(interface)服务器(Daphne),它接受 HTTP/Websocket 连接并将其放入 Redis 队列。然后工作人员(消费者)看到它,将其从队列中取出并运行 View 逻辑(例如 Django View 、WS 处理程序等)。

为什么它对你不起作用

因为您只运行 worker(消费者),它会阻止接口(interface)服务器(生产者)的执行。这意味着,不会接受任何连接,工作人员只是盯着一个空的 Redis 队列。

我是如何让它发挥作用的

我将 Daphne、redis 和 workers 作为单独的容器运行,以便于扩展。数据库迁移、静态文件收集等仅在 Daphne 容器中执行。此容器将仅运行一个实例,以确保没有运行并行数据库迁移。

另一方面,Worker 可以按比例放大和缩小以处理传入的流量。

如何让它发挥作用

将您的设置分成至少两个容器。我不建议在一个容器中运行所有内容(例如使用 Supervisor)。为什么?因为当需要扩展设置时,没有简单的方法可以做到。您可以将您的容器扩展到两个实例,但这只会创建另一个包含 daphne、redis、django 的主管……如果您将 worker 从 daphne 中分离出来,您可以轻松地扩展 worker 容器以处理不断增长的传入请求。

一个容器可以运行:

#!/usr/bin/env bash

python wait_for_postgres.py
python manage.py migrate
python manage.py collectstatic --no-input

daphne team_up.asgi:channel_layer --port 8000 -b 0.0.0.0

而另一个:

#!/usr/bin/env bash

python wait_for_postgres.py
python manage.py runworker --only-channels=http.* --only-channels=websocket.* -v2

“makemigrations”命令

没有必要在您提供的脚本中运行命令,如果有的话它可能会阻止整个事情,因为它正在等待输入的某些问题(例如“您是否将列 X 重命名为 Y?”)。

相反,您可以像这样在正在运行的容器中执行它:

docker exec -it <container_name> python manage.py makemigrations

关于django - 在 docker 容器中运行 django worker 和 daphne,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37905539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com