Unable to get Django Channels Daphne Nginx Supervisor to run: 502 bad gateway

February 28, 2019 768 views
Nginx Django Ubuntu 16.04

I'm trying to traceback through the errors to find the core problem as to why my domain is displaying a 502 bad Gateway error.

I'm running a Django app using Python3+ on Digital Ocean Ubuntu 16.04 using Nginx and supervisor (which manages daphne because ASGI is needed for Django Channels).

I just can't get it to work, I must be missing something.

Both Nginx and Supervisor are running.

The nginx error log shows:

 connect() failed (111: Connection refused) while connecting to upstream, client: 86.xxx.xxx.xxx, server: myapp.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:9000/", host: "www.myapp.com"

Running sudo /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf

2019-02-27 16:39:55,627 CRIT Supervisor running as root (no user in config file)
2019-02-27 16:39:55,627 WARN Included extra file "/etc/supervisor/conf.d/myapp_asgi.conf" during parsing
2019-02-27 16:39:55,629 INFO Creating socket tcp://127.0.0.1:8000
2019-02-27 16:39:55,629 INFO Closing socket tcp://127.0.0.1:8000
Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

my nginx conf file

upstream myapp {
    server 127.0.0.1:8000;
}

server {
    server_name myapp.com www.myapp.com;

    location = /favicon.ico { access_log off; log_not_found off; }

    location / {
        try_files $uri @proxy_to_app;
    }

    location /static/ {
        root /home/me/myapp/src/myapp;
    }

    location /media/  {
        root /home/me/myapp/src/myapp;
        include /etc/nginx/mime.types;
    }

    location @proxy_to_app {
        proxy_pass http://myapp;

        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/myapp.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/myapp.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 {
    if ($host = www.myapp.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = myapp.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name myapp.com www.myapp.com;
    return 404; # managed by Certbot
}

my supervisor config file

[fcgi-program:asgi]
environment=PYTHONPATH=/usr/lib/python3.6/

# TCP socket used by Nginx backend upstream
socket=tcp://localhost:8000

# Directory where your site's project files are located
directory=/home/me/myapp/src/myapp

# Each process needs to have a separate socket file, so we use process_num
# Make sure to update "mysite.asgi" to match your project name
command=/home/me/Env/myapp/bin/daphne -u run/daphne/daphne%(process_nu$

# Number of processes to startup, roughly the number of CPUs you have
numprocs=4

# Give each process a unique name so they can be told apart
process_name=asgi%(process_num)d

# Automatically start and recover processes
autostart=true
autorestart=true

# Choose where you want your log to go
stdout_logfile=/home/me/daphne/logs/asgi.log
redirect_stderr=true

Please if someone could look over this, I've spend days with no progress.

1 Answer

Did you register your domain to allowed hosts in settings.py?

  • Hey I currently have my allowed hosts as [*] so it should allow everything right now.

    • Hey, I have set it up with my specific domain names.
      In addition, at the bottom of the settings.py your code should look like this.

      # Find out what the IP addresses are at run time
      # This is necessary because otherwise Gunicorn will reject the connections
      def ip_addresses():
          ip_list = []
          for interface in netifaces.interfaces():
              addrs = netifaces.ifaddresses(interface)
              for x in (netifaces.AF_INET, netifaces.AF_INET6):
                  if x in addrs:
                      ip_list.append(addrs[x][0]['addr'])
          return ip_list
      
      # Discover our IP address
      ALLOWED_HOSTS += ip_addresses()
      

      Not setting up your allowed hosts appropriately is a common issue when setting up a django project on digital ocean, thats why i am telling you. Making sure that this is set up correctly is important, but I cannot help you with your specific setup, since I dont work with Django Channels Daphne Nginx Supervisor.

      Kind regards

      Marcel Kresse

      • I'm actually not using Gunicorn, only Daphne and Nginx, this is why it's been so difficult to find tutorials as most people are using Gunicorn as well. Anyways, thanks for your help, I will keep this in mind if I end up using it.

  • Does my code look correct?

Have another answer? Share your knowledge.