La configuración de Apache puede tener un efecto importante en el desempeño de su servidor. La manera más sencilla de incrementar el desempeño del servidor es desactivar los módulos que no son necesarios. Esta guía cubre la explicación de los módulos Apache, proporcionando información sobre cuáles módulos se deben desactivar, y otras opciones para optimizar el desempeño.
Nota:
Los pasos especificados en este tutorial requieren privilegios root. Asegúrese de seguir los pasos a continuación como root o usando el prefijo sudo.
Hay una variedad de herramientas que le pueden ayudar a determinar si necesita alterar la configuración de sus recursos, incluyendo el comando top
y también el programa para realizar pruebas de carga Siege
. Como requisito mínimo, debe familiarizarse con el uso de CPU y de RAM de su servidor. También puede utilizar los siguientes comandos para descubrir estadísticas de uso:
echo [PID] [MEM] [PATH] && ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 20
ps -eo pcpu,pid,user,args | sort -k 1 -r | head -20
Otras formas más específicas para la optimización de Apache incluyen el módulo mod_status
de Apache y Apache2Buddy.
El módulo mod_status
muestra información relacionada con las conexiones entrantes en el servidor, generando una página detallada de estatus. Puede ver un ejemplo de esta página en el propio sitio web de Apache.
Abra el archivo de configuración de su sitio web. Este archivo suele estar ubicado en /etc/apache2/sites-available/ejemplo.com.conf
en sistemas Debian/Ubuntu y en /etc/httpd/conf.d/vhost.conf
dentro de sistemas CentOS/Fedora.
Agregue lo siguiente al bloque <virtual_hosts>
:
Extracto del archivo: /etc/apache2/sites-available/example.com.conf (Debian/Ubuntu) o /etc/httpd/conf.d/vhost.conf (CentOS/Fedora)
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from localhost
</Location>
El mod_status
de Apache también ofrece una opción llamada ExtendedStatus, la cual proporciona información adicional sobre cada solicitud realizada a Apache. Para habilitar ExtendedStatus debe editar el archivo de configuración de Apache:
Extracto del archivo: /etc/apache2/apache2.conf (Debian/Ubuntu) o /etc/httpd/confd/httpd.conf (CentOS/Fedora)
ExtendedStatus On
Nota:
Habilitar la opción ExtendedStatus
consume recursos adicionales del sistema.
Reinicie Apache
Para Debian o Ubuntu:
service apache2 restart
Para CentOS/Fedora
yum install lynx
Abra el archivo:
lynx http://localhost/server-status
El script Apache2Buddy
es similar a MySQLTuner
, este revisa su configuración de Apache y hace sugerencias con base en la memoria de procesos y la RAM general. A pesar de ser un programa bastante básico que se enfoca en la directiva MaxClients
, Apache2Buddy
es útil y puede ser usado ejecutando un solo comando:
curl -L http://apache2buddy.pl/ | perl
Nota:
Antes de hacer cualquier cambio en su configuración de Apache, asegúrese de respaldar el archivo de configuración de Apache:
En Debian/Ubuntu
cp /etc/apache2/apache2.conf ~/apache2.conf.backup
En CentOS/Fedora
cp /etc/httpd/conf/httpd.conf ~/httpd.conf.backup
Apache ofrece dos módulos de multiprocesamiento (o 3 módulos en el caso de Apache 2.4) para la gestión de sus ajustes.
Cada módulo crea procesos hijos, que difieren principalmente en la forma en la cual manejan los hilos.
El módulo prefork
crea un número de procesos hijos al iniciarse, cada hijo maneja un único hilo. Debido a que estos procesos se ocupan solamente de un hilo a la vez, hacer solicitudes puede hacer que la velocidad se vea afectada en caso de que haya demasiadas solicitudes concurrentes. Si esto ocurre, algunas solicitudes simplemente deben esperar en cola para ser ejecutadas. Para manejar esto, aumente el número de procesos hijos generados, pero tenga en cuenta que esto también aumenta la cantidad de RAM utilizada. prefork
es el módulo más seguro, y debe ser usado cuando se usan mods
que no son seguros para hilos.
Los procesos hijos del módulo worker
generan varios hilos por proceso, cada hilo está listo para recibir nuevas solicitudes. Esto permite que pueda entrar un mayor número de solicitudes concurrentes, lo que a su vez facilita el uso de RAM. En general, el módulo worker
ofrece un mejor desempeño, pero es menos seguro que prefork
y no puede ser usado con módulos que no sean seguros para hilos.
El módulo event
solo está disponible en Apache 2.4 y está basado en el worker
MPM. Así como el worker
, crea varios hilos por proceso hijo, con un hilo dedicado a las conexiones KeepAlive
que se transmiten a los hilos hijos una vez que la solicitud ha sido realizada. Esto es bueno para varias conexiones concurrentes, especialmente aquellas que no están activas al mismo tiempo pero hacen alguna solicitud ocasional. Las funciones del event
MPM son las mismas que las de un worker
en un event
de conexiones SSL.
Una vez que seleccione su módulo de multiprocesamiento o MPM, deberá cambiar los valores dentro de la configuración. Estas configuraciones están ubicadas en /etc/apache2/apache2.conf
si su sistema es Debian/Ubuntu, y el archivo /etc/httpd/conf/httpd.conf
en CentOS/Fedora. El MPM luce así:
Extracto: /etc/apache2/apache2.conf (Debian/Ubuntu) o /etc/httpd/conf/httpd.conf (CentOS/Fedora)
<IfModule mpmpreforkmodule>
StartServers 4
MinSpareServers 20
MaxSpareServers 40
MaxClients 200
MaxRequestsPerChild 4500
</IfModule>
Para otros MPMs remplace la línea <IfModule mpmpreforkmodule>
por <IfModule mpmworkermodule>
o <IfModule mpmeventmodule>
para worker
o event
respectivamente.
El próximo paso para reconfigurar su servidor Apache es alterar la configuración arriba. Para hacerlo, necesita estar al tanto de lo que hace cada valor, y cuál es la mejor manera de cambiarlo.
La mejor forma de hacer cambios en la configuración es hacer pequeños cambios, e ir supervisando los efectos.
Nota:
Después de hacer alteraciones al archivo de configuración Apache, reinicie el servicio usando el comando service apache restart
en Debian/Ubuntu o /bin/systemctl reload httpd.service
en CentOS/Fedora.
El valor StartServers
indica el número de procesos hijos creados en el inicio, y es controlado dinámicamente dependiendo de la carga. Realmente hay pocas razones para cambiar este número, a menos que su servidor se reinicie muy frecuentemente y reciba un gran número de solicitudes tras reiniciarse.
Establece el número mínimo de procesos hijos en estado de suspensión o idle. Si hay menos procesos que el número MinSpareServer
, se crearán más procesos nuevos a una tasa igual o menor de un proceso por segundo en Apache 2.2. Con Apache 2.4, esta tasa aumenta exponencialmente comenzando con 1 y terminando hasta con 32 hijos generados por segundo. El beneficio de este valor es que cuando llega una solicitud, esta puede ser manejada por un hilo en suspensión; en caso de que no haya un hilo disponible, Apache tendría que generar un nuevo hilo, consumiendo recursos y extendiendo el tiempo que toma una solicitud en ser atendida. Tenga en cuenta también que tener demasiados procesos en suspensión también tendría efectos adversos en el servidor.
Establece el número máximo de procesos hijos en suspensión. Si el número de procesos procesos en suspensión es mayor al valor de MaxSpareServers
, entonces estos serán terminados. A menos que su sitio web sea extremadamente ocupado, este número no debería colocarse en un valor demasiado alto, debido a que incluso los procesos en suspensión consumen recursos.
La cantidad máxima de solicitudes que pueden ser servidas simultáneamente, con cualquier número por encima del límite que está en cola. Si este valor es muy bajo, las conexiones enviadas a la cola eventualmente expirarán; sin embargo, si el valor es demasiado alto, causa que la memoria comience a hacer demasiados intercambios (swapping). Si este valor es aumentado por encima de 256, el valor ServerLimit
también debe ser aumentado en consecuencia.
Una manera de calcular el mejor valor para esto es dividir la cantidad de RAM que usa cada proceso de Apache entre la cantidad de RAM disponible, dejando un espacio para otros procesos. Use ApacheBuddy para determinar estos valores, o los comandos especificados a continuación:
Para determinar la RAM que cada proceso de Apache utiliza, remplace httpd
por apache2
si utiliza sistemas Debian o Ubuntu:
ps -ylC httpd --sort:rss
Divida el número entre 2048 para megabytes.
Para obtener información sobre el uso de memoria:
free -m
Para recibir una vista más completa de los recursos que está usando Apache, utilice el comando top
.
Este valor limita el número de solicitudes que un servidor hijo maneja durante su vida útil. Una vez que el limita ha sido alcanzado, el servidor hijo muerte. Si se establece en 0, los servidores hijos están configurados para nunca expirar. El valor sugerido para este parámetro es unos cuantos miles, para prevenir la fuga de memoria. Tenga en cuenta que establecer este parámetro en un valor muy bajo puede ralentizar el sistema, ya que crear nuevos procesos consume recursos.
Si debe aumentar el valor MaxClients
por encima de 256, entonces aumente ServerLimit
a un valor coincidente. Para hacerlo, agregue la línea de ServerLimit
a su código MPM y altere el valor:
ServerLimit 256
La directiva KeepAlive, cuando se coloca en "on
" permite recibir varias solicitudes que provienen de la misma conexión TCP. Cuando se usa una conexión KeepAlive
, se cuenta como una sola solicitud contra las directivas MaxRequestsPerChild
. Este valor es mantenido fuera de su MPM, pero puede vincularse estrechamente con su selección de MPM.
Este tutorial explica algunos de los conceptos básicos para optimizar su servidor web Apache en un enfoque teórico que no aborda la aplicación/implementación. Es importante entonces complementar la información aquí presentada con los siguientes recursos. Recuerde que no certificar la actualidad o precisión de los contenidos externos.
Puede verificar los siguientes artículos de la Documentación oficial de Apache: