2013-07-29 14 views
5

Configurazione:non possono caricare file di grandi dimensioni con Nginx (Reverse Proxy + SSL di negoziazione) e Tomcat

  • Nginx come proxy inverso + negoziazione SSL
  • Apache Tomcat.

Tutto sembra funzionare correttamente, tranne che per il caricamento del file. Per qualche motivo, il caricamento di file non viene mai completato. Con la configurazione elencata di seguito, sono in grado di caricare file di piccole dimensioni (4K). Il caricamento fallisce su un file di 194K. Quando aumento "client_body_buffer_size" a 256K, posso caricare il file 194K, ma un caricamento di file 500K non riesce. Aumentare "client_body_buffer_size" oltre 256K non ha alcun impatto.

Nota: quando accedo direttamente a Tomcat e carico il file 500K, termina in pochi millisecondi.

Quindi, sembra che qualcosa non funzioni con la configurazione di Nginx. Qualsiasi suggerimento è molto apprezzato.

upstream tomcat_server { 
     server 127.0.0.1:9090 fail_timeout=0; 
     keepalive 16; 
    } 

location/{ 
       root /xyz; 
       proxy_http_version 1.1; 
      proxy_pass http://tomcat_server; 
      proxy_set_header Connection ""; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-Server $host; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      proxy_buffering   on; 
      proxy_connect_timeout 75; 
      proxy_send_timeout 180; 
      proxy_read_timeout 1200; 

     keepalive_timeout 120; 
     proxy_buffer_size 128k; 
     proxy_buffers 4 256k; 
     proxy_busy_buffers_size 256k; 
     proxy_temp_path /tmp/nginx/proxy; 
     proxy_temp_file_write_size 1000m; 

      } 

Ho provato ad aggiungere diversi altri parametri di configurazione nginx (client_body_temp_path, proxy_temp_path, proxy_temp_file_write_size). Non sembravano aiutare.

====

Update - 2013/07/30:

Ulteriori indagini hanno rivelato che abbiamo problemi di caricare file di 196k e verso l'alto. Il file 194K funziona. Il valore "client_body_buffer_size" è impostato su 256K.

Nginx registri di debug mostrano quanto segue in caso di failue:

2013/07/30 16:29:57 [debug] 14208#0: *1 recv: fd:11 2606 of 16384 
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy status 200 "200 OK" 
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header: "Server: Apache-Coyote/1.1" 
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header: "Content-Type: text/html;charset=utf-8" 
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header: "Date: Tue, 30 Jul 2013 22:29:57 GMT" 
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header: "Connection: close" 
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header done 
2013/07/30 16:29:57 [debug] 14208#0: *1 xslt filter header 
2013/07/30 16:29:57 [debug] 14208#0: *1 HTTP/1.1 200 OK^M 
Server: nginx/1.5.2^M 
Date: Tue, 30 Jul 2013 22:29:57 GMT^M 
Content-Type: text/html;charset=utf-8^M 
Transfer-Encoding: chunked^M 
Connection: keep-alive^M 

2013/07/30 16:29:57 [debug] 14208#0: *1 write new buf t:1 f:0 000000001E61DAD8, pos 000000001E61DAD8, size: 168 file: 0, size: 0 
2013/07/30 16:29:57 [debug] 14208#0: *1 http write filter: l:0 f:0 s:168 
2013/07/30 16:29:57 [debug] 14208#0: *1 http cacheable: 0 
2013/07/30 16:29:57 [debug] 14208#0: *1 posix_memalign: 000000001E62D450:4096 @16 
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy filter init s:200 h:0 c:0 l:-1 
2013/07/30 16:29:57 [debug] 14208#0: *1 http upstream process upstream 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe read upstream: 1 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe preread: 2465 
2013/07/30 16:29:57 [debug] 14208#0: *1 readv: 1:13778 
2013/07/30 16:29:57 [debug] 14208#0: *1 readv() not ready (11: Resource temporarily unavailable) 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe recv chain: -2 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe buf free s:0 t:1 f:0 000000001E61DBD0, pos 000000001E61DC5D, size: 2465 file: 0, size: 0 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe length: -1 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe write downstream: 1 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe write busy: 0 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe write: out:0000000000000000, f:0 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe read upstream: 0 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe buf free s:0 t:1 f:0 000000001E61DBD0, pos 000000001E61DC5D, size: 2465 file: 0, size: 0 
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe length: -1 
2013/07/30 16:29:57 [debug] 14208#0: *1 event timer add: 11: 180000:1375223577332 
2013/07/30 16:29:57 [debug] 14208#0: *1 http upstream request: "/upload/html?" 
2013/07/30 16:29:57 [debug] 14208#0: *1 http upstream send request handler 
2013/07/30 16:29:57 [debug] 14208#0: timer delta: 6 
2013/07/30 16:29:57 [debug] 14208#0: posted events 0000000000000000 
2013/07/30 16:29:57 [debug] 14208#0: worker cycle 
2013/07/30 16:29:57 [debug] 14208#0: epoll timer: 179994 

noto "http monte invio gestore della richiesta" al precedente frammento di registro, dove come in caso di successo, vedo questo:

2013/07/30 16:29:44 [debug] 14208#0: *1 http upstream dummy handler 

Qualche idea su cosa significano "http upstream send request handler" e "http upstream dummy handler" e cosa significano?

risposta

12

L'impostazione che stai cercando è probabilmente client_max_body_size.

Sintassi: client_max_body_size size;
Impostazione predefinita: client_max_body_size 1 m;
Contesto: http server, posizione

Imposta la dimensione massima consentita del corpo della richiesta del cliente, specificata nel campo richiesta di intestazione “Content-Length”. Se la dimensione in una richiesta supera il valore configurato, l'errore 413 (Richiedi entità troppo grande) viene restituito al client. Si prega di essere consapevoli del fatto che i browser non possono visualizzare correttamente questo errore. L'impostazione della dimensione su 0 disabilita il controllo della dimensione del corpo della richiesta del client.

+1

Ho client_max_body_size specificato a livello "http": client_max_body_size 1000M; client_body_buffer_size 256k; – kpdev

7

Ho avuto lo stesso problema. La risposta di Michael Härtl è corretta. Nel mio caso questa è stata la configurazione che ha fatto il trucco:

In nginx.conf aggiungere:

http { 
    # at the END of this segment! 
    client_max_body_size 1000m; 
} 
Problemi correlati