Búsqueda de sitios web

5 consejos para aumentar el rendimiento de su servidor web Apache


Según un informe reciente de Netcraft (una conocida empresa de Internet que proporciona, entre otros servicios, estadísticas de uso de navegadores web), Apache sigue siendo el servidor web más utilizado entre los sitios y ordenadores con acceso a Internet.

Además, Apache sigue experimentando el mayor crecimiento entre los principales servidores web, seguido de Nginx y IIS. Por lo tanto, si usted es un administrador de sistemas a cargo de administrar las instalaciones de Apache, necesita saber cómo asegurarse de que su servidor web funcione al máximo de su capacidad de acuerdo con sus necesidades (o las de su cliente).

En este artículo, analizaremos algunos consejos que le ayudarán a garantizar que Apache funcione sin problemas y pueda manejar la cantidad de solicitudes que espera de clientes remotos.

Sin embargo, tenga en cuenta que Apache no fue diseñado con el objetivo de establecer récords de referencia, pero, aun así, sigue siendo capaz de proporcionar un alto rendimiento en casi cualquier caso de uso que se le ocurra.

CONSEJO #1: Mantenga siempre Apache actualizado a su última versión

No hace falta decir que tener instalada la última versión de Apache es probablemente una de las primeras cosas que debe considerar. A 19 de noviembre de 2015, la última versión de Apache disponible en los repositorios de CentOS 7 es la 2.4.6, mientras que en los de Debian es >2.4.10.

Sin embargo, es posible que haya una mejora reciente o una corrección de errores que se haya agregado a una versión estable recientemente lanzada, que luego está disponible para descargar e instalar desde la fuente. Aquí también se proporcionan instrucciones de compilación e instalación; solo recuerde que si elige este método de actualización, es posible que desee hacer una copia de seguridad de sus archivos/sitios/hosts virtuales de configuración actuales como medida de precaución.

En cualquier caso, puede verificar su versión actualmente instalada de la siguiente manera:

httpd -v               [On RedHat/CentOS based systems]
apache2 –v             [On Debian/Ubuntu based systems] 

Como regla general, siga el método de actualización proporcionado por el administrador de paquetes de su distribución elegida (yum update httpd o aptitude safe-upgrade apache2, para CentOS o Debian, respectivamente) a menos que no haya otra manera. Puede leer las notas de la versión más recientes en la sección de documentación de Apache en el sitio web del proyecto del servidor Apache HTTP.

SUGERENCIA #2: Si está utilizando un Kernel anterior a 2.4, considere actualizarlo ahora

¿Por qué? Las versiones del kernel 2.4 y superiores tienen la llamada al sistema del kernel sendfile habilitada de forma predeterminada. Esto, a su vez, facilita las transferencias de archivos de red de alto rendimiento (que son deseadas en el contexto de las comunicaciones entre el servidor y el cliente web) y permite a Apache entregar contenido estático más rápido y con una menor utilización de la CPU al realizar operaciones simultáneas de lectura y envío.

Puede ver su kernel actualmente instalado con:

uname -r

y compárelo con el último kernel estable en www.kernel.org (4.3 en el momento de escribir este artículo).

Aunque es un proceso no destinado a principiantes, actualizar su kernel es un ejercicio interesante para aprender más sobre las partes internas de Linux.

CONSEJO #3: Elija el módulo de procesamiento múltiple (MPM) que mejor se adapte a su caso

En la práctica, los MPM amplían la funcionalidad modular de Apache al permitirle decidir cómo configurar el servidor web para vincularse a los puertos de red de la máquina, aceptar solicitudes de clientes y utilizar procesos secundarios (y subprocesos, alternativamente) para manejar dichas solicitudes.

