我用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)的说明,因此我拥有:
nginx配置文件:
upstream channels-backend {
server localhost:8000;
}
server {
server_name www.example.com;
keepalive_timeout 5;
client_max_body_size 1m;
access_log /home/ubuntu/django_app/logs/nginx-access.log;
error_log /home/ubuntu/django_app/logs/nginx-error.log;
location /static/ {
alias /home/ubuntu/django_app/mysite/staticfiles/;
}
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_pass http://channels-backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
listen 80;
server_name www.example.com;
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
return 404; # managed by Certbot
}
主管配置文件:
[fcgi-program:asgi]
socket=tcp://localhost:8000
directory=/home/ubuntu/django_app/mysite
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
numprocs=4
process_name=asgi%(process_num)d
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/django_app/logs/supervisor_log.log
redirect_stderr=true
以这种方式设置后,该网页将无法正常工作(504网关超时)。在主管日志文件中,我看到:
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.
问题:这些文件不应该为空吗?它们应该包括什么?
答案 0 :(得分:1)
在超级用户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
。
答案 1 :(得分:0)
Fabio的答案是将文件描述符参数替换为端点参数,从而提供了解决此问题的快速方法(这似乎是达芙妮代码中的错误)。
但是,很快就落实了Daphne存储库中的修复程序,以便使原始说明正常工作。
作为旁注(对于仍然遇到严重的听觉失败的人,这是我在原始问题中提到的),请确保可访问套接字文件的物理位置(在我的情况下为/run/daphne/
)-我花了太多时间只是为了发现仅在daphne
目录中创建/run
文件夹就可以完成这项工作(即使我使用sudo
运行所有内容)...出于预防措施,可以考虑重定向套接字文件到另一个文件夹,例如/tmp
允许您创建未经sudo
许可的目录。