Настройка супервизора для Daphne (каналы Django) - PullRequest
0 голосов
/ 14 ноября 2018

Я создал веб-приложение с каналами Django, с которыми я сталкиваюсь с проблемами при настройке системы Supervisor.

Для начала приложение работает хорошо.

Удаленно (Я использую экземпляр AWS EC2 с Ubuntu Server 18.04 LTS), при запуске с командой daphne -b 0.0.0.0 -p 8000 mysite.asgi:application он также работает хорошо.

Однако я не могу заставить его работать с Supervisor.Я следую инструкциям из официальных документов Django Channels (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 процесс Дафни вызывается другим способом (с другим набором параметров), чем я запускал раньше - вместо параметров для адреса и порта,Есть параметры для сокетов и файловых дескрипторов (о которых я совсем не знаю). Я подозреваю, что это является причиной обнаруженной ошибки.

Любая помощь или предложения будут высоко оценены.

Соответствующие версии пакетов:

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

РЕДАКТИРОВАТЬ:

Когда я создаю пустые файлы для файлов сокетов (которые присутствуют в команде для Дафни в файле конфигурации Supervisor), т.е./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.

Вопрос: не должны ли эти файлы быть пустыми?Что они должны включать?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Ответ Фабио с заменой параметра дескриптора файла на параметр конечной точки представляет собой быстрый обходной путь для этой проблемы (которая, по-видимому, была ошибкой в ​​коде Дафны).

Однако исправление в хранилище Дафнибыло быстро зафиксировано, чтобы оригинальные инструкции работали хорошо.

В качестве дополнительного примечания (для людей, которые по-прежнему получают критические ошибки прослушивания, о которых я писал в первоначальном вопросе), пожалуйста, убедитесь, что физическое расположение файлов сокетов (/run/daphne/ в моем случае) доступен - я потратил слишком много времени, просто чтобы обнаружить, что простое создание папки daphne в каталоге /run делает свою работу (даже если я запускаю все с sudo) ... Для предосторожностимеры, которые можно рассмотреть, перенаправив файлы сокетов в другую папку, например /tmp, которая позволяет создавать каталог без разрешения sudo.

0 голосов
/ 23 ноября 2018

В конфигурационном файле 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

...