A partir de la versión 2.4, Apache ofrece tres MPM diferentes para elegir, según sus necesidades:

  1. El MPM prefork utiliza múltiples procesos secundarios sin subprocesos. Cada proceso maneja una conexión a la vez sin crear subprocesos separados para cada uno. Sin entrar en demasiados detalles, podemos decir que querrás utilizar este MPM sólo cuando depures una aplicación que utilice, o si tu aplicación necesita manejar, módulos no seguros para subprocesos como mod_php.
  2. El MPM worker utiliza varios subprocesos por proceso secundario, donde cada subproceso maneja una conexión a la vez. Esta es una buena opción para servidores con mucho tráfico, ya que permite manejar más conexiones simultáneas con menos RAM que en el caso anterior.
  3. Finalmente, el MPM event es el MPM predeterminado en la mayoría de las instalaciones de Apache para las versiones 2.4 y superiores. Es similar al trabajador MPM en que también crea múltiples subprocesos por proceso hijo pero con una ventaja: provoca conexiones KeepAlive o idle (mientras permanecen en ese estado). ser manejado por un solo subproceso, liberando así memoria que puede asignarse a otros subprocesos. Este MPM no es adecuado para su uso con módulos que no son seguros para subprocesos como mod_php, para los cuales se debe usar un reemplazo como PHP-FPM.

Para verificar el MPM utilizado por su instalación de Apache, puede hacer:

httpd -V

La siguiente imagen muestra que este servidor web en particular está utilizando el MPM prefork.

Para cambiar esto, deberá editar:

/etc/httpd/conf.modules.d/00-mpm.conf          [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load   [On Debian/Ubuntu based systems]

Donde puede ser mpm_event, mpm_worker o mpm_prefork.

y descomente la línea que carga el módulo deseado así:

LoadModule mpm_event_module modules/mod_mpm_event.so

Nota: Para que el evento MPM funcione en Debian, es posible que tengas que instalar el paquete libapache2-mod-fastcgi desde la versión no gratuita. repositorios.

Además, para CentOS necesitarás php-fpm (junto con fcgi y mod_fcgid), mientras que en Debian se llama php5-fpm< (junto con apache2-mpm-event).

Por último, pero no menos importante, reinicie el servidor web y el servicio php-fpm (o php5-fpm) recién instalado:

En RedHat/CentOS

systemctl restart httpd php-fpm && systemctl enable httpd php-fpm

En Debian/Ubuntu

systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

Aunque puede configurar Apache para que utilice un MPM específico, esa configuración se puede anular por host virtual de la misma manera que se indicó anteriormente.

Simplemente coloque las etiquetas correspondientes en el archivo de configuración de cada host virtual y estará listo para comenzar, pero asegúrese de usar uno y solo un MPM por host virtual.

Finalmente, tenga en cuenta que, independientemente de la distribución elegida, php-fpm se basa en la implementación de FastCGI, razón por la cual recomendé la instalación de paquetes adicionales anteriormente.

Para obtener más detalles y ejemplos sobre php-fpm y cómo puede, junto con el evento MPM, aumentar el rendimiento de Apache, debe consultar la documentación oficial.

Esto es lo que veo después de cambiar el MPM predeterminado de prefork a evento en el mismo cuadro que se muestra en la imagen anterior:

En CentOS 7, deberá asegurarse de que los servicios http y https estén habilitados a través del firewall y que las interfaces de red ) se agregan correctamente a la zona predeterminada.

Por ejemplo:

firewall-cmd --zone=internal --add-interface=tun6to4 
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent 
firewall-cmd --set-default-zone=internal 
firewall-cmd --add-service=http 
firewall-cmd --add-service=https 
firewall-cmd --add-service=http --permanent 
firewall-cmd --add-service=https --permanent 
firewall-cmd --reload

La razón por la que menciono esto es porque recientemente experimenté un problema en el que la configuración predeterminada del firewall en un VPS en la nube impedía que php-fpm y Apache procesaran archivos php.

Como prueba básica (seguro que se os ocurren otras más complicadas o estresantes), crearé un archivo php que comprueba la existencia de otro archivo llamado test.php en el mismo directorio de dos CentOS. 7 servidores con las mismas características de hardware y carga pero con diferente MPM. Uno de ellos usará event y el otro usará prefork:

Este es el código PHP que guardé en un archivo llamado checkiffileexists.php:

<?php
$filename = 'test.php';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

Luego ejecutaremos la herramienta de referencia de Apache (ab) con 200 solicitudes simultáneas hasta que se completen 2000 solicitudes:

