У меня есть 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;
}
}