Django, Nginx и Gunicorn - сброс загрузки для больших файлов

Мы работаем над созданием сайта на Django вместе с NginX и Gunicorn. Нам необходимо обеспечить возможность загрузки больших tar.gz файлов (до 30Go), которые постоянно хранятся в древовидной структуре.

Однако, когда мы скачиваем один из этих архивов (~9Go), мы получаем 1-2 первых Go, затем загрузка сбрасывается и заново инициализируется с 0.

Журналы показали, что у рабочего был тайм-аут.

Я пробовал обслуживать файлы по размеру кусков с помощью Django: без изменений Я пытался установить значения time_out в conf-файле NginX: без изменений Единственным способом заставить загрузку идти до конца было установить неограниченный таймаут (timeout 0) в файле gunicorn.service.

Я не очень хорошо понимаю, зачем мне нужно устанавливать этот неограниченный таймаут на Gunicorn... Я думал, что NginX сможет управлять загрузкой файлов.

Можете ли вы, пожалуйста, просветить меня о причинах этого? Что мы делаем не так? Большое спасибо за помощь

gunicorn.service

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

[Service]
User=dev
Group=www-data
WorkingDirectory=/web
ExecStart=/web/env/bin/gunicorn \
          --access-logfile - \
          --workers 4 \
          --timeout 0 \
          --bind unix:/run/gunicorn.sock \
          amused_website.wsgi:application

[Install]
WantedBy=multi-user.target

/etc/nginx/sites-enabled/website

server {
        listen 80;
        server_name myservername;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl default_server;
        server_name mysername;
        ssl_certificate /etc/ssl/myservername_cert.cer;
        ssl_certificate_key /etc/ssl/myservername.key;

        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;

        location = /favicon.ico {
                access_log off; log_not_found off;
        }

        location /static/ {
                root /web/frontend;
        }

        location /data/ {
                try_files $uri = 404;
                sendfile on;
                tcp_nopush on;
                tcp_nodelay on;
                root /web/frontend;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/run/gunicorn.sock;
        }
}

Функция загрузки Django

def full_data_download(request, field_name):
    
    the_file = os.path.dirname(os.path.realpath(__file__)) +field_name+'_FULL.tar.gz'
    filename = os.path.basename(the_file)
    chunk_size = 8192
    response = FileResponse(FileWrapper(open(the_file, 'rb'), chunk_size),
                            content_type=mimetypes.guess_type(the_file)[0])
    response['Content-Length'] = os.path.getsize(the_file)    
    response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
    return response
Вернуться на верх