Nginx прерывает загрузку статических файлов раньше
У меня есть приложение Flask, которое перенаправляет запросы, которые должны получать статические файлы в NGINX через x-accel-redirect. В некоторых случаях эти загрузки будут отключены до завершения. Например, через cURL я бы увидел:
curl http://my_server/some_static_file.tar > temp.tar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
77 14.4G 77 11.2G 0 0 55.8M 0 0:04:24 0:03:25 0:00:59 58.9M
curl: (18) transfer closed with 3449105332 bytes remaining to read
Похоже, что это происходит чаще всего с очень большими файлами (10 ГБ +), но я видел, что это также происходит с небольшими файлами ~90 МБ. Журналы доступа Nginx показывают запросы, поступающие и обслуживаемые разными, неполными объемами данных:
1.2.3.4 - - [18/Apr/2017:01:16:26 +0000] "GET /some/flask/static/file/path HTTP/1.1" 200 15146008576 "-" "curl/7.38.0" "5.6.7.8"
1.2.3.5 - - [18/Apr/2017:01:16:29 +0000] "GET /some/flask/static/file/path HTTP/1.1" 200 15441739776 "-" "curl/7.38.0" "6.7.8.9"
errors.log
ничего полезного
Моя соответствующая конфигурация колбы выглядит следующим образом:
response = make_response('')
response.headers.set('X-Accel-Redirect', '/_special_nginx_path/' + file_name)
response.headers.set('Content-Disposition', 'attachment',
filename=file_name)
# have tried both with and without setting content-length
response.headers.set('Content-Length', os.path.getsize(file_path))
try:
response.mimetype = mimetypes.guess_type(file_name)[0]
if not response.mimetype:
response.mimetype = 'application/octet-stream'
except AttributeError:
response.mimetype = 'application/octet-stream'
return response
Моя соответствующая конфигурация NGINX выглядит следующим образом (где сервер uWSGI, на котором запущено мое приложение фляги, работает с 127.0.0.1:1234):
location / {
proxy_pass http://127.0.0.1:1234;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /_special_nginx_path {
internal;
alias /path/to/static/files;
}
1 ответ
Пожалуйста, проверьте использование вашего диска, это может произойти из-за этого, сначала проверьте журналы ошибок nginx, журнал ошибок может иметь такие журналы, как:
2018/10/28 14:20:24 [crit] 5432 # 5432: * 75 pwritev () "/ var / lib / nginx / uwsgi / 1/00/0000000001" не удалось (28: на устройстве не осталось места) во время чтения вверх по течению,
Сначала определите, на каком разделе нет свободного места. Вы можете сделать это, набрав в терминале следующую команду:
df -h
Теперь вы увидите следующие детали на экране:
Файловая система. Размер. Используемый. Имеется в наличии. Используемый. Прикреплено к.
Просмотрите подробности раздела и проверьте, не достиг ли ли он дискового пространства до 100%.
Найдя раздел, откройте его и удалите ненужные файлы, чтобы освободить место на диске и устранить проблему.
Если раздел монтируется в системной памяти (указывается каталогом TMPFS), выполните приведенную ниже команду, чтобы отключить его.
Размонтируйте path_to_the_directory.
Теперь перезапустите Nginx. Ошибка теперь исчезнет из файла.
Чтобы в будущем не осталось свободного места при ошибке устройства, отредактируйте файл конфигурации Nginx (или файл конфигурации вашего сайта) и увеличьте значение ключевой зоны.
Пользователи сталкиваются с проблемой, потому что они настраивают ОС для обслуживания файлов кэша из ОЗУ. Хотя это может быстро повысить производительность вашего сайта, оно уменьшает объем оперативной памяти, доступной для других приложений, работающих на сервере, и приводит к ошибке нехватки памяти.
Если ваш сервер использует SSD вместо HDD, вам не нужно монтировать раздел в системную память.
Благодаря блогу, который помог мне...