lunes, 30 de septiembre de 2013

Multiples versiones de PHP corriendo en la misma máquina

El pasado viernes migramos de Ubuntu Server 12.04 a Debian 7 Wheezy en el servidor de la oficina. El motivo es muy sencillo: rendimiento. A pesar de no tener a mano los datos los benchmarks realizados, el rendimiento del sistema era paupérrimo, hasta el punto de tener que esperar unos 30 segundos por una petición http. 


Supongo que sabréis que Debian 7 incluye PHP 5.4 en los repositorios oficiales. Nada nuevo si trabajas con aplicaciones realtivamente recientes. El caso es que mantengo un Drupal 6.x corriendo PHP 5.3. Al actualizar el ssoo del servidor, os podéis imaginar : crash! La primera opción es intentar actualizar los módulos de Drupal, a versiones actuales o dev: error. Una pérdida de tiempo. La segunda opción es mantener la calma. La versiones de pre-producción y producción corren sobre una RHEL y php 5.3.15 creo recordar, y conociendo al cliente, seguirán así muchos años. La solución: instalar dos versiones PHP en el mismo servidor. El artículo en el que se basan estos apuntes es un clásico en How To Forge : How To Use Multiple PHP Versions (PHP-FPM & FastCGI) With ISPConfig 3 (Debian Wheezy) , pero claro, en Codery no usamos ISP Config, ni falta que hace. He adaptado el links anterior a nuestras necesidades. Comentaré que he modificado, donde cada punto coincide con el post de How To Forge:

1) La idea es servir con PHP5.4.X con libapache2-mod-php5 y los sitios que nos interesen con PHP5.3.27 vía FPM(última versión en el momento de escribir este post).

2) En este paso nada que añadir, salvo algún paquete extra, por lo tanto los pre-requisitos quedarían así
apt-get build-dep php5 && apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev libapache2-mod-fastcgi apache2-suexec

Entre el "make" y el "make install", en mi caso, y por curiosidad también he ejecutado un "make test", todo en orden salvo un warning con ftp_ssl; nada que me/nos preocupase por el momento. De este punto sólo hemos instalado a mayores APC y hemos cambiado en modo de ejecución del FPM a modo socket. La modificación es muy sencilla. En el fichero /opt/php-5.3.27/etc/php-fpm.conf cambiamos el valor de la directiva "listen". Revisad también el uusario y el grupo bajo el que se ejecutará el proceso.

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = www-data
group = www-data

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
;listen = 127.0.0.1:8889
listen = /var/run/php-fpm.sock 
 

Los puntos 3,4 y 5 no nos interesan para estas notas.  Vamos a la configuración del "vhost". Habilitamos los módulos necesarios en Apache2:
[apermuy@dorogo#] a2enmod fastcgi actions suexec && apache2ctl -t

Si todo está en orden

[apermuy@dorogo#] service apache2 restart


Esta en la configuración que he añadido en el fichero /etc/apache2/sites-available/misitio
  
                       
                                SetHandler php-script
                       

                        SuexecUserGroup www-data www-data
                        Alias /php5.fastcgi /var/www/fastcgi/php5.fastcgi
                        AddHandler php-script .php
                        FastCGIExternalServer /var/www/fastcgi/php5.fastcgi -socket /var/run/php-fpm.sock
                        Action php-script /php5.fastcgi virtual
 
Si todo está en orden

[apermuy@dorogo#] service apache2 restart

Nota: El directorio indicado en Alias /php5.fastcgi debe existir. Creando un fichero con phpinfo(); deberíais tener observar:


Salud!