Cómo optimizar Apache en función de la memoria RAM de tu servidor

Actualizada:

Optimizar un servidor con Apache para que sus procesos usarán menos memoria RAM nunca ha sido tarea fácil debido a la gran cantidad de parámetros que hay que manejar, pero ahora, podemos utilizar un pequeño script que no va a decir el valor ideal de muchos de los parámetros principales de este servidor HTTP.

Apache2Buddy, que es muy similar a MySQLTuner, programa para optimizar MySQL o MariaDB, revisa tu configuración de Apache, y te hace sugerencias basadas en la cantidad de memoria que consume cada proceso Apache de tu servidor y la memoria RAM total que tengas.

Aunque es un programa bastante básico, ya que se centra solo en la directiva «MaxClients» (MaxRequestWorkers en las nuevas versiones de Apache desde 2.4), Apache2Buddy es útil, y se puede instalar y ejecutar de manera sencilla en el servidor teniendo acceso root mediante SSH.

  • «MaxClients o MaxRequestWorkers:» indica el número máximo de peticiones que se pueden servir al mismo tiempo por el servidor, cualquier número que vaya más allá del límite se pone en cola. Si es demasiado bajo, las conexiones enviadas a la cola pueden agotar el tiempo de espera; si es demasiado alto, puedes tener problemas de memoria y empezar a usar la memoria SWAP del servidor. En Linode.com tenéis una buena explicación de todos los parámetros.

Cómo instalar y usar Apache2buddy para optimizar Apache y la memoria RAM de tu servidor

1.-Descargamos Apache2Buddy desde Github:

Yo me descargué el archivo a2bchk.sh que sirve para comprobar la veracidad del archivo descargado y luego ejecuta el programa:

--- a2bchk.sh ---
#!/bin/bash
# example of testing md5sums prior to execution

scriptmd5sum=`curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | md5sum | cut -d " " -f1`
originmd5sum=`curl -s https://raw.githubusercontent.com/richardforth/apache2buddy/master/md5sums.txt | cut -d " " -f1`
echo $scriptmd5sum
echo $originmd5sum
if [ $scriptmd5sum == $originmd5sum ]
then
        scriptsha256sum=`curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | sha256sum | cut -d " " -f1`
        originsha256sum=`curl -s https://raw.githubusercontent.com/richardforth/apache2buddy/master/sha256sums.txt | cut -d " " -f1`
        echo $scriptsha256sum
        echo $originsha256sum
        if [ $scriptsha256sum == $originsha256sum ]
        then
                # execute the code, its safe - we can assume
                curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | perl
        else
                echo "Error: SHA256SUM mismatch, execution aborted."
        fi
else
        echo "Error: MD5SUM mismatch, execution aborted."
fi
--- end a2bchk.sh ---

o lo ejecutamos directamente con este comando:

curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | perl

2.-Si has descargado solo apache2buddy.pl le damos permisos de ejecución:

chmod +x apache2buddy.pl

y ejecutamos el script para que revise nuestra configuración de Apache:

./apache2buddy.pl

3.-Y lo que vamos a obtener es algo como esto:

Resultados de Apache2Buddy para un servidor Rocky Linux.

Donde podemos ver unas cuantas cosas importantes de nuestro sistema, incluidos muchos de los parámetros que hay que optimizar.

Justo después de estos resultados, Apache2Buddy te va a dar unos cuantos consejos y recomendaciones (que también mete en un archivo log). ¿Otras cosas relevantes?:

  • Si detecta PHP-FPM te dice algo fundamental: Los resultados que se muestran pueden estar sesgados, y te recomienda comprobar y optimizar /etc/php-fpm.d/.conf y calcular pm.max_children por separado. He optimizado este parámetro en la siguiente entrada dedicada a las diferentes versiones de PHP que puedes instalar en Rocky Linux.
  • Apache2buddy SOLO calcula maxclients para el modelo de prefork.
  • En el log te va a guardar algo como esto: Uptime: «0d 23h 44m 49s» Model: «Event» Memory: «15736 MB» Maxclients: «500» Recommended: «N\A» Smallest: «3.72 MB» Avg: «384.60 MB» Largest: «663.21 MB»
  • En el archivo /etc/httpd/conf/httpd.conf, que es donde se encuentra la configuración de Apache en Rocky Linux, podemos cambiar el parámetro MaxClients en función de la recomendación del programa.

