nginx chiude la connessione su alcune immagini


8

C'è un problema con nginx. Chiude la connessione prima che il client finisca il download. Sembra:

 $ wget -O /dev/null http://www.site.com/images/theme/front/clean.jpg
--2012-07-11 21:37:03--  http://www.site.com/images/theme/front/clean.jpg
Resolving www.site.com (www.site.com)... 123.234.123.234
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 90707 (89K) [image/jpeg]
Saving to: `/dev/null'

26% [===============>                    ] 24,291      --.-K/s   in 8.7s    

2012-07-11 21:37:12 (2.74 KB/s) - Connection closed at byte 24291. Retrying.

--2012-07-11 21:37:13--  (try: 2)  http://www.site.com/images/theme/front/clean.jpg
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 90707 (89K), 66416 (65K) remaining [image/jpeg]
Saving to: `/dev/null'

53% [+++++++++++++++============>        ] 48,555      --.-K/s   in 8.7s    

2012-07-11 21:37:23 (2.74 KB/s) - Connection closed at byte 48555. Retrying.

--2012-07-11 21:37:25--  (try: 3)  http://www.site.com/images/theme/front/clean.jpg
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 90707 (89K), 42152 (41K) remaining [image/jpeg]
Saving to: `/dev/null'

100%[+++++++++++++++++++++++++++========>] 90,707      --.-K/s   in 0.1s    

2012-07-11 21:37:25 (311 KB/s) - `/dev/null' saved [90707/90707]

allo stesso tempo con immagini più piccole va tutto bene:

 $ wget -O /dev/null http://www.site.com/images/theme/front/grease.jpg
--2012-07-11 21:41:28--  http://www.site.com/images/theme/front/grease.jpg
Resolving www.site.com (www.site.com)... 123.234.123.234
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21404 (21K) [image/jpeg]
Saving to: `/dev/null'

100%[====================================>] 21,404      --.-K/s   in 0.07s   

2012-07-11 21:41:29 (316 KB/s) - `/dev/null' saved [21404/21404]

Questo è il motivo per cui questa immagine non può essere disegnata a grandezza naturale nel browser. Posso vederne solo la testa.

Nginx è configurato come front-end e apache come back-end. Il collegamento diretto ad apache funziona bene, quindi c'è un problema in nginx. Ho ragione?

configurazione nginx:

user satellite;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    access_log  /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  0;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    client_max_body_size 100m;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    server {
            listen 123.234.123.234:80;
            server_name site.com www.site.com;
            location ~* ^/(admin/|dump/|webmail/|myadmin/|webim/) {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_redirect http://site.com:8080/ /;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
            }
            location / {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_redirect http://site.com:8080/ /;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_cache ino;
                    proxy_cache_valid 12h;
                    proxy_hide_header "Set-Cookie";
                    proxy_ignore_headers "Cache-Control" "Expires";
            }
            location ~* ^.+\.(jpg|swf|flv|ico|txt|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
                    access_log /home/satellite/logs/site.com.nginx.access.log;
                    error_page 404 = @fallback;
                    if ( $host ~* ^((.*).site.com)$ ) {
                            set $proot /home/satellite/www/$1;
                            break;
                    }
                    if ( $host = "www.site.com" ) {
                            break;
                    }
                    if ( $host = "site.com" ) {
                            break;
                    }

                    root /home/satellite/www/site.com;
            }
            location @fallback {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
            }
    }

dove dovrei scavare per risolvere questo problema?


1
Hai provato a spegnere sendfile?
Vart

Sì, non è cambiato nulla.
precipita il

Risposte:


9

La cosa principale che ho dimenticato è di controllare /var/log/nginx/error.log.

2012/07/12 08:46:44 [crit] 24074#0: *3 open() 
"/var/lib/nginx/proxy/1/00/0000000001" failed (13: Permission denied) 
while reading upstream, client: 109.173.96.30, server: site.com, request: 
"GET /images/theme/front/clean.jpg HTTP/1.1", upstream: 
"http://123.234.123.234:8080/images/theme/front/clean.jpg", 
host: "www.site.com", referrer: "http://www.google.com"

