Ошибка длинного задания Nginx + uWSGi + Django Bad Gateway - PullRequest
1 голос
/ 12 марта 2019

У меня есть длинная задача в одном из представлений моего django, для создания ответа на который требуется 120-200 секунд.

Для этого конкретного представления Nginx вызывает 502 Bad Gateway через 1 минуту с этим сообщением об ошибке вlogs:

[error] 7719#7719: *33 upstream prematurely closed connection while reading response header from upstream,

вот мои конфигурации Nginx:

upstream DjangoServer {
    server      127.0.0.1:8000;
    keepalive   300;
}
location / {
    include             proxy_params;
    proxy_pass          http://DjangoServer;
    allow               all;
    proxy_http_version  1.1;
    proxy_set_header    X-Cluster-Client-Ip $remote_addr;

    client_max_body_size    20M;
    keepalive_timeout       300;
    proxy_connect_timeout   300;
    proxy_send_timeout      300;
    proxy_read_timeout      300;
    send_timeout            300;
}

А вот мои конфигурации uWSGI:

uid=www-data
gid=www-data
http=127.0.0.1:8000
http-keepalive=300
master=1
vacuum=1
workers=2
threads=5
log-5xx=1

Примечание:

  • Nginx и uWSGI отлично работают для всех остальных представлений.
  • Сервер разработки Django может выполнить задачу без проблем.
  • После ошибки Nginx 502 uWSGI продолжает работать в фоновом режиме изавершает работу (в соответствии с заявлением о печати).
  • Если я попытаюсь подключиться к uWSGI через браузер, через некоторое время (менее 120 секунд) он скажет ERR_EMPTY_RESPONSE.

Вы можете принять на себя задачу, подобную этой

def long_task_view(request):
    start_time = time.time()
    print(start_time)
    # doing stuff
    time.sleep(130)
    print(time.time() - start_time)
    return HttpResponse("The result")

1 Ответ

0 голосов
/ 12 марта 2019

Вы можете попытаться увеличить время ожидания nginx:

vim /etc/nginx/nginx.conf

Добавьте это в http:

http {
     ...
     fastcgi_read_timeout 300;
     ...
}

Но лучше всего создать асинхронный процесс для обработкиметод, который берет.Я обычно сельдерей для асинхронной задачи.

...