Jump to content
Sign in to follow this  
xnavigator

usare gli header connection? (close o keepalive?

Recommended Posts

analizzando gli header inviati dal mio server, non c'è nessun header che definisce la connection se deve essere close o keep alive..

 

secondo voi cambia qualcosa ad usare quest'header? o l'uno vale l'altro?

 

grazie

Share this post


Link to post
Share on other sites
analizzando gli header inviati dal mio server, non c'è nessun header che definisce la connection se deve essere close o keep alive..

 

secondo voi cambia qualcosa ad usare quest'header? o l'uno vale l'altro?

 

grazie

 

hola :)

 

beh direi che cambia un mondo!

 

Quando non specificato la connessione è di tipo CLOSE ovvero dopo che la richiesta viene eseguita il webserver deve chiudere la connessione. Quella di tipo Keep Alive invece permette al browser, o in generale al client, di effettuare più richieste HTTP nella stessa connessione.

 

La differenza? Considera che il webserver deve spawnare un fork/thread (o recuperarne uno dalla cache dei fork/thread) per gestire la tua connessione e quindi risparmi TANTO lavoro perché dato che la connessione e sempre la stessa non fa nulla in più. Inoltre considera che cosi elimini l'overhead di dato dal kernel e dalle librerie base del so che vanno a gestire il tutto che, se pur minimo, c'è sempre e su un alto numero di connessioni si fa sentire.

 

ovviamente ci sono i risvolti della medaglia: un numero troppo elevato di connessioni keep alive permette a chi vuol far danno di killare la macchina! Anche se c'è un timeout (ovvero una durata massima per la connessione keep alive) in quel frangente una singola richiesta viene mantenuta e quindi bisogna fare meno lavoro per saturare le richieste di una macchina ... infatti invece di startare sempre a rotazione, per dire, 100 connessioni ... 10 (mettendo che 10 sia il limite di connessioni keep alive) saranno sempre sature per 15/20 secondi e quindi l'attacker ha bisogno di una potenza di calcolo un pò più ridotta per saturare le connessione ... la conseguenza è che si saturano più facilmente le macchine!

 

E' fondamentale trovare un giusto compromesso che non uccida la macchina sotto attacco o sotto carichi elevati e nel frattempo non blocchi il client che tenta di risparmiare operazioni :)

Share this post


Link to post
Share on other sites

Salve,scusate se riutilizzo questo thread ma mi pare il più consono al mio problema.

Io ho un piccolo pannello in php/mysql creato da me che mi gestisce news con relativo lato amministrativo. Un piccolo cms.

Il problema è il seguente: nell'header non specifico se la connessione è di tipo keep-alive oppure close (vedo che pochissimi lo impostano).

Ad ogni modo caricando questo piccolo cms su un dedicato con apache2 e php5 l'header è keep-alive.

In un altro dedicato con nginx 1.0.4+ php-fpm mi da close.

 

Ho cercato molto in giro,ma non ho trovato nessun problema di questo tipo.

Avete già avuto problemi di questo tipo?

Io avrei la necessità,per problemi di latenza,di utilizzarlo con il keep-alive,ma non so come muovermi.

Cosa sbaglio? Devo controllare qualche impostazione particolare su nginx o php-fpm?

 

Vi ringrazio anticipatamente.

Share this post


Link to post
Share on other sites

Devi intervenire su nginx, la gestione delle connessioni è fatta lato server.

Non sono troppo sicuro ma se cambi l'header Connection da PHP il webserver molto probabilmente lo sovrascriverà con il suo.

 

Per fare quello che chiedi devi intervenire su nginx.

Share this post


Link to post
Share on other sites

Bene,grazie mille per le informazioni. Veniamo alla parte pratica.

Avevo già provato a mettere nel .config di nginx:

keepalive_timeout 70 70;

keepalive_requests 10;

 

riavvio nginx,ma non cambia nulla,tranne che per i file .gif,jpg,js ecc ecc i quali vengono inviati in keep-alive con il timeout impostato,ma i file .php nulla.

 

Quello che vedo con live http header sia con il keepalive_timeout sia senza, è la seguente cosa:

 

GET /index.php HTTP/1.1
Host: xxx
User-Agent: xxx
Accept: text/html,application/xhtml+xml,application/xml;
Accept-Language: it-it,it;
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;
Referer: [url]http://xxx/index.php[/url]
Cookie: xxx
DNT: 1
Connection: [color=blue]keep-alive[/color]

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 01 Jul 2011 20:01:48 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: [color=red]close[/color]
Content-Encoding: gzip
Vary: Accept-Encoding

