Nginx 为Daphne(Django频道)配置主管

Nginx 为Daphne(Django频道)配置主管,nginx,production-environment,supervisord,django-channels,daphne,Nginx,Production Environment,Supervisord,Django Channels,Daphne,我已经用Django频道创建了一个web应用程序,在尝试设置Supervisor系统时遇到了问题 首先,应用程序在本地运行良好 远程(我在Ubuntu服务器18.04 LTS上使用AWS EC2实例),当使用命令daphne-b 0.0.0.0-p 8000 mysite运行时,它也能正常工作 但是,我无法与主管一起工作。我遵循Django官方渠道文件()的指示,因此我有: nginx配置文件: upstream channels-backend { server localhost:

我已经用Django频道创建了一个web应用程序,在尝试设置Supervisor系统时遇到了问题

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

远程(我在Ubuntu服务器18.04 LTS上使用AWS EC2实例),当使用命令daphne-b 0.0.0.0-p 8000 mysite运行时,它也能正常工作

但是,我无法与主管一起工作。我遵循Django官方渠道文件()的指示,因此我有:

  • 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
    
  • 管理器配置文件:

    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.

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

在下面一行的supervisor 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


问题:

Fabio的答案是替换endpoint参数的file descriptor参数,为这个问题提供了一个快速的解决方法(这似乎是Daphne代码中的一个bug)

但是,Daphne存储库中的修复程序很快就提交了,以便原始指令能够正常工作


作为旁注(对于我在原始问题中提到的仍然出现严重侦听失败的人),请确保套接字文件的物理位置(
/run/daphne/
)是可访问的-我花了太多时间才发现,只要在
/run
目录中创建
daphne
文件夹就可以完成任务(即使我使用
sudo
运行所有内容)。。。为了预防性措施,可以考虑将套接字文件重定向到另一个文件夹,例如“代码>/tMP”,它允许创建一个没有“代码> SUDO 权限的目录。”您是否能够修复?我仍然收到与您的问题相同的错误您是否启用了idea2019-02-09 02:29:03681信息HTTP/2支持2019-02-09 02:29:03681信息配置端点fd:fileno=0 2019-02-09 02:29:03715严重侦听失败:[Errno 88]非套接字上的套接字操作这是我获取的所有套接字文件都是在运行文件夹中创建的。我能够修复
/run/
中的问题i create
daphne
文件夹,然后一切正常。