Un problema muy común de las configuraciones por defecto de Apache es que suelen dejar MaxClients=150, y eso no hay servidor con 2 GB de RAM que lo soporte en un pico de visitas. Tened en cuenta que además de Apache, el servidor tiene que manejar MYSQL (digamos que usa el 50 % o 60 % de la memoria RAM del servidor) y tu panel de control (cPanel/WHM puede llevar a consumir 512 MB mínimo -otro 20 %- y Virtualmin unos 100 MB), así que no podemos dejar que en un pico de visitas Apache use toda la memoria RAM. Sí, dejas MaxClients en 150, cuando tengas muchas visitas el servidor no lo va a aguantar… mejor que esperen en la cola…

Parámetros que he optimizado en mi instalación de Apache en un servidor de 16 GB de RAM y 6 núcleos

Puedes usar un script como ps_mem.py para ajustar muchos de estos parámetros teniendo en cuenta la memoria que usan tus procesos PHP, Apache, MySQL y demás. Puedes calcular fácilmente la memoria de cada proceso httpd con:

  • ps -ylC httpd –sort:rss

También puedes tener en cuenta estas fórmulas:

  • MaxRequestWorkers = Memoria disponible para Apache / Memoria por proceso de Apache
  • ServerLimit = MaxRequestWorkers / ThreadsPerChild (Debe ser mayor o igual que MaxRequestWorkers)
    • También se usa: ServerLimit x 25 = MaxRequestWorkers
    • Pero mucha gente lo optimiza a MaxRequestWorkers = ServerLimit especialmente cuando se utiliza MPM event. Esto asegura que la cantidad máxima de procesos hijos permitidos coincide con la capacidad de manejo de solicitudes simultáneas, simplificando la configuración y evitando inconsistencias.
  • ThreadsPerChild, ThreadLimit, StartServers, MinSpareThreads, MaxSpareThreads: Ajustados para balancear la carga y optimizar el uso de recursos.
  • MaxConnectionsPerChild: Para reciclar procesos y evitar fugas de memoria.

Estos son los parámetros que tengo en estos momentos, pero tened en cuenta que no están escritos en piedra. Pueden funcionar para mí y no para ti.

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
ProxyTimeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 400

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 3

##
## Server-Pool Size Regulation (MPM event)
## 
<IfModule mpm_event_module>
    StartServers            6
    MinSpareThreads         50
    MaxSpareThreads         150
    ThreadLimit             64
    ThreadsPerChild         25
    MaxRequestWorkers       500
    ServerLimit             500
    MaxConnectionsPerChild  1000
</IfModule>

¿Por qué estos valores y no otros? Es ensayo y error:

Parámetros Generales

  1. Timeout 300: Este parámetro define el número de segundos antes de que se agote el tiempo de espera para recibir y enviar datos en una conexión. El tiempo de espera es de 300 segundos (5 minutos).
  2. ProxyTimeout 300: Similar a Timeout, pero específicamente para conexiones proxy. Define el tiempo de espera en segundos para las conexiones proxy antes de que se consideren fallidas. Aquí también es de 300 segundos.
  3. KeepAlive On: Este parámetro activa o desactiva las conexiones persistentes. Si está en On, se permite que un cliente reutilice la misma conexión TCP para múltiples solicitudes, lo que puede mejorar el rendimiento al reducir el tiempo necesario para establecer nuevas conexiones.
  4. MaxKeepAliveRequests 400: Define el número máximo de solicitudes permitidas en una única conexión persistente. Un valor de 400 significa que hasta 400 solicitudes pueden ser manejadas en la misma conexión antes de que se cierre.
  5. KeepAliveTimeout 3: Este parámetro define el número de segundos que el servidor espera para recibir una nueva solicitud en una conexión persistente antes de cerrar la conexión. El tiempo de espera es de 3 segundos. En general, la configuración óptima tiene MaxKeepAliveRequests debe ser alta (entre 100 y 500) y la de KeepAliveTimeout debe ser baja (entre 2 y 5) para liberarlos rápidamente.

