Optimizando apache al máximo

8:08 0 Comments A+ a-


 Esta es una recopilación de configuraciones para mejorar el rendimiento de sus servidores Apache

MaxClients:
Ésta es una de las directivas más importantes, pues determina el número máximo de peticiones simultáneas que Apache puede atender. La idea es no permitir más conexiones de las que se pueden atender, para evitar usar swap, lo cual disminuye en mucho el rendimiento global. Las peticiones que no se puedan atender se pondrán en cola, según el valor de la directiva ListenBacklog. Se explica cómo se calcula éste número (de forma aproximada) en la documentación oficial, pero se entiende mejor de la fórmula de devside.net:

MaxClients ≈ (RAM - size_all_other_processes)/(size_apache_process)


RAM: se puede usar "free -m" para ver la ram total en MB, o cat /proc/meminfo, entre otras.

size_apache_process: Se podrá calcular el tamaño de un proceso httpd con "ps -ylC httpd --sort:rss", el cual mostrará todos los procesos httpd en ejecución, de menor a mayor tamaño, en bytes, para la columna RSS (Resident Set Size: "la memoria no-swap que ha usado, en KB" ). Se podrá ver el tamaño mayor (dividido entre 1024 para tenerlo en MB) como "size_apache_process", o siendo menos severos, usa la siguiente fórmula, la cual calcula la media de los procesos actuales de Apache, ya en MB:

ps -ylC httpd --sort:rss | awk '{SUM += $8; I += 1} END {print SUM/I/1024}'


size_all_other_processes: Siguiendo la regla anterior, se podrá ver el uso de memoria por los procesos que no sean de Apache, con la fórmula descrita a continuación, la cual ya devolverá el resultado en MB:

ps -N -ylC httpd --sort:rss | awk '{SUM += $8} END {print SUM/1024}'


Así por ejemplo:

free -m = 999MB (Mem total)
ps -ylC httpd --sort:rss | awk '{SUM += $8; I += 1} END {print SUM/I/1024}' = 20.5458 (de 10880 a 34084)
ps -N -ylC httpd --sort:rss | awk '{SUM += $8} END {print SUM/1024}' = 343.441
Max_Clients = (999 - 343.441) / 20.5458 = 31,9 => 31 (aproximado)


DirectoryIndex:
Aquí se debe especificar un listado de páginas que resolverán como índices, indicando como primera opción la opción más probable. Por ejemplo, en un servidor PHP donde el index suela ser un archivo del estilo index.php especificaremos:

DirectoryIndex index.php index.html


De esta manera, se aceptarán archivos llamados index.php e index.html como archivos que se mostrarán cuando se hace una petición a un dominio sin indicar el fichero que se quiere ver (que es lo habitual).

AllowOverride:
Para un mayor rendimiento, deberíamos indicar de forma global, y en todos los virtualhost, "AllowOverride None", para evitar que a cada petición, busque si existe o no un fichero .htaccess en los directorios de la petición (Ej. para un DocumentRoot /var/www, buscará un.htacess en /, otro en /var y otro en /var/www). Por contra, no podremos usar archivos .htaccess en aquellos virtualhost que hayamos configurado así.

FollowSymLinks y SymLinksIfOwnerMatch:
Para evitar llamadas extra en cada petición, se deberá configurar para cada "Directory" de cada VirtualHost, lo siguiente:

'Options +FollowSymLinks -SymLinksIfOwnerMatch'


HostnameLookups:
Esta directiva ya viene en las versiones superiores a Apache 1.3, en Off por defecto, y previene así aumentar la latencia de las peticiones HTTP por culpa de la resolución DNS. Si no lo está ya, se recomienda ponerla a Off.
Módulos de Multi-Procesamiento (MPM)

Apache "viene con una serie de Módulos de Multi-Procesamiento que son los responsables de conectar con los puertos de red de la máquina, aceptar las peticiones, y generar los procesos hijo que se encargan de servirlas".
Básicamente:

Worker: usa múltiples procesos hijos, con múltiples threads cada uno. Cada thread gestiona una conexión a la vez. Generalmente, se recomienda en entornos de alto tráfico.
Prefork: usa múltiples procesos hijos, con un único thread cada uno. Cada proceso gestiona una conexión a la vez. Puede trabajar con módulos de terceros.

AQUI más información sobre estos MPM. Por cierto, se puede ver con qué MPM estamos trabajando, ejecutando la siguiente línea, lo cual nos devolverá, entre otros, prefork.c o worker.c:

/usr/sbin/apachectl -l


APC
Si se quiere mejorar el rendimiento de un servidor web, PHP, una muy buena opción es instalarle APC, una caché que optimiza el código PHP intermedio y mejora notablemente el rendimiento del servidor. Sin duda, una utilidad que debería estar instalada en prácticamente cualquier servidor Apache/PHP, ya que tiene una instalación muy sencilla (se encuentra en yum) y efectos notables en el rendimiento.