Nginx возвращает ошибку 408 при загрузке файлов XHR2 во время загрузки

Nginx возвращает ошибку 408 при загрузке файлов XHR2 во время загрузки

Мой клиент пытается загрузить файл на наш удаленный веб-сервер nginx через форму POST с использованием данных формы XHR2 (и кросс-доменного запроса с CORS). Во время загрузки веб-сервер возвращает 408, и обработчик ошибок ajax останавливает обработку в результате. Файлы находятся в диапазоне 20-120 МБ. Журналы доступа для некоторых загрузок файлов следующие (он пробовал в Chrome 31 и IE11):

[24/Dec/2013:16:44:18 -0500] "OPTIONS / HTTP/1.1" 200 0 "http://www.example.com/files/upload" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"
[24/Dec/2013:16:47:50 -0500] "POST / HTTP/1.1" 408 0 "http://www.example.com/files/upload" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"
...
[27/Dec/2013:01:23:51 -0500] "OPTIONS / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
[27/Dec/2013:01:33:11 -0500] "POST / HTTP/1.1" 408 0 "http://www.example.com/files/upload" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"

Иногда файлы прекрасно загружаются у него с Chrome вместо IE, а иногда наоборот, но большую часть времени ни один из браузеров у него не работает.

Я читал вики nginx, и единственные две настройки, которые коррелируют с ошибками 408, это client_body_timeoutи client_header_timeout. Мне трудно понять значение этих двух директив. Я увеличил обе до 180 секунд, но проблема осталась. Я спросил его, медленное ли у него соединение, и он сказал, что у него 2,5 Мбит/с, что должно быть достаточно быстро, чтобы полностью получить заголовок запроса (но опять же, мы не уверены, что означают эти 2 директивы в соответствии свики, например, что такое «readstep»). Ранее мы успешно получали загрузки объемом 1 ГБ на наш сервер от других клиентов, на что обычно уходило около часа.

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

Я читал, что использование SSL может привести к тайм-аутам, но на сервере SSL не включен, и мы используем только http.

Наш nginx.conf:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 5000;
    # multi_accept on;
}

http {
    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay off;
    keepalive_timeout 25;

    # Increase client/head body_timeout to prevent 408's for slow Internet connections??
    client_header_timeout 180;
    client_body_timeout 180;


    types_hash_max_size 2048;

    server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
        gzip_min_length 256;

        gzip_types
        application/atom+xml
        text/javascript
        application/javascript
        application/json
        application/rss+xml
        application/vnd.ms-fontobject
        application/x-font-ttf
        application/x-web-app-manifest+json
        application/xhtml+xml
        application/xml
        font/opentype
        image/svg+xml
        image/x-icon
        text/css
        text/plain
        text/x-component; 

        # Increase FastCGI buffers
        fastcgi_read_timeout 1500;
        fastcgi_buffers 8 16K;
        fastcgi_buffer_size 32K;

    ##
    # Virtual Host Configs
    ##
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;


}

Конфигурация нашего сервера загрузки:

server {
    listen 80;
    server_name upload.example.com;

    root /var/www/releases/latest/_UPLOAD/public;

    # remove trailing slash, that throws ZF router
    if (!-d $request_filename) {
        rewrite ^/(.*)/$ /$1 permanent;
    }

    # 1.2G upload limit + 10M for post data (which is extremely liberal)
    client_max_body_size 1210M;
    client_body_buffer_size 4M;    

    proxy_max_temp_file_size 0;    

    location = /favicon.ico {
        access_log     off;
        log_not_found  off;
    }

    location = /apple-touch-icon.png {
        access_log off;
        log_not_found off;
    }

    location / {
        # This is for AJAX file uploads... need to set CORS headers
        if ($request_method = OPTIONS ) {
            add_header Access-Control-Allow-Origin '$scheme://www.example.com';
            add_header Access-Control-Allow-Methods 'POST, OPTIONS';
            add_header Access-Control-Allow-Headers 'X-Requested-With, Content-Type, Content-Range, Content-Disposition';
            return 200;
        }

        try_files $uri $uri/ /index.php?$args;
        index index.php index.html index.htm;
    }

    location ~ \.php$ {
        try_files $uri $uri/ /index.php?$args;
        index index.php index.html index.htm;

        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/releases/latest/_UPLOAD/public$fastcgi_script_name;
        fastcgi_param  APPLICATION_ENV production;
        fastcgi_param  PATH /usr/bin:/bin:/usr/sbin:/sbin;
        fastcgi_intercept_errors on;
        include        fastcgi_params;
    }

    error_page 403 =404 /404.html;
    error_page 404 /404.html;
    location = /404.html {
        root /var/www/releases/latest/_UPLOAD/public;
        internal;
    }

    error_page 500 502 503 504 = /50x.html;
    location = /50x.html {
        root /var/www/releases/latest/_UPLOAD/public;
        internal;
    }
}

Есть ли в конфигурации что-то, что может препятствовать успешной загрузке и вызывать эти надоедливые ошибки 408? В журналах ошибок ничего не упоминается об этой проблеме.

ПРИМЕЧАНИЕ: Мы использовали только reloadкогда вносим изменения в конфигурацию nginx. Мы пытаемся избежать a, restartно если это необходимо для того, чтобы наши изменения конфигурации вступили в силу, то мы это сделаем.

Связанный контент