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