Question

connect() failed (111: Connection refused) while connecting to upstream

Posted November 8, 2020 76 views
NginxUbuntuDjangoPython FrameworksUbuntu 18.04

I have a One-Click MySQL/phpMyAdmin Droplet, I have stopped Apache2 from listening on port 80, I’m trying to deploy my Django project using Gunicorn and Nginx.
Here is my Django settings.py file

import os
import datetime
from datetime import timedelta

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

DEBUG = True

ALLOWED_HOSTS = ['0.0.0.0', 'MyDropletIP']

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',
    # 'django_seed',
    'rest_framework'
]


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]


ROOT_URLCONF = ''

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],  # os.path.join(SETTINGS_PATH, 'templates')
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = ''

CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_METHODS = [
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
]

CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
]


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'HOST': "",
        'USER': "",
        'PASSWORD': ,
        'PORT': "3306",
    }

}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

REST_FRAMEWORK = {

    'DEFAULT_PAGINATION_CLASS': 'news.serialiazers.PageNumberPagination',
    'PAGE_SIZE': 10,
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',

    ),
    # 'PAGE_COUNT':'page.paginator.count'
}


AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',  # this is default
    'guardian.backends.ObjectPermissionBackend',
)

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Africa/Cairo'

USE_I18N = True

USE_L10N = False

USE_TZ = False


STATIC_ROOT = os.path.join(BASE_DIR, "static/")
STATIC_URL = '/static/'
AUTH_USER_MODEL = 'users.User'

Here is my Gunicorn service file

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=my_user
Group=www-data
WorkingDirectory=/home/my_user/my_project
ExecStart=/home/my_user/.local/bin/gunicorn --timeout 30 workers 15 --bind 0.0.0.0:8000 my_project.wsgi:application
[Install]
WantedBy=multi-user.target

Gunicorn socket file

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock
SocketUser=www-data

[Install]
WantedBy=sockets.service

Nginx configuraion in /etc/nginx/sites-available/myprojectnginx.conf

upstream django {
server 0.0.0.0:8000
fail_timeout=15;
}
server listen 80;
server_name my_droplet_ip;
charset utf-8;
client_max_body_size 4G;
location /media {
alias /home/my_user/my_project/media;
}
location /static {
alias /home/my_user/my_project/static;
}
location / {
uwsgi_pass django;
include /home/my_user/my_project/uswgi_params;
proxy_set_header Host $host;
proxy_pass http://my_droplet_ip:8000;
proxy_set_header XForwardedHost $server_name;
proxy_set_header XReal-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
}

Error in /var/log/nginx/error.log

connect() failed (111: Connection refused) while connecting to upstream, client: client_ip, server: my_droplet_ip, request: "GET /favicon.ico HTTP/1.1", upstream: "http://my_droplet_ip:8080/favicon.ico", host: "my_droplet_ip", referrer: "http://my_droplet_ip"

Output of netstat -l

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:mysql           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN     
tcp        0      0 localhost:domain        0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:http               [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
udp        0      0 localhost:domain        0.0.0.0:*                          
raw6       0      0 [::]:ipv6-icmp          [::]:*                  7          
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     SEQPACKET  LISTENING     11724    /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     1072359  /run/user/1000/systemd/private
unix  2      [ ACC ]     STREAM     LISTENING     1072363  /run/user/1000/gnupg/S.dirmngr
unix  2      [ ACC ]     STREAM     LISTENING     1072364  /run/user/1000/snapd-session-agent.socket
unix  2      [ ACC ]     STREAM     LISTENING     1072365  /run/user/1000/gnupg/S.gpg-agent.browser
unix  2      [ ACC ]     STREAM     LISTENING     1072366  /run/user/1000/gnupg/S.gpg-agent.extra
unix  2      [ ACC ]     STREAM     LISTENING     1072367  /run/user/1000/gnupg/S.gpg-agent.ssh
unix  2      [ ACC ]     STREAM     LISTENING     1072368  /run/user/1000/gnupg/S.gpg-agent
unix  2      [ ACC ]     STREAM     LISTENING     11720    /run/lvm/lvmetad.socket
unix  2      [ ACC ]     STREAM     LISTENING     11731    /run/systemd/journal/stdout
unix  2      [ ACC ]     STREAM     LISTENING     1045169  /run/gunicorn.sock
unix  2      [ ACC ]     STREAM     LISTENING     12094    /run/lvm/lvmpolld.socket
unix  2      [ ACC ]     STREAM     LISTENING     172172   /var/run/supervisor.sock.30741
unix  2      [ ACC ]     STREAM     LISTENING     16301    /run/acpid.socket
unix  2      [ ACC ]     STREAM     LISTENING     16357    @ISCSIADM_ABSTRACT_NAMESPACE
unix  2      [ ACC ]     STREAM     LISTENING     16345    /var/lib/lxd/unix.socket
unix  2      [ ACC ]     STREAM     LISTENING     16323    /var/run/dbus/system_bus_socket
unix  2      [ ACC ]     STREAM     LISTENING     16333    /run/uuidd/request
unix  2      [ ACC ]     STREAM     LISTENING     86135    /run/snapd.socket
unix  2      [ ACC ]     STREAM     LISTENING     86136    /run/snapd-snap.socket
unix  2      [ ACC ]     STREAM     LISTENING     19112    /var/run/mysqld/mysqld.sock
unix  2      [ ACC ]     STREAM     LISTENING     74383    /run/systemd/private

output of ufw status

Status: active

To Action From


22/tcp LIMIT Anywhere

443/tcp ALLOW Anywhere

80/tcp ALLOW Anywhere

3306 ALLOW Anywhere

Nginx HTTP ALLOW Anywhere

8000/tcp ALLOW Anywhere

8001/tcp ALLOW Anywhere

8080 ALLOW Anywhere

22/tcp (v6) LIMIT Anywhere (v6)

443/tcp (v6) ALLOW Anywhere (v6)

80/tcp (v6) ALLOW Anywhere (v6)

3306 (v6) ALLOW Anywhere (v6)

Nginx HTTP (v6) ALLOW Anywhere (v6)

8000/tcp (v6) ALLOW Anywhere (v6)

8001/tcp (v6) ALLOW Anywhere (v6)

8080 (v6) ALLOW Anywhere (v6)

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

×
1 answer

Hello @abdelnasserahmed96,

Usually the

connect() failed (111: Connection refused) while connecting to upstream

error is related to an error with your Application/configuration rather than Nginx.

Try to remove http:// from the proxy_pass in the Nginx configuration.
The reason is that Gunicorn is listening on a unix socket (the –bind argument). Then Nginx should forward traffic to this socket. http:// stands for a TCP socket in a regular IP:PORT, which is not your case.

Regards,
KFSys

Submit an Answer