NGINX 94134#94134 upstream преждевременно закрыл соединение при чтении заголовка ответа от upstream - Django, Ubuntu

Когда пользователь в моем Django-приложении, установленном на Ubuntu с DigitalOcean (v18+), выбирает несколько файлов для отправки на сервер, он видит следующую ошибку:

502 Bad Gateway
nginx/1.18.0 (Ubuntu)

Я проверил журналы приложения, в которых обнаружена следующая ошибка:

2022/08/05 11:13:38 [error] 94134#94134: *108 upstream prematurely closed connection while reading response header from upstream, client: 31**.***,***.23, server: 15**.***.***2, request: "POST /profil/galrtia/apartment-rent/1/ HTTP/1.1", upstream: "http://unix:/home/app/run/gunicorn.sock:/profil/galrtia/apartment-rent/1/", host: "1***.***.***2", referrer: "http://15**8.***.***82/profil/galrtia/apartment-rent/1/"

Ошибка возникает примерно через 3-4 секунды после загрузки файлов на сервер. Я пытался увеличить лимиты в моей конфигурации NGINX на файлы и таймаут, но безрезультатно (я все еще вижу ошибку). Моя конфигурация выглядит следующим образом:

upstream app_server {
    server unix:/home/app/run/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;

    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name 1**.**.***.**2;

    keepalive_timeout 10000;
    client_max_body_size 10G;

    access_log /home/app/logs/nginx-access.log;
    error_log /home/app/logs/nginx-error.log;

    # Compression config
    gzip on;
    gzip_min_length 1000;
    gzip_buffers 4 32k;
    gzip_proxied any;
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    location /static/ {
        alias /home/app/static/;
    }

    location /media/ {
        alias /home/app/app/app/media/;    }

    # checks for static file, if not found proxy to app
    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
}

Если пользователь отправляет 2-3 фотографии, все работает нормально. Проблема возникает при отправке 5 и более фотографий. Приложение является тестовым, поэтому я установил такие большие лимиты. Как я могу избежать ошибки NGINX? Как решить мою проблему, чтобы она не возникала при передаче большого количества файлов?

Я считаю upstream бесполезным и вызывающим проблемы, не уверен, что это решит вашу проблему, но попробуйте, удалите upstream вообще, и ваш @proxy_to_app, и попробуйте по-старому:

server {
    listen 80;

    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name 1**.**.***.**2;

    keepalive_timeout 10000;
    client_max_body_size 10G;

    access_log /home/app/logs/nginx-access.log;
    error_log /home/app/logs/nginx-error.log;

    # Compression config
    gzip on;
    gzip_min_length 1000;
    gzip_buffers 4 32k;
    gzip_proxied any;
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    location /static/ {
        alias /home/app/static/;
    }

    location /media/ {
        alias /home/app/app/app/media/;    
    }


    location / {
      proxy_pass http://unix:/home/app/run/gunicorn.sock;
    }
}

Также ваша ошибка может быть в том, что в вашем upstream вы использовали unix без http, вы сделали:

server unix:/home/app/run/gunicorn.sock fail_timeout=0;

и это может понадобиться:

server http://unix:/home/app/run/gunicorn.sock;

Изменение размера дроплета на DigitalOcean решило мою проблему. Мой процессор не был превышен, и количество переданных файлов по отношению к полученному размеру дропа также было в пределах лимита до изменения. Я не знаю, почему это решило проблему

Вернуться на верх