Quindi ho corretto i /var/lib/nginx/proxy/*permessi delle directory ( sudo chown -R www-data:www-data /var/lib/nginx/proxy/*) e ora tutto funziona alla grande. Grazie a tutti per l'aiuto.


Grazie per questo. Sembra ovvio consiglio ma non avevo controllato neanche. Nel mio caso la causa è stata questa: [crit] 6 # 6: * 2577 mkdir () "/ var / cache / nginx / proxy_temp / 8" non riuscito (28: spazio insufficiente sul dispositivo) durante la lettura a monte
Damian Moore,

1

Un possibile motivo per la chiusura della connessione è una connessione lenta e una breve keepalive_timeout. Il valore predefinito per keepalive_timeoutè 75s. Se è troppo corto e la connessione è lenta, potrebbe essere chiusa troppo presto.

http {
    ..
    keepalive_timeout 75;
}

Uno dei motivi per cui il download delle immagini potrebbe essere lento è l'applicazione. Se si utilizza un'applicazione Ruby-on-Rails con una pipeline di risorse in combinazione con Nginx, il download dell'immagine potrebbe essere lento perché si utilizzano URL di immagine errati (senza impronta digitale generata dalla pipeline di risorse). Gli helper di Rails asset_path e image_tag generano i file dei moduli URL corretti con l'impronta digitale che possono essere scaricati rapidamente.


1

Un'altra cosa molto importante da controllare è: assicurati di avere ancora spazio su disco!

Per me è stato come segue:

[user@server]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        30G   29G     0 100% /

Per me, nginx non è stato in grado di scrivere sul disco alla fine causando lo stesso problema! Spero che aiuti qualcuno!


Spiega perché pensi che la mancanza di spazio su disco possa causare la chiusura imprevista di una connessione TCP. E come l'apertura di una nuova connessione TCP risolverà temporaneamente quel problema.
Kasperd,

1
Si certo! Ecco uno scenario: - Nginx funziona come un server proxy - Sta ricevendo un file da apache - Nginx riceve il primo blocco del file (codice di risposta 206) - Scrive il blocco sul disco rigido e invia la richiesta per il blocco successivo - Riceve il blocco successivo e non riesce a scrivere sul disco rigido poiché non rimane spazio! - Nginx chiude la connessione con il codice di risposta 206. Il contenuto completo non è stato offerto al client! Spero che chiarisca!
Raptor,

1
Nel caso di Rush la prima porzione di immagine di dimensioni 24.291 è stata ricevuta con successo. Ciò significa che fino a ~ 24.291 possono essere serviti da nginx direttamente dalla memoria. Ecco perché l'immagine successiva con dimensioni 21.404 è stata pubblicata correttamente in quanto non richiedeva la scrittura su HDD.
Raptor,

0

La tua velocità di download è incredibilmente bassa. (2,74 KB / s!). Ottieni lo stesso risultato quando esegui wget sullo stesso computer in cui si trova Nginx? È possibile che Nginx stia reagendo ragionevolmente a una richiesta tramite un collegamento molto lento.

Altrimenti, raccomando di esplorare le varie direttive temporali nei documenti di Nginx . Cerca ogni menzione di "timeout" sulla pagina e vedi se trovi una buona corrispondenza. Ad esempio, puoi vedere che stai scadendo in quelli che sembrano intervalli di 10 secondi, quindi qualsiasi timeout di circa 10 secondi dovrebbe ricevere un controllo extra.

Ad esempio, la direttiva lingering_timeout è impostata automaticamente su 10 secondi, quindi è possibile verificarlo.

Dovresti anche esaminare perché la connessione con il tuo client è apparentemente così lenta.

Un'altra idea: prova un client alternativo, come curl, e vedrai ottenere lo stesso risultato di quello che fai wget. Se curlfunziona bene, dovresti sospettare che ci sia qualcosa di strano nel wgetfare la richiesta.


Non è un problema per il cliente, perché anche Firefox ha lo stesso problema. L'ho provato da un'altra macchina in diverse geolocalizzazione. Lo stesso comportamento. Inoltre, come puoi menzionare, la velocità è piuttosto buona in una piccola immagine. ps. Sulla macchina in cui si trova nginx è tutto a posto. Quindi proverò a scavare nella direttiva timeout. pps. Non è un problema di rete, perché il collegamento apache diretto alla stessa immagine funziona perfettamente.
precipita l'

0

Controllare il lingering_time valore nginx.conf. L'impostazione predefinita è 30 secondi. Quindi, ciò farà ciò, nginx attenderà un massimo di 30 secondi affinché il client invii i dati.

Se si sta eseguendo un caricamento o un POST di un file che potrebbe richiedere più di 30 secondi per essere completato, il server nginx ripristinerà la connessione al client inviando un pacchetto RST al client se il tempo di caricamento supera i 30 secondi.

Affinché nginx attenda più tempo per ascoltare i dati del client, quindi impostare questo valore su un valore più alto.

Per informazioni dettagliate su lingering_time, guardalo qui lingering_time

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.