Nginx retornando erro 408 com uploads de arquivos XHR2 durante o upload intermediário

Nginx retornando erro 408 com uploads de arquivos XHR2 durante o upload intermediário

Um cliente meu está tentando fazer upload de um arquivo para nosso servidor nginx remoto por meio de um formulário POST usando dados de formulário XHR2 (e uma solicitação de domínio cruzado com CORS). Durante o upload intermediário, o servidor da web retorna um 408 e o manipulador de erros ajax interrompe o processamento como resultado. Os arquivos estão na faixa de 20 a 120 MB. Os registros de acesso para alguns uploads de arquivos são os seguintes (ele tentou no Chrome 31 e no 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"

Às vezes, os arquivos são carregados perfeitamente para ele com o Chrome em vez do IE, e às vezes vice-versa, mas na maioria das vezes nenhum dos navegadores funciona para ele.

Eu tenho lido o wiki do nginx e as únicas duas configurações que se correlacionam com os erros 408 são client_body_timeoute client_header_timeout. Estou tendo dificuldade em entender o significado dessas duas diretivas. Aumentei ambos para 180 segundos, mas o problema persiste. Perguntei a ele se ele tinha uma conexão lenta e ele disse que tinha 2,5 Mbps de up, o que deveria ser rápido o suficiente para receber totalmente o cabeçalho da solicitação (mas, novamente, não temos certeza do que essas duas diretivas significam de acordo com owiki, como o que é um "readstep"). Já recebemos com sucesso uploads de 1 GB para nosso servidor de outros clientes, o que geralmente leva cerca de uma hora para ser concluído.

Para os arquivos problemáticos que recebemos com sucesso de nossos clientes, tentamos fazer upload do mesmo arquivo em vários navegadores e funcionou perfeitamente.

Eu li que o uso de SSL pode causar tempos limite, mas o servidor não tem SSL habilitado e estamos usando apenas http.

Nosso 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/*;


}

Nossa configuração do servidor de upload:

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;
    }
}

Há algo na configuração que possa impedir uploads bem-sucedidos e causar esses incômodos erros 408? Nada é mencionado nos logs de erros sobre esse problema.

NOTA: Usamos apenas reloadquando fazemos alterações na configuração do nginx. Estamos tentando evitar um problema, restartmas se isso for necessário para que nossas alterações de configuração tenham efeito total, nós o faremos.

informação relacionada