Devo attivare keepAlive in Apache2?


25

In qualsiasi installazione predefinita, Apache 2 viene fornito con keepAlive spento, ma guardando un altro server, il modulo keepAlive era acceso.

Quindi, come faccio a sapere se keepAlive è giusto per me? Dove posso trovare alcuni buoni esempi su come configurarlo?

Risposte:


31

Ci sono già 2 buone risposte, ma il problema forse più importante della vita reale non è ancora menzionato.

Prima di tutto, l'OP potrebbe voler leggere le 2 risposte precedenti e questo piccolo post sul blog per capire cosa sono i keepalive. (L'autore non elabora la parte in cui TCPI / IP diventa "più veloce" più a lungo è aperta la connessione. È vero, le connessioni più durature beneficiano del ridimensionamento della finestra IP , ma l'effetto non è significativo a meno che i file non siano grande o il prodotto con ritardo di banda è insolitamente grande.)

Il grande argomento contro HTTP Keepalive quando si utilizza Apache è che blocca i processi Apache. Vale a dire un client che utilizza keepalives impedirà al "suo" processo Apache di servire qualsiasi altro client, fino a quando il client non chiude la connessione o non viene raggiunto il timeout. Nello stesso lasso di tempo, questa istanza di Apache avrebbe potuto servire molte altre connessioni.

Ora, una configurazione Apache molto comune è Prefork MPM e un interprete PHP / Perl / Python e un codice dell'applicazione nella lingua menzionata. In questo caso ogni processo di Apache è "pesante", nel senso che occupa diversi megabyte di RAM (Apache collegato con l'interprete e il codice dell'applicazione). Questo, insieme al blocco di ogni istanza di Apache keepalive, è inefficiente.

Una soluzione alternativa comune consiste nell'utilizzare 2 server Apache (entrambi sullo stesso server fisico o su 2 server, se necessario) con diverse configurazioni:

  • uno "pesante" con mod_php (o qualunque linguaggio di programmazione utilizzato) per contenuti dinamici, con keepalive disattivato .
  • uno "leggero" con un set minimo di moduli, per servire contenuto statico (immagine, css, js ecc.), con keepalive attivo .

È quindi possibile espandere questa separazione di contenuto dinamico e statico quando necessario , ad esempio:

  • utilizzando un server basato su eventi per contenuto statico, come nginx .
  • utilizzando un CDN per contenuto statico (potrebbe fare tutto il contenuto statico che serve per te)
  • implementare la memorizzazione nella cache di contenuto statico e / o dinamico

Un altro approccio per evitare il blocco di Apache consiste nell'utilizzare un bilanciamento del carico con una gestione delle connessioni più intelligente, come Perlbal .

.. e altro ancora. :-)


2
Queste risposte sono ancora pertinenti 8 anni dopo?
TheStoryCoder il

Sì, è ancora pertinente se si utilizza prefork MPM. Si noti che Apache httpd 2.4 (ad es. In RHEL7) utilizza KeepAlive On per impostazione predefinita (ma non lo elenca esplicitamente nella sua configurazione, almeno in RHEL7).
Cameron Kerr il

5

Keepalive può essere buono in alcuni casi, può essere molto cattivo in altri. Riducono il tempo e lo sforzo di impostare una nuova connessione, ma legano le risorse del server per la durata del timeout keepalive. Esempi:

  • Pagine con molti piccoli oggetti, client in dialup - keepalive dovrebbe essere attivo.
  • Pagine con pochi oggetti di grandi dimensioni: keepalive non sarà un vantaggio.
  • Server con un numero molto elevato di visitatori unici - keepalive dovrebbe essere spento (altrimenti socket e thread rimarranno in memoria in attesa del timeout keepalive e non serviranno nuovi clienti).

Come puoi vedere, KeepAliveTimeout svolgerà anche un ruolo importante nell'ottimizzazione delle prestazioni del tuo server.

Guarda il tuo modello di utilizzo e decidi tu stesso.


0

Dovresti assolutamente usare KeepAlive On.

Vedere:

http://httpd.apache.org/docs/2.0/mod/core.html#keepalive

In questo modo una singola connessione TCP verrà riutilizzata dal browser per inviare più query. Di solito un sito Web ha molti componenti (pagina HTML, codice javascript, immagini). Finché queste risorse si trovano nello stesso dominio, quindi possono essere servite dallo stesso server, una connessione KeepAlive aumenta notevolmente le prestazioni poiché il browser non dovrà stabilire una nuova connessione TCP.

Un browser in genere apre circa 3 connessioni parallele a un dominio. Supponiamo che tu abbia 18 oggetti nel tuo sito. Il browser aprirebbe 3 connessioni e scaricherà 6 oggetti in ciascuna connessione, usando la modalità KeepAlive. Senza KeepAlive, dovrebbe aprire 18 connessioni TCP, il che è molto lento.

La maggior parte o tutti i browser moderni sono conformi a HTTP / 1.1, quindi dovrebbe funzionare.

Alcuni proxy HTTP come Squid non sono conformi a HTTP / 1.1, ma richiedono comunque l'uso di una connessione KeepAlive.


Questo è solo dal punto di vista del lato client, mentre suppongo che anche l'uso delle risorse lato server sia importante.
Morgan Cheng,

L'utilizzo delle risorse lato server è più importante della latenza percepita dall'utente?
Yves Junqueira,

1
Credo anche di attivare KeepAlive, tuttavia il timeout predefinito di Apache di 15 secondi è di gran lunga troppo generoso poiché mantiene i processi bloccati per troppo tempo. Di solito imposto il timeout a circa 2 secondi, il che comporta l'utilizzo di KeepAlive durante circa un pageload.
Martijn Heemels,
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.