Bueno, es basico para un servidor dedicado el tener configurado bien Apache (httpd). Tened en cuenta que una mala configuracion del mismo, puede derivar en que un dedicado funcione muy mal, cuando la realidad esque puede funcionar perfecto.
CONOCER LA VERSION DE APACHE
Hay muchas maneras pero dejamos dos simples. Es necesario por motivos obvios, conocer la versión de apache instalada en nuestro sistema y el modo en el que ha sido compilado.
# httpd -v
Output:
-bash-3.1# Server version: Apache/2.2.3
-bash-3.1# Server built: Jan 15 2008 20:33:30
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
De esta manera sabemos que estamos ante un servidor Apache / 2.2.3 y en modo prefork.
Prefork MPM: el modo prefork utiliza múltiples procesos hijo, cada proceso hijo se ocupa de una conexión a la vez. Prefork es muy adecuado para sistemas con doble CPU, la velocidad es comparable al del Worker MPM y es altamente tolerante con los fallos en los módulos y los procesos hijos colgados. Por contra, el uso de memoria es alto y cuanto más tráfico tenemos más memoria consume- Vamos, que lo usaremos siempre que tengamos una buena CPU, y como minimo 1 GB de Memoria RAM. Suele ser recomendable para PHP.
Worker MPM: utiliza múltiples procesos hijo. Es multi-thread dentro de cada proceso hijo y cada thread se encarga de una conexión. Worker es más rápido y escalable y el uso de memoria es comparativamente bajo. Es también adecuado para múltiples procesadores. Worker es menos tolerante ante fallos de módulos y un fallo en un thread puede afectar a todos los threads de un proceso hijo. Por lo que sera ideal usarlo para servidores con poca RAM, siempre y cuando tengamos en cuenta, que debemos usar pocos modulos tambien.
DIRECTIVAS DE APACHE
Timeout - Es el valor que una conexion inactiva va a estar mantenida por el Servidor. Por defecto es 300 (segundos). Para mi es demasiado. Hay que tener en cuenta, que ademas, reducir estos segundos, nos va a beneficiar en casi todos los sentidos. Por lo tanto, mi recomendacion es que sea entre 40-50. Suelo usar 30.
KeepAlive - Son conexiones que se quedan abiertas para un cliente en la comunicacion con el servidor (Usuario entra en la web, web sirve pagina, y la conexion queda abierta para cuando vuelva usuario, seria un ejemplo chapucero). De esta forma, la reaprovecha. Es ideal para paginas donde existen unos usuarios fijos. Ademas, se puede configurar para determinar opciones (ahora las explicamos). Se configura con el On/Off. Personalmente, a mi siempre me ha ido mejor Off.
KeepAliveTimeout - Es la regulacion del tiempo que mantiene abierto el servidor la conexion, a la espera de mas peticiones. Por ejemplo, si le colocamos 15, el servidor esperara 15 segundos antes de cerrar la peticion, a la espera de que el usuario realice otra.Yo recomendaria que se bajaran esos 15 segundos. Lo dejaria en 2 o 3 maximo.
MaxKeepAliveRequest - Numero maximo de peticiones permitidas por conexion. Sinceramente, yo esto lo pondria sobre el 1000. No creo que nunca exceda ese numero, y teniendo en cuenta que si en 2 o 3 segundos como hemos configurado arriba, no existe conexion, se cerraria. Pero depende de como lo tome el servidor.
En estos momentos, es cuando tenemos que elegir que modulo vamos a ejecutar. Para ello, yo probaria primero con uno, y luego con otro si no lo tenemos claro. Y ejecutaria una prueba de Apache Benchmarking.
Es tan sencillo como:
ab -n 10000 -c 1000
http://example.com/
Y dependiendo de los resultados que nos de (Es importante saber el tiempo de respuesta de uno y otro, y tambien si llegan todas las peticiones, etc.) pues podemos elegir. Aunque generalmente, para PHP, es recomendable el prefork.
Luego, cada modulo, tiene unos valores, que vamos a describir:
- StartServers - Numero de procesos Iniciales. Mi experiencia me dice que un numero bajo puede ser importante a la hora del rendimiento. Yo por ejemplo suelo fijarlo en 5.
- MinSpareServers - Numero de procesos minimos en espera. Suelo recomendar una cifra entre 3 y 10.
- MaxSpareServers - Numero de procesos maximos en espera. Es ideal que sea el doble que el Min.
- ServerLimit - Limite del servidor de clientes (suele ir ligado al MaxClients).
- MaxClients - Este elemento es importante. Es el número total de procesos hijo httpd que pueden ser procesados simultáneamente. El valor por defecto es bastante elevado para la mayoría de servidores (256). Lo fundamental para entender como gestionar la directiva MaxClients, es comprender que puede tener un valor “alto” sino nuestro servidor está sirviendo contenido estático, pero con aplicaciones modernas tipo PHP de contenido dinámico, podemos tener graves problemas de estabilidad si no calculamos bien el número total de MaxClients. Una fórmula para calcular el valor apropiado del MaxClients sería (hay muchas) la siguiente:
MaxClients = Total RAM dedicated to the web server / Max child process size
O lo que es lo mismo, la Ram que tenemos en MB/ MB en Procesos Apache.
Para calcular esto ultimo:
Calcular memoria consumida por Apache
# ps -ylC httpd --sort:rss
–sort rss (lista ordenando por RSS(Resident Set Size), kb del proceso en memoria)
Output:
# S 48 5674 17426 0 75 0 2904 2637 277588 ? 00:00:00 httpd
2904 / 1024 = 2,8 MB ocupados por proceso de Apache. Ahora, debemos saber el número total de procesos:
# lsof -i | grep httpd | grep ESTABLISHED | wc -l
Output:
# 15
De este modo, tenemos que por proceso utilizamos 2,8 MB de memoria (no swap). Y sabemos que hay 15 procesos de apache en memoria, con lo cual 2,8 MB x 15 = 42 MB usados.
- MaxRequestsPerChild - Cuando un proceso excede este valor, el proceso es destruido y, si es necesario, un nuevo proceso lo reemplaza. Esto puede reducir la memoria total usada en muchas situaciones, con los archivos dinámicos incrementando constantemente su uso de RAM y reiniciando los procesos para reducir su uso. Por lo que se recomienda un valor alto (10000 por ejemplo).
Tras realizar todo esto, pasamos a optimizar.
OPTIMIZACION
No hablaremos de optimización totalmente pero, si comentaremos que una de las cosas que se recomiendan por toda la comunidad es deshabilitar los módulos de apache que no necesitemos. En el ejemplo que me ocupa, una máquina virtual de 1GB de RAM de OpenVZ, deshabilitamos de 52 procesos 35, dejando sólo activos 17. Volvimos a hacer el calculo de la memoria utilizada por apache entonces:
2,3 MB por proceso x 12 procesos = 33,6 MB! (22 % menos en memoria). No está mal.
Otro consejo que se da en todos los manuales de tunning de Apache, es el deshabilitar la resolución de DNS, HostnameLookups. Esta directiva intenta resolver cada IP conectada a tu servidor y eso genera un consumo de recursos innecesario.
(EDITARE ESTE TROZO REALIZANDO UNA EXPLICACION DE CADA MODULO DE APACHE)
Intentare editar este post con mas cosas. Es posible que algo este equivocado o desactualizado, porque esta guia es personal y tiene algun tiempo.
Un Saludo