为 Daphne 配置主管(Django 频道)

Configuring Supervisor for Daphne (Django Channels)

我用 Django Channels 创建了一个 Web 应用程序,我在尝试设置 Supervisor 系统时遇到了问题。

首先,该应用程序在本地运行良好。

远程(我将 AWS EC2 实例与 Ubuntu Server 18.04 LTS 一起使用),当 运行 使用命令 daphne -b 0.0.0.0 -p 8000 mysite.asgi:application 时,它也运行良好。

但是,我无法让它与 Supervisor 一起使用。我遵循官方 Django 频道文档 (https://channels.readthedocs.io/en/latest/deploying.html) 的说明,因此我有:

这样设置时,网页不工作(504网关超时)。在 Supervisor 日志文件中,我看到:

2018-11-14 14:48:21,511 INFO     Starting server at fd:fileno=0, unix:/run/daphne/daphne0.sock
2018-11-14 14:48:21,516 INFO     HTTP/2 support enabled
2018-11-14 14:48:21,517 INFO     Configuring endpoint fd:fileno=0
2018-11-14 14:48:22,015 INFO     Listening on TCP address 127.0.0.1:8000
2018-11-14 14:48:22,025 INFO     Configuring endpoint unix:/run/daphne/daphne0.sock
2018-11-14 14:48:22,026 CRITICAL Listen failure: [Errno 2] No such file or directory: '1416' -> b'/run/daphne/daphne0.sock.lock'
2018-11-14 14:48:22,091 INFO     Starting server at fd:fileno=0, unix:/run/daphne/daphne2.sock
2018-11-14 14:48:22,096 INFO     HTTP/2 support enabled
2018-11-14 14:48:22,097 INFO     Configuring endpoint fd:fileno=0
2018-11-14 14:48:22,135 INFO     Starting server at fd:fileno=0, unix:/run/daphne/daphne3.sock
2018-11-14 14:48:22,152 INFO     HTTP/2 support enabled
2018-11-14 14:48:22,153 INFO     Configuring endpoint fd:fileno=0
2018-11-14 14:48:22,237 INFO     Listening on TCP address 127.0.0.1:8000
2018-11-14 14:48:22,241 INFO     Listening on TCP address 127.0.0.1:8000
2018-11-14 14:48:22,242 INFO     Configuring endpoint unix:/run/daphne/daphne3.sock
2018-11-14 14:48:22,242 CRITICAL Listen failure: [Errno 2] No such file or directory: '1419' -> b'/run/daphne/daphne3.sock.lock'
2018-11-14 14:48:22,252 INFO     Configuring endpoint unix:/run/daphne/daphne2.sock
2018-11-14 14:48:22,252 CRITICAL Listen failure: [Errno 2] No such file or directory: '1420' -> b'/run/daphne/daphne2.sock.lock'

等等

请注意,在 Supervisor 命令中,Daphne 进程以另一种方式(使用其他参数集)调用,而不是我之前 运行 - 不是地址和端口参数,而是套接字参数和文件描述符(我对此一无所知)。我怀疑这是遇到错误的原因。

我们将不胜感激任何帮助或建议。

相关软件包版本:

channels==2.1.2
channels-redis==2.2.1
daphne==2.2.1
Django==2.1.2

编辑:

当我为套接字文件创建空文件时(在 Supervisor 配置文件的 Daphne 命令中存在),即。 /run/daphne/daphne0.sock/run/daphne/daphne1.sock 等,则日志文件显示以下内容:

2018-11-15 10:24:38,289 INFO     Starting server at fd:fileno=0, unix:/run/daphne/daphne0.sock
2018-11-15 10:24:38,290 INFO     HTTP/2 support enabled
2018-11-15 10:24:38,280 INFO     Configuring endpoint fd:fileno=0
2018-11-15 10:24:38,458 INFO     Listening on TCP address 127.0.0.1:8000
2018-11-15 10:24:38,475 INFO     Configuring endpoint unix:/run/daphne/daphne0.sock
2018-11-15 10:24:38,476 CRITICAL Listen failure: Couldn't listen on any:b'/run/daphne/daphne0.sock': [Errno 98] Address already in use.

问题:这些文件不应该是空的吗?它们应该包括什么?

在主管 ASGI 配置文件中,在以下行中

command=/home/ubuntu/django_app/venv/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers mysite.asgi:application

--fd 0 替换为 --endpoint fd:fileno=0

问题:https://github.com/django/daphne/issues/234

Fabio 的回答是将文件描述符参数替换为端点参数,为这个问题提供了一个快速解决方法(这似乎是 Daphne 代码中的一个错误)。

但是,Daphne 存储库中的修复很快就提交了,因此原始说明可以正常工作。

作为旁注(对于那些仍然遇到我在原始问题中写到的严重监听失败的人),请确保套接字文件的物理位置(/run/daphne/ 在我的例子中)是可访问的 -我花了太多时间才发现只需在 /run 目录中创建 daphne 文件夹就可以完成这项工作(即使我 运行 所有内容都带有 sudo)...为了预防可以考虑将套接字文件重定向到另一个文件夹的措施,例如/tmp 允许在没有 sudo 权限的情况下创建目录。