Nginx - очень медленный upload
Alexander Sobcanyuk
sasa на algosoft.ru
Пт Июн 17 11:17:39 MSD 2011
Добрый день
Столкнулись с таким не понятным эффектом
Очень не быстрый upload больших файлов на сервер через nginx в связке с
apache
(сервер в локалке, пробовали две разные железки, на обеих FreeBSD 7.1 & 7.2)
1. Вначале было так:
sendfile on;
keepalive_timeout 65;
gzip on;
server {
client_max_body_size 100m;
root /*/htdocs;
index index.php index.html index.htm;
location / {
try_files $uri @back;
}
location @back {
proxy_pass http://192.168.0.1:8000;
proxy_set_header X-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Request-Uri $request_uri;
}
}
При попытке загрузить через форму файл в 80Mb загрузка длится несколько
минут.
Интересно, что загрузка через Chrome занимает ~20 секунд, тогда как IE6-8,
Opera, FF загружают файл на порядок медленнее
При работе напрямую с apache (через *:8000) загрузка занимает ~10 секунд во
всех броузерах
2. Был установлен модуль upload:
Добавился
location /upload {
# Pass altered request body to this location
upload_pass @back;
# gzip off;
# client_body_in_file_only clean;
# client_body_temp_path /*/tmp;
# directio 4m;
# sendfile on;
# client_body_buffer_size 128k;
# upload_buffer_size 128k;
# keepalive_timeout 0;
# tcp_nopush on;
# tcp_nodelay on;
# Store files to this location
upload_store /*/tmp;
# Set specified fields in request body
upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.content_type
"$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
# Inform backend about hash and size of a file
upload_aggregate_form_field "$upload_field_name.size"
"$upload_file_size";
# Pass matching fields from client to backend
upload_pass_form_field "^uarea|action|action2|id|do|sb$";
upload_limit_rate 0;
upload_cleanup 400-505;
}
Теперь файл через Chrome загружается ~12-15 секунд, а в остальных броузерах
- несколько минут.
В FF и Opera до какого-то момента скорость загрузки ~1Mb/s а потом скачком
падает до ~150kb/s.
Причем момент, когда это происходит каждый раз разный - наблюдали, что это
происходило когда было закачено от 25Mb до 40 Мб
В IE6 иногда с самого начала устанавливается низкая скорость ~150kb/s. а
иногда вначале ~1Mb/s а потом ускоряется до 2-3Mb/s и загрузка происходит за
40-50с.
Пробовали делать загрузку с разных машин (win2000, XP, Vista, win2008server)
и из разных подсетей.
Пробовали на 2-х разных серверах (разное железо, разные минорные версии
FreeBSD и nginx)
Пробовали в location /upload прописать все, что казалось хоть как-то может
повлиять на обработку запроса (см. закомментаренные строки). Все комбинации
этих параметров конечно не перебирали, но те, что пробовали ничего не дали.
Сервер практически не нагружен:
CPU: 1.3% user, 0.0% nice, 2.3% system, 1.5% interrupt, 94.9% idle
Как сделать, чтобы аплоадить файлы напрямую через apache мы знаем, хотя
этого хотелось избежать по многим причинам
В чем может быть дело?
Спасибо
Александр
Подробная информация о списке рассылки nginx-ru