¿Debo activar keepAlive en Apache2?


25

En cualquier instalación predeterminada, Apache 2 viene con keepAlive apagado, pero mirando a otro servidor, el módulo keepAlive estaba encendido.

Entonces, ¿cómo sé si keepAlive es adecuado para mí? ¿Dónde puedo encontrar algunos buenos ejemplos sobre cómo configurar esto?

Respuestas:


31

Ya hay 2 buenas respuestas, pero quizás el tema más importante de la vida real aún no se menciona.

En primer lugar, el OP podría querer leer las 2 respuestas anteriores y esta pequeña publicación de blog para comprender qué son los keepalives. (El autor no explica por qué TCPI / IP se vuelve "más rápido" cuanto más tiempo se abre la conexión. Es cierto, las conexiones más duraderas se benefician del escalado de la ventana IP , pero el efecto no es significativo a menos que los archivos sean grande, o el producto de retraso de ancho de banda es inusualmente grande).

El gran argumento contra HTTP Keepalive cuando se usa Apache es que bloquea los procesos de Apache. Es decir, un cliente que usa keepalives evitará que 'su' proceso de Apache sirva a otros clientes, hasta que el cliente cierre la conexión o se agote el tiempo de espera. En el mismo lapso de tiempo, esta instancia de Apache podría haber servido muchas otras conexiones.

Ahora, una configuración de Apache muy común es Prefork MPM y un intérprete PHP / Perl / Python, y el código de la aplicación en el idioma mencionado. En este caso, cada proceso de Apache es "pesado" en el sentido de que ocupa varios megabytes de RAM (Apache vinculado con el intérprete y el código de la aplicación). Esto, junto con el bloqueo de cada instancia de Apache keepalive'd, es ineficiente.

Una solución común es usar 2 servidores Apache (ambos en el mismo servidor físico o en 2 servidores, según sea necesario) con diferentes configuraciones:

  • uno "pesado" con mod_php (o cualquier lenguaje de programación utilizado) para contenido dinámico, con keepalives desactivado .
  • uno "ligero" con un conjunto mínimo de módulos, para servir contenido estático (imagen, css, js, etc.), con keepalives activado .

Luego puede expandir esta separación de contenido dinámico y estático cuando sea necesario , por ejemplo:

  • utilizando un servidor controlado por eventos para contenido estático, como nginx .
  • usando un CDN para contenido estático (podría hacer que todo el contenido estático sirva para usted)
  • implementar el almacenamiento en caché de contenido estático y / o dinámico

Otro enfoque con respecto a evitar el bloqueo de Apache es usar un equilibrador de carga con un manejo de conexión más inteligente, como Perlbal .

.. y mucho más. :-)


2
¿Estas respuestas siguen siendo relevantes 8 años después?
TheStoryCoder

Sí, sigue siendo relevante si está utilizando el prefork MPM. Tenga en cuenta que Apache httpd 2.4 (por ejemplo, en RHEL7) usa KeepAlive On por defecto (pero no lo enumera explícitamente en su configuración, al menos en RHEL7).
Cameron Kerr

5

Keepalives puede ser bueno en algunos casos, puede ser muy malo en otros. Reducen el tiempo y el esfuerzo de configurar una nueva conexión, pero vinculan los recursos del servidor durante el tiempo de espera del keepalive. Ejemplos:

  • Páginas con muchos objetos pequeños, clientes en acceso telefónico: el keepalive debería estar activado.
  • Páginas con unos pocos objetos grandes: mantener vivo no será una ventaja.
  • Servidor con un número muy elevado de visitantes únicos: keepalive debería estar apagado (de lo contrario, los sockets y los subprocesos se quedarán en la memoria esperando el tiempo de espera de keepalive y no atenderán a nuevos clientes).

Como puede ver, KeepAliveTimeout también desempeñará un papel importante en la optimización del rendimiento de su servidor.

Mira tu patrón de uso y decide por ti mismo.


0

Definitivamente deberías usar KeepAlive On.

Ver:

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

De esa forma, el navegador reutilizará una única conexión TCP para enviar múltiples consultas. Por lo general, un sitio web tiene muchos componentes (página HTML, código javascript, imágenes). Mientras estos recursos estén en el mismo dominio, por lo tanto, pueden ser atendidos por el mismo servidor, una conexión KeepAlive da un gran impulso en el rendimiento ya que el navegador no tendrá que establecer una nueva conexión TCP.

Un navegador generalmente se abre alrededor de 3 conexiones paralelas a un dominio. Digamos que tienes 18 objetos en tu sitio. El navegador abriría 3 conexiones y descargaría 6 objetos en cada conexión, utilizando el modo KeepAlive. Sin KeepAlive, tendría que abrir 18 conexiones TCP, lo cual es muy lento.

La mayoría, o todos los navegadores modernos son compatibles con HTTP / 1.1, por lo que esto debería funcionar.

Ciertos servidores proxy HTTP como Squid no son compatibles con HTTP / 1.1, pero solicitan el uso de una conexión KeepAlive de todos modos.


Esto es solo por parte del cliente, mientras que supongo que el uso de recursos del lado del servidor también es importante.
Morgan Cheng el

¿El uso de recursos del lado del servidor es más importante que la latencia percibida por el usuario?
Yves Junqueira

1
También creo en activar KeepAlive, sin embargo, el tiempo de espera predeterminado de Apache de 15 segundos es demasiado generoso, ya que mantiene los procesos bloqueados durante demasiado tiempo. Por lo general, configuro el tiempo de espera en alrededor de 2 segundos, lo que hace que KeepAlive se use durante aproximadamente una carga de página.
Martijn Heemels
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.