ab -k -c 100 -n 2000 localhost/checkiffileexists.php

Ejecutemos la prueba y comparemos los resultados. Preste atención a las estadísticas de rendimiento:

Como puede ver, el rendimiento del servidor con evento es muy superior al de su homólogo prefork en todos los aspectos de esta prueba.

CONSEJO #4: Asigne RAM sabiamente para Apache

Quizás el elemento de hardware más crítico a tener en cuenta es la cantidad de RAM asignada para cada proceso de Apache. Si bien no puede controlar esto directamente, puede restringir la cantidad de procesos secundarios a través de la directiva MaxRequestWorkers (anteriormente conocida como MaxClients en Apache 2.2), lo que pondrá límites al uso de RAM por parte de Apache. Nuevamente, puede establecer este valor por host o por host virtual.

Para hacer esto, debes tomar nota de la cantidad promedio de RAM utilizada por Apache, luego multiplicarla por el número de MaxRequestWorkers, y esa es la cantidad de memoria que se asignará para los procesos de Apache. Una cosa que nunca querrás que haga tu servidor web es comenzar a usar swap, ya que eso disminuirá significativamente su rendimiento. Por lo tanto, siempre debe mantener el uso de RAM por parte de Apache dentro de los límites que pueda permitirse y nunca confiar en el intercambio.

Por ejemplo, el siguiente bloque restringirá la cantidad de clientes simultáneos a 30. Si más clientes acceden al host, pueden experimentar un retraso o una falla momentánea que puede resolverse fácilmente actualizando el navegador. Si bien esto puede considerarse indeseable, es más saludable para el servidor y, a largo plazo, también lo mejor para su sitio.

Puede colocar este bloque dentro de /etc/httpd/conf/httpd.conf o /etc/apache2/apache2.conf, dependiendo de si está utilizando CentOS o Debian.

Tenga en cuenta que el mismo principio se aplica a todos los MPM. Estoy usando event aquí para continuar con el concepto descrito en el consejo anterior:

<IfModule mpm_event_module>
    StartServers 3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit                      64
    ThreadsPerChild          25
    MaxRequestWorkers    30
    MaxConnectionsPerChild    1000
</IfModule>

En cualquier caso, se recomienda encarecidamente que consulte los documentos de Apache 2.4 para ver qué directivas están permitidas para el MPM elegido.

CONSEJO #5: Conozca sus aplicaciones

Como regla general, no debe cargar ningún módulo de Apache que no sea estrictamente necesario para que su aplicación funcione. Esto requerirá al menos un conocimiento general de las aplicaciones que se ejecutan en su servidor, especialmente si es administrador de sistemas y hay otro equipo a cargo del desarrollo.

Puede enumerar los módulos actualmente cargados con:

httpd -M          [On RedHat/CentOS based systems]
apache2ctl -M     [On Debian/Ubuntu based systems]

Para descargar/deshabilitar módulos en CentOS, necesitarás comentar la línea que comienza con LoadModule (ya sea en el archivo de configuración principal o en uno auxiliar dentro de /etc/httpd/conf.modules.d.

Por otro lado, Debian proporciona una herramienta llamada a2dismod para deshabilitar módulos y se utiliza de la siguiente manera:

a2dismod module_name

Para habilitarlo nuevamente:

a2enmod module_name

En cualquier caso, recuerda reiniciar Apache para que los cambios surtan efecto.

Resumen

En este artículo hemos revisado 5 consejos que le ayudarán a optimizar el servidor web Apache y aumentar su rendimiento. Además, debe recordar que la optimización y el rendimiento sin seguridad no tienen sentido, por lo que es posible que desee consultar el artículo sobre instalación de mod_pagespeed para mejorar el rendimiento del servidor web y consejos para fortalecer Apache en linux-console.net.

Dado que no podemos cubrir adecuadamente todos los aspectos de este tema en este artículo, tal vez se le ocurran otras ideas que le gustaría compartir con el resto de la comunidad. Si es así, no dude en hacérnoslo saber mediante el formulario de comentarios a continuación.