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