Назад | Перейти на главную страницу

Nginx не обслуживает большие файлы

При попытке загрузить большой файл (не уверен, какого размера достаточно, пытаюсь загрузить 5 ГБ), соединение зависает:

$ wget --verbose http://example.net/large.zip -O /dev/null
--2016-12-14 12:52:38--  http://example.net/large.zip
Resolving example.net (example.net)... 1.2.3.4
Connecting to example.net (example.net)|1.2.3.4|:80... connected.
HTTP request sent, awaiting response...

И это продолжается вечно, и под вечностью я имею в виду как минимум 10 минут.

Конфигурация nginx для таких файлов:

location ~* ^.+\.(css|js|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
   access_log off;
   log_not_found off;
   expires 7d;
}

Небольшие статические файлы (а под маленькими я имею в виду, например, 50 МБ) обслуживаются нормально.

Отключение access_log; "по" не помогает, в логах ничего нет по этому запросу.

Изменение типа файла с zip на другой не помогает.

Самое странное, что если я начну загрузку и после этого перезапускаю nginx, загрузка начнется нормально. Но только этот. Если вы начнете новую загрузку после перезапуска сервера, она не будет работать таким же образом.

Ответ, кажется, находится в этих ссылках. Один, два. В основном отключить кеш диска

location / {
  proxy_max_temp_file_size 0;
}

Для меня лекарством были эти две настройки:

В файле: /etc/nginx/nginx.conf

Добавить:

proxy_max_temp_file_size 0;
proxy_buffering off;

Между линиями client_max_body_size 128M; и server_names_hash_bucket_size 256;:

http {

client_max_body_size 128M;
proxy_max_temp_file_size 0;
proxy_buffering off;
server_names_hash_bucket_size 256;

Ой, моя ошибка.

Перед этим сервером был настроен CDN. И потребовалось слишком много времени, чтобы полностью получить эти файлы, прежде чем он начал их обслуживать. Вот почему загрузка началась мгновенно, когда я перезапустил nginx. CDN выдавал неполный файл.