Parámetros del MPM event

  1. StartServers 6: Especifica el número de procesos hijo que se crean al iniciar el servidor. En este caso, Apache iniciará con 6 procesos hijo. Porque tengo un servidor con 6 núcleos.
  2. MinSpareThreads 50: Define el número mínimo de hilos en espera que Apache mantendrá disponibles para manejar nuevas solicitudes. Si hay menos de 50 hilos en espera, Apache creará nuevos hilos.
  3. MaxSpareThreads 150: Define el número máximo de hilos en espera que Apache mantendrá disponibles. Si hay más de 150 hilos en espera, Apache eliminará los hilos adicionales.
  4. ThreadLimit 64: Especifica el número máximo de hilos permitidos por proceso hijo. Este valor debe ser mayor o igual que ThreadsPerChild.
  5. ThreadsPerChild 25: Define el número de hilos que cada proceso hijo maneja. En este caso, cada proceso hijo tendrá 25 hilos.
  6. MaxRequestWorkers 500: Este parámetro define el número máximo de hilos (workers) que estarán disponibles para manejar solicitudes simultáneamente en todo el servidor. Aquí, se permite un máximo de 1200 hilos simultáneos. Un valor más ajustado para no saturar la memoria RAM del servidor con 16GB sería de unos 500.
  7. ServerLimit 500: Especifica el número máximo de procesos hijos que Apache puede crear. Si pones MaxRequestWorkers 500, puedes ajustarlo a 500 en MPM. En el contexto del módulo prefork, la configuración ServerLimit configura el valor máximo de MaxRequestWorkers durante toda la vida útil del proceso Apache httpd. Al utilizar los módulos de Worker o Event, ServerLimit y ThreadLimit determinan el valor máximo de MaxRequestWorkers durante la duración del proceso httpd de Apache. Ten en cuenta que si ServerLimit se establece en un valor superior al necesario, la memoria compartida no utilizada se reservará.
  8. MaxConnectionsPerChild 1000: Define el número máximo de conexiones que un proceso hijo manejará antes de ser reciclado. Esto ayuda a prevenir problemas de memoria y fuga de recursos al reiniciar los procesos hijo después de manejar un número específico de conexiones. Cada proceso hijo manejará hasta 1000 conexiones antes de ser reciclado.

Después de hacer estos cambios, reinicia apache, pero primero comprueba que toda la sintaxis es correcta. Luego compruebas que Apache se ha iniciado bien (para sistemas Rocky Linux o alma Linux):

sudo httpd -t
sudo systemctl restart httpd
sudo systemctl status httpd 
  • A partir de este momento, es muy importante revisar los logs de Apache por si hubiera algún problema de rendimiento. Y sis usas PHP-FPM, optimizar muy bien pm.max_children.

Te puede interesar: Cómo proteger un servidor Linux de Malware con Maldet y ClamAV

Otros consejos para optimizar el rendimiento de tu servidor o página web

1.-Cambia de proveedor de hosting

Además de tunear Apache, también podéis aumentar vuestra memoria RAM cambiado de plan de alojamiento en vuestro servidor. En Linode tienen buenas ofertas y sus planes de alojamiento web tienen muy buena pinta: www.linode.com. Su plan de 8 GB de RAM es uno de los mejores del momento.

2.-Optimiza tu CMS, por ejemplo WordPress

Es posible que no hayas optimizado bien WordPress, el CMS más popular del mundo. También tengo unos cuantos consejos para hacerlo. Tu servidor Apache y MySQL te lo van a agradecer.

3.-Tunea los parámetros del Kernel de tu distribución Linux

Otra cosa que he tratado en otro post. Cambiar los parámetros del Kernel para mejorar tanto la seguridad como la velocidad de tu red.

4.-Activar HTTP/2

Te lo cuento en Cómo activar HTTP/2 en Apache (Rocky Linux). Mejora el rendimiento y la conectividad de tu web.


Descubre más desde algoentremanos.com

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Foto del autor

Ivan Benito

Apasionado de la lectura y los viajes, experto en tecnología e informática y fan de la privacidad online. Desde el año 2007 me he dedicado al SEO, a escribir y a crear páginas web con WordPress sobre todo tipo de temáticas. Si tienes alguna duda y necesitas ayuda... ¡Pregúntame!

Si tienes preguntas, quieres que hagamos una review de una app, programa o producto, simplemente mándanos un e-mail mediante nuestro formulario de contacto. Te contestaremos en el menor tiempo posible. ¡Muchas gracias y salU2! Algoentremanos realiza reviews de manera profesional y en muchas ocasiones recibimos compensación de las compañías cuyos productos revisamos. Probamos cada producto a fondo y otorgamos altas calificaciones solo a los mejores. La propiedad de Algoentremanos.com es independiente y las opiniones expresadas aquí son solo nuestras. Algunos enlaces del artículo son afiliados: pueden generar un beneficio a algoentremanos.com. Saber más.

1 comentario en «Cómo optimizar Apache en función de la memoria RAM de tu servidor»

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.