5 consejos para mejorar 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 las computadoras con acceso a Internet.

Además, Apache sigue experimentando el mayor crecimiento entre los principales servidores web, seguido de Nginx e 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 lo ayudarán a garantizar que Apache se ejecute 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 registros de referencia, pero, aun así, aún es capaz de proporcionar un alto rendimiento en casi cualquier caso de uso que pueda imaginar.

SUGERENCIA # 1: Mantenga siempre actualizado Apache 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. Al 19 de noviembre de 2015, la última versión de Apache disponible en los repositorios de CentOS 7 es 2.4.6, mientras que en Debian es 2.4.10.

Sin embargo, puede haber una mejora reciente o una corrección de errores que se haya agregado a una versión estable recién lanzada, que luego estará 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 instalada actualmente 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 forma. Puede leer las notas de la versión más reciente en la sección Documentación de Apache en el sitio web del proyecto del servidor HTTP Apache.

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

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

Puede ver su kernel actualmente instalado con:

# uname -r

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

Aunque es un proceso no destinado a principiantes, la actualización de su kernel es un ejercicio interesante para aprender más sobre las funciones internas de Linux.

SUGERENCIA # 3: Elija el Módulo de multiprocesamiento (MPM) que mejor se adapte a su caso

En la práctica, los MPM amplían la funcionalidad modular de Apache permitiéndole decidir cómo configurar el servidor web para que se vincule a los puertos de red en la máquina, acepte solicitudes de clientes y utilice procesos secundarios (y subprocesos, alternativamente) para manejar tales 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 varios 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á usar este MPM solo cuando depure una aplicación que use, o si su aplicación necesita lidiar con módulos no seguros para subprocesos como mod_php.
  2. El trabajador MPM usa varios subprocesos por proceso hijo, donde cada subproceso maneja una conexión a la vez. Esta es una buena opción para servidores de alto tráfico, ya que permite manejar más conexiones simultáneas con menos RAM que en el caso anterior.
  3. Finalmente, el evento MPM 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: hace que KeepAlive o conexiones inactivas (mientras permanecen en ese estado) sean manejadas por un solo subproceso, liberando así memoria que puede ser asignado a otros subprocesos. Este MPM no es adecuado para su uso con módulos no seguros para subprocesos como mod_php, para los cuales se debe usar un reemplazo como PHP-FPM.

Para verificar el MPM usado 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 deba instalar el paquete libapache2-mod-fastcgi desde los repositorios que no son libres.

Además, para CentOS necesitará 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:

# systemctl restart httpd php-fpm && systemctl enable httpd php-fpm
# systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

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

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

Finalmente, tenga en cuenta que independientemente de la distribución que elija, php-fpm se basa en la implementación de FastCGI, que es la razón por la que recomendé las instalaciones 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 event 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 agreguen 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 de firewalld en un VPS en la nube impedía que php-fpm y Apache procesaran archivos php.

Como prueba básica (estoy seguro de que puedes pensar en otras más complicadas o estresantes), crearé un archivo php que verifica 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 he guardado 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

Realicemos 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 contraparte anterior a la bifurcación en todos los aspectos de esta prueba.

SUGERENCIA # 4: Asigne la RAM de manera inteligente 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 el número de procesos secundarios a través de la directiva MaxRequestWorkers (anteriormente conocida como MaxClients en Apache 2.2), 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, debe tomar nota de la cantidad promedio de RAM utilizada por Apache, luego multiplicarla por la cantidad de MaxRequestWorkers, y esa es la cantidad de memoria que se asignará para los procesos de Apache. Una cosa que nunca querrá que haga su 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 puede pagar y nunca confiar en el intercambio.

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

Puede colocar este bloque dentro de /etc/httpd/conf/httpd.conf o /etc/apache2/apache2.conf , dependiendo de si está usando 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 su MPM elegido.

SUGERENCIA # 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 un administrador del sistema y hay otro equipo a cargo del desarrollo.

Puede enumerar los módulos cargados actualmente con:

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

Para descargar/deshabilitar módulos en CentOS, deberá 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 usa de la siguiente manera:

# a2dismod module_name

Para volver a habilitarlo:

# a2enmod module_name

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

Resumen

En este artículo, hemos revisado 5 consejos que le ayudarán a ajustar 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 de consejos de refuerzo de Apache en Tecmint.com también.

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