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, debe 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 asegurarse de 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 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 entre el cliente y el servidor web) y permite que Apache entregue contenido estático más rápido y con una 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 ú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, la actualización de su kernel es un ejercicio interesante para aprender más sobre las partes internas de Linux.

SUGERENCIA # 3: Elija el Módulo de multiprocesamiento (MPM) que funcione mejor para 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 de la máquina, acepte solicitudes de clientes y utilice 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. The prefork MPM uses multiple child processes without threading. Each process handles one connection at a time without creating separate threads for each. Without going into too much detail, we can say that you will want to use this MPM only when debugging an application that uses, or if your application needs to deal with, non-thread-safe modules like mod_php.
  2. The worker MPM uses several threads per child processes, where each thread handles one connection at a time. This is a good choice for high-traffic servers as it allows more concurrent connections to be handled with less RAM than in the previous case.
  3. Finally, the event MPM is the default MPM in most Apache installations for versions 2.4 and above. It is similar to the worker MPM in that it also creates multiple threads per child process but with an advantage: it causes KeepAlive or idle connections (while they remain in that state) to be handled by a single thread, thus freeing up memory that can be allocated to other threads. This MPM is not suitable for use with non-thread-safe modules like mod_php, for which a replacement such a PHP-FPM must be used instead.

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

# httpd -V

La imagen a continuación 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 que está utilizando 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 MPM diferente. 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

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 a su contraparte prefork en todos los aspectos de esta prueba.

SUGERENCIA # 4: Asigne RAM sabiamente para Apache

Quizás el elemento de hardware más crítico que se debe 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 pueda pagar 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 se puede resolver fácilmente actualizando el navegador. Si bien esto puede considerarse indeseable, es más saludable para el servidor y, a largo plazo, 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 install mod_pagespeed para mejorar el rendimiento del servidor web y el artículo de consejos de refuerzo de Apache en Tecmint.com.

Dado que no podemos cubrir adecuadamente todos los aspectos de este tema en este artículo, tal vez piense en 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.