Django + Nginx + Gunicorn: [ошибка] 2194 # 2194: * 15 восходящее преждевременно закрытое соединение при чтении заголовка ответа из восходящего потока - PullRequest
0 голосов
/ 12 октября 2018

У меня есть API, который я создал, используя Django 2.1, DRF, Gunicorn, Nginx и Tensorflow.Я выполняю это на Droplet с Ubuntu 18.04 x64 и 1 ГБ памяти.

API настроен так, что он позволяет только методу POST вызывать API.При отправке запроса API будет ожидать файл zip и ответит на строку.

Когда я впервые использую это на моей локальной машине, ничего не пошло не так.Однако, когда я перемещаю его в облако и использую nginx и gunicorn для обслуживания API, я получаю следующую ошибку от nginx 'error.log

[error] 1186#1186: *9 upstream prematurely closed connection while reading response header from upstream, client: CLIENT_IP_ADDRESS, server: HOST_IP_ADDRESS, request: "POST /api/beta/some-app/ HTTP/1.1", upstream: "http://unix:/home/user-name/django-api/django.sock:/api/beta/some-app/", host: "HOST_IP_ADDRESS".

После изучения многихвопросы об этой ошибке, я решил включить следующую запись в моем приложении django settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    'handlers': {
        'fileDebug': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': "/var/log/debug_django.log",
        },
        'fileError': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': "/var/log/debug_django.log",
        },
        'fileCritical': {
            'level': 'CRITICAL',
            'class': 'logging.FileHandler',
            'filename': "/var/log/debug_django.log",
        },

    },
    'loggers': {
        'django': {
            'handlers': ['fileDebug'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'django': {
            'handlers': ['fileError'],
            'level': 'ERROR',
            'propagate': True,
        },
        'django': {
            'handlers': ['fileCritical'],
            'level': 'CRITICAL',
            'propagate': True,
        },
    },

}

Имя файла для журнала ошибок приложения django находится в /var/log/debug_django.log.Журнал ошибок для gunicorn также находится в том же каталоге, что и /var/log/gunicorn_error.log.

После того, как я попытался отправить тот же самый запрос POST, я все еще получил ту же ошибку от nginx.Тем не менее, debug_django.log не выдавал никакой ошибки (фактически, он не выводил никакой информации, такой как INFO или DEBUG), а 'gunicorn_error.log' не выводил ошибок также при запуске sudo tail -F /var/log/gunicorn_error.log

sudo tail -F /var/log/gunicorn_error.log output

[2018-10-12 17:46:33 +0000] [1282] [INFO] Using worker: sync
[2018-10-12 17:46:33 +0000] [1299] [INFO] Booting worker with pid: 1299
[2018-10-12 17:46:33 +0000] [1300] [INFO] Booting worker with pid: 1300
[2018-10-12 17:46:33 +0000] [1302] [INFO] Booting worker with pid: 1302
[2018-10-12 17:47:09 +0000] [1315] [INFO] Booting worker with pid: 1315
[2018-10-12 17:57:40 +0000] [1406] [INFO] Booting worker with pid: 1406

Я не совсем уверен.Что происходит с бэкэндом (или upstream согласно nginx).Пара случаев из Stackoverflow - ошибка тайм-аута или слишком большой размер файла.Но согласно журналу, gunicorn такого не испытывал.Я попытался удалить http:// из файла nginx site-enabled (называемого django), но это просто заставляет nginx выдавать ошибку о том, что ему нужен этот префикс.

Прошла неделяили так, и я не нашел способа преодолеть это.

У кого-нибудь есть идеи по этому поводу?Заранее спасибо.

Вот файлы для gunicorn и nginx

/ etc / systemd / system / gunicorn.service

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

[Service]
User=user-name
Group=www-data
WorkingDirectory=/home/user-name/django-api
ExecStart=/home/user-name/myproject/myprojectenv/bin/gunicorn --access-logfile gunicorn_access.log --error-logfile /var/log/gunicorn_error.log --log --workers 3 --bind unix:/home/user-name/django-api/django.sock DjangoAPI.wsgi:application

[Install]
WantedBy=multi-user.target

/ etc / nginx / sites-enabled / django

upstream django {
    server unix:/home/user-name/django-api/django.sock;
}

server {
    listen 80;
    server_name HOST_IP_ADDRESS;
    client_max_body_size 200M;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/user-name/django-api/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/user-name/django-api/django.sock;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_buffers 8 32k;
        proxy_buffer_size 64k;
        proxy_request_buffering off;
        proxy_buffering off;
        proxy_ignore_client_abort on;
    }
}
...