Mentre caricando le immagini (con un refresh) della pagina, la seconda parte del codice diventa:

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 01 Jul 2011 20:01:55 GMT
Content-Type: image/gif
Content-Length: 843
Last-Modified: Mon, 09 Jun 2008 18:54:55 GMT
Connection: keep-alive
Keep-Alive: timeout=70
Accept-Ranges: bytes

PS: in quest'ultimo pezzo,qualora non imposti il timeout rimane comunque keep-alive.

 

Non so proprio come darne fuori.

Share this post


Link to post
Share on other sites

C'è un motivo per il quale hai settato keepalive_requests a 10? Prova a commentarlo e vedere cosa succede.

Inoltre prova a compilare nginx con il modulo stub_status così hai tutti i dati sulle connessioni effettivamente aperte.

Share this post


Link to post
Share on other sites

Per quanto riguarda le keepalive_requests a 10 era solamente un numero come un altro in fase di testing.

Anche commentandolo/togliendolo il risultato è identico.

PS: la riga "keepalive_timeout 80 80;" va messa dentro il server { desiderato oppure si deve lasciare come generale fuori da tutto, ma ovviamente dentro http { ?

Attivando il modulo stub_status ottengo dopo pochi secondi:

Active connections: 39  
server accepts handled requests  
370 370 440  
Reading: 14 Writing: 2 Waiting: 23

Dalla documentazione mi pare di capire che le Waiting siano le connessioni keep-alive?

Fornisce solo questo tipo di statistica oppure anche altre informazioni?

 

Quello che vorrei capire io è:

nell'header ci sono due sezioni:

1) GET /index.php HTTP/1.1

2) HTTP/1.1 200 OK

 

A livello pratico a me interessa solo la prima,solo la seconda oppure entrambi per avere a tutti gli effetti una connessione keep-alive?

Share this post


Link to post
Share on other sites
Per quanto riguarda le keepalive_requests a 10 era solamente un numero come un altro in fase di testing.

Anche commentandolo/togliendolo il risultato è identico.

PS: la riga "keepalive_timeout 80 80;" va messa dentro il server { desiderato oppure si deve lasciare come generale fuori da tutto, ma ovviamente dentro http { ?

 

Secondo la doc è uguale, io l'ho sempre usato a livello di http.

Come tutte le direttive in nginx scendendo di livello si overrida la configurazione al livello superiore.

 

Attivando il modulo stub_status ottengo dopo pochi secondi:

Active connections: 39  
server accepts handled requests  
370 370 440  
Reading: 14 Writing: 2 Waiting: 23

Dalla documentazione mi pare di capire che le Waiting siano le connessioni keep-alive?

Fornisce solo questo tipo di statistica oppure anche altre informazioni?

 

Sì le waiting sono le connessioni restate aperte per via del keep-alive.

Le info son solo quelle :approved:

 

Quello che vorrei capire io è:

nell'header ci sono due sezioni:

1) GET /index.php HTTP/1.1

2) HTTP/1.1 200 OK

 

A livello pratico a me interessa solo la prima,solo la seconda oppure entrambi per avere a tutti gli effetti una connessione keep-alive?

 

Da quello che so in HTTP/1.1 viene dato per scontato che la connessione debba essere di tipo keep-alive, quindi il browser con la GET invia questo parametro, però anche il server deve rispondere con keep-alive, perché se risponde con close il browser non usa più la vecchia connessione, ma ne apre un'altra.

 

Mi sembra molto strano come problema, io con nginx 1.0.4 tengo il keep-alive abbastanza alto su più server e funziona perfettamente su tutte le richieste.

Al massimo prova con una build del branch legacy stable per escludere che sia qualche strano bug introdotto con le ultime.

 

Ah un'altra cosa, il problema te lo dà anche con un semplice phpinfo per esempio?

Share this post


Link to post
Share on other sites

Versione nginx: 1.0.4

Con un phpinfo() semplice stessa cosa. Prima parte keep-alive e la seconda in basso close.

Non so più come darne fuori davvero. Più che altro siamo sicuri al 100% che sia solamente una questione di nginx e non di php-fpm? Dico questo non per mettere in dubbio le vostre conoscenze,ma posso garantirvi che le ho provate davvero tutte. :(

Non so se possa essere d'aiuto,ma su php info ho la seguente voce:

_SERVER["HTTP_CONNECTION"]            keep-alive

Ciò nonostante l'Header rimane in close la seconda parte.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×