PHPHoy voy a hacer unos de esos post que como el anterior no interesa a nadie pero que al menos sirven como recordatorio para cuando quiera hacer lo mismo :mrgreen:

Desde hace un tiempo esta web junto con otras está alojada en un VPS que llego a mis manos absolutamente pelado, listo para empezar a instalar paquetes (Pero eso es lo más lindo, instalar todo, configurar y que funcione :D ) El tema es que tenia que ser cuidadoso con el uso de memoria, y es así que busque optimizar por todos lados.

Una de las formas de, entre otras cosas, reducir el uso de memoria, es haciendo lo que voy a explicar: Cambiarle el MPM a Apache por el Worker, Agregarle FastCGI para quitarle el manejo de las páginas dinámicas, y procesar PHP por afuera, con PHP-FPM ;)

Introducción

Apache una vez instalado con el módulo de PHP normalito funciona por default con un MPM (Módulo de multiprocesamiento) llamado Prefork. El mismo no maneja hilos de ejecución, es fácil de configurar y generalmente no da problemas, se la banca. Con Prefork se crean una serie de procesos (los cuales atenderán las peticiones) y cada uno de ellos tendrá cargado los módulos que se hayan habilitado, entre ellos mod_php, osea el módulo que  procesa PHP ;)

Procesos Apache

El tema es que cada uno de los procesos debe saber como interpretar PHP, así que cargan el módulo: No importa si lo cargo otro proceso, cada uno cargará su propio módulo y eso es lo que explica los 32Mb de memoria que ocupan.

Otro de los MPM que se suelen utilizar es el Worker. Lo bueno de este es que maneja hilos de ejecución, es mucho más configurable pero tiene un “problema”: Cuando se instala los procesos que se crean no tienen ni idea como manejar PHP, por lo que hay que “enseñarles” que eso lo tienen que delegar a otro proceso que si sepa como interpretarlos. Esto último se logra con FastCGI. ¿Y quien sabe como se procesan los PHP? PHP-FPM ;)

De esta manera los procesos de Apache ya no necesitan saber todo, pueden dedicarse a servir lo estático y derivar a otros procesos (uno, o dos, los necesarios) lo dinámico. Así se reduce el uso de memoria,  se mejora el rendimiento, entre otros beneficios.

 

APACHE - FastCGI

PHP-FPM
(Miren, procesos chiquitos de Apache, 8Mb cada uno excepto el principal :mrgreen: )

Instalando

Antes que nada la aclaración: Yo esto lo hice con Debian 7. Seguramente funciona en las ultimas versiones de Ubuntu (Agréguenle sudo a los comandos) y en Debian 6 si se agregan los paquetes de PHP-FPM (Usando el repositorio Dotdeb).  No me hago responsable si rompen todo, ya son grandecitos para saber los comandos que tiran :mrgreen:

Primero instalamos los paquetes necesarios:

sudo apt-get install libapache2-mod-fastcgi apache2-mpm-worker php5-fpm

Al instalar apache2-mpm-worker se va a desinstalar apache2-mpm-prefork. No pasa nada, no pueden convivir juntos, se odian :mrgreen:

Luego activamos estos dos modulos:

a2enmod actions fastcgi

Y reiniciamos Apache y PHP-FPM

service apache2 restart
service php5-fpm restart

Una vez realizado esto, en /etc/apache2/mods-enabled deberíamos tener un archivo llamado fastcgi.conf. Se crea automáticamente, si no se creó pueden probar reiniciar de nuevo Apache pero debería estar. Lo que hay que hacer es editarlo (nano  /etc/apache2/mods-enabled/fastcgi.conf) para que quede así:

<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /var/lib/apache2/fastcgi

Alias /php5.fastcgi "/var/www/fastcgi/php5.fastcgi"
AddHandler php-script .php
FastCGIExternalServer /var/www/fastcgi/php5.fastcgi -socket /var/run/php5-fpm.sock
Action php-script /php5.fastcgi virtual

<Directory "/var/www/fastcgi">
Order allow,deny
<Files "php5.fastcgi">
Order deny,allow
</Files>
</Directory>
</IfModule>

Luego crean el directorio y le dan permiso 777 (Ojo, no se si es necesario, así me funcionó a mi ;) ):

mkdir /var/www/fastcgi
chmod 777 /var/www/fastcgi

Y volvemos a reiniciar ambos servicios:

service apache2 restart
service php5-fpm restart

Listo :D debería estar todo andando! ¿No funciona? ¿Estas desesperado? Instalando de nuevo el MPM prefork debería volver a funcionar.

Configurando

Es posible que necesitan afinar aún más el rendimiento o el uso de memoria. El primer lugar para tocar es /etc/apache2/apache2.conf. La parte interesante es esta:

<IfModule mpm_worker_module>
 StartServers          2
 MinSpareThreads      25
 MaxSpareThreads      75
 ThreadLimit          64
 ThreadsPerChild      25
 MaxClients          150
 MaxRequestsPerChild   0
</IfModule>

Pueden buscar que significa cada cosa en la documentación de Apache ;)

También se puede editar lo que tiene que ver con PHP-FPM desde /etc/php5/fpm/pool.d/www.conf. Entre otras cosas se puede definir cuando se crearan los nuevos procesos (Por ejemplo dinámicamente a medida que haya más carga, o solo a demanda), cuantas peticiones deben responder antes de matarse, esta todo explicadisimo en el mismo archivo, léanlo :)

Probando

Ya no queda mucho más por hacer más que probar como funciona. Otra cosa interesante a  considerar es agregar un cache de opcode (Por ejemplo APC). En mi caso no logre que funcionará bien (Errores 500 cada dos por tres) así que se los debo :mrgreen:

Etiquetas: , , , , , ,

Deja tu comentario