Um cliente meu está tentando enviar um arquivo para nosso servidor nginx remoto por meio de um formulário POST usando dados de formulário XHR2 (e uma solicitação entre domínios com CORS). Durante o carregamento médio, o servidor da Web retorna um 408 e o manipulador de erros do ajax interrompe o processamento como resultado. Os arquivos estão no intervalo de 20 a 120 MB. Os registros de acesso para alguns dos uploads de arquivos são os seguintes (ele já experimentou o Chrome 31 e o 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 serão enviados perfeitamente para ele com o Chrome, em vez do IE, e às vezes vice-versa, mas na maioria das vezes nenhum navegador funcionará para ele.
Eu tenho lido o wiki nginx e as duas únicas configurações que se correlacionam com os erros do 408 são client_body_timeout
e client_header_timeout
. Estou tendo dificuldade em entender o significado dessas duas diretrizes. Eu aumentei 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, o que deveria ser rápido o suficiente para receber o cabeçalho da solicitação (mas, novamente, não temos certeza do que essas 2 diretivas significam de acordo com a wiki , como o que é uma "readstep". Recebemos com sucesso envios de 1 GB para nosso servidor antes 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 nosso cliente, tentamos fazer o upload do mesmo arquivo em vários navegadores e funcionou perfeitamente.
Eu li que usar SSL pode causar os tempos limite, mas o servidor não tem SSL ativado 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;
}
}
Existe alguma coisa na configuração que possa impedir o envio bem-sucedido e estar causando esses erros 408 incômodos? Nada é mencionado nos logs de erros sobre esse problema.
NOTA: Usamos apenas reload
quando fazemos alterações na configuração do nginx. Estamos tentando evitar um restart
, mas se isso for necessário para que nossas alterações de configuração tenham efeito total, faremos isso.