domingo, 16 de diciembre de 2007

Cómo instalar WAPP (II)

Los tiempos avanzan que es una barbaridad y ya ha pasado casi año y medio desde que escribí la primera parte de este artículo. En él explicaba cómo instalar 2 versiones de PHP (PHP4 y PHP5), sobre un mismo servidor Apache, en un sistema operativo Microsoft Windows. En esta segunda parte voy a intentar dar un giro de tuerca al asunto, instalando ambas versiones de PHP como módulos del mismo servidor Apache, pero corriendo en procesos (servicios) separados.

Con este proceso, podremos aprovechar la misma potencia que nos ofrece Apache para un intérprete y para el otro. Además, de esta forma, iremos renovando nuestra infraestructura para el día en que la versión 4 de PHP no se soporte más. Podremos tener nuestro servidor preparado por defecto para PHP5 y, a la vez, seguir manteniendo algún viejo script de PHP4.

Este método sólo tiene un problema: necesita de más memoria RAM en el servidor porque se estarán lanzando 2 servicios en lugar de uno.

Requisitos previos

  • Tener una máquina con Microsoft Windows (recomendado XP, pero también sirve 2003 Server).
  • Haber leído la primera parte de este artículo para tener instaladas ambas versiones de PHP en el ordenador. Actualmente, recomiendo instalar las últimas versiones disponibles: la 4.4.7 y la 5.2.5.


Desinstalación de Apache

Este apartado es opcional, pero es recomendable seguirlo si en nuestra máquina ya estamos ejecutando el servidor de Apache y queremos partir de cero para continuar con el resto de instrucciones que se mencionan más adelante.

La idea es dejar la máquina lo más limpia posible, para que nada de lo que haya anteriormente instalado, cause complicaciones con lo que instalaremos a continuación. Estos son los pasos a seguir:


  1. Parar el servicio de Apache. Para ello hay varias opciones:

    • Ejecutar desde una consola de comandos la orden:
      c:\> net stop nombre_del_servicio_apache

    • Ir a la consola de servicios del sistema (services.msc) y parar desde allí el servicio.

    • Utilizar Apache Monitor (el programa que se instala en la bandeja del sistema cuando instalamos Apache).

  2. Parar la ejecución de Apache Monitor, abriéndo la aplicación y pulsando el botón Exit.

  3. Desinstalar Apache desde Agregar/Quitar programas (en el Panel de Control).

  4. Borrar la carpeta de instalación de Apache desde el explorador de archivos. Antes de hacer esto, podemos hacer una copia de seguridad por si acaso luego quisiéramos restaurar alguna configuración especial.


Un Apache, 2 procesos

Vamos a instalar la versión 2.0.61 de Apache. La razón de no utilizar una versión 2.2.x es la misma que daba hace ya un tiempo: la librería de PHP4 que se carga como módulo de Apache no funciona con la versión 2.2.

Si alguien quiere probar con Windows Vista, será mejor que lea estas instrucciones para instalar Apache.

Haremos una instalación normal, hasta que lleguemos al paso en que pregunta si queremos instalar como servicio (utilizando el puerto 80) o sólo para el usuario actual (en el puerto 8080). Elegiremos esta última opción porque, posteriormente, ya nos encargaremos de instalar manualmente los servicios que necesitemos. Para el resto del artículo, consideraré que Apache se ha instalado en el directorio c:\apache\.

Una vez acabado el asistente de instalación, iremos al directorio de configuración de Apache (c:\apache\conf\) y haremos 2 copias del fichero httpd.conf: una se llamará php5_httpd.conf y la otra php4_httpd.conf.

Nuestro servidor "principal" (el que operará en el puerto 80), cargará como módulo PHP5. El otro servidor, que estará en el puerto 8080 (pero puede elegirse otro puerto), llevará el módulo de PHP4.

Edición del fichero php5_httpd.conf

Partiendo de la configuración base de Apache, estas son las líneas que deberemos modificar:


ScoreBoardFile logs/php5_apache_runtime_status
PidFile logs/php5_httpd.pid
Listen 80
ServerName localhost:80
ErrorLog logs/php5_error.log
CustomLog logs/php5_access.log common


Y estas líneas, las deberemos añadir (se considera que PHP5 está instalado en c:\php5\, si no es así, habrá que modificar la ruta):


LoadModule php5_module "c:/php5/php5apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php5"


Edición del fichero php4_httpd.conf

Líneas a modificar:


ScoreBoardFile logs/php4_apache_runtime_status
PidFile logs/php4_httpd.pid
Listen 8080
ServerName localhost:8080
ErrorLog logs/php4_error.log
CustomLog logs/php4_access.log common


Líneas a añadir (se considera que PHP4 está instalado en c:\php4\, si no es así, habrá que modificar la ruta):


LoadModule php4_module "c:/php/sapi/php4apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php"


Dos configuraciones, dos servicios

La idea es, viendo el contenido de ambos ficheros, mantener en archivos distintos la información de cada uno de los procesos que vamos a lanzar. Y como van a ser 2 los servicios ejecutados, tenemos que utilizar puertos de escucha diferentes.

El siguiente paso a seguir es instalar los 2 servicios. Desde una consola de comandos, iremos al directorio donde está el ejecutable de Apache y escribiremos:


c:\> cd c:\apache\bin
c:\apache\bin> apache -k install -n "Apache2PHP5" -f "c:\apache\conf\php5_httpd.conf"
c:\apache\bin> apache -k install -n "Apache2PHP4" -f "c:\apache\conf\php4_httpd.conf"


Y para lanzar los servicios:


c:\apache\bin> apache -k start -n "Apache2PHP5"
c:\apache\bin> apache -k start -n "Apache2PHP4"


Si todo ha ido bien, ya tenemos todo listo para invocar a ambos servicios por separado. Vamos a hacer una prueba rápida, escribiendo un script llamado prueba_php.php con este contenido:


<?php
/* fichero prueba_php.php */
phpinfo();
?>


El script lo colocaremos en el directorio DocumentRoot de ambos servidores (que debería ser c:\apache\htdocs\ si no hemos modificado la ruta por defecto). Ejecutando http://localhost/prueba_php.php y http://localhost:8080/prueba_php.php en el navegador, nos debería salir información diferente acerca de cada uno de los módulos de PHP.

Cómo testear la configuración de cada servicio

Por si necesitáramos añadir más prestaciones a alguno de los 2 servicios, voy a comentar como comprobar si el fichero de configuración tiene o no algún fallo. Desde una consola de comandos, tendríamos que escribir:


c:\> cd c:\apache\bin
c:\apache\bin> apache -t -f "c:\apache\conf\fichero_de_configuracion.conf"


Un puerto abierto, 2 servicios en puertos diferentes

Las siguientes instrucciones son totalmente opcionales pero pueden venir bien, en el caso de que queramos dejar solamente abierto un puerto en nuestro router para acceder a cualquiera de los 2 Apaches montados y tengamos acceso al DNS para montar más dominios.

Como último paso, podemos hacer que desde fuera del servidor, parezca que las todas las peticiones sean para un único servidor. Realmente, lo que ocurre es que las peticiones que no puede gestionar el primero, las redirige al segundo, sin que por ello cambie la URL que escribe el usuario. Para ello será necesario que podamos discriminar por nombre de dominio ambos servidores porque sólo disponemos de un puerto de salida para los dos.

Para el siguiente ejemplo, se considerará que el Apache con PHP5 es accesible a través de www.examplephp5.org y el otro Apache con PHP4, a través de www.examplephp4.org. Estas 2 entradas, en el DNS, apuntarán a la misma máquina física (serán 2 alias de esa máquina).

Podemos hacer las pruebas en la máquina local, añadiendo estas entradas en el fichero c:\windows\system32\drivers\etc\hosts:


127.0.0.1 www.examplephp5.org
127.0.0.1 www.examplephp4.org


¡Ojo!. Esta configuración del archivo hosts sólo sirve para la máquina local, no para un cliente exterior.

Una vez que ya tenemos nuestro entorno de prueba, veamos qué es lo que tenemos que configurar en el servicio principal (Apache2PHP5 que escucha en el puerto 80). En el fichero de configuración php5_httpd.conf debemos modificar estas líneas (descomentándolas):


NameVirtualHost *:80
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so


Y añadiremos estas:


<VirtualHost *:80>
ServerName localhost
</VirtualHost>

<VirtualHost *:80>
ServerName www.examplephp4.org
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>


Tras reiniciar el servicio, podemos hacer la prueba, poniendo las URLs a nuestro fichero de prueba en el navegador web: http://www.examplephp5.org/prueba_php.php y http://www.examplephp4.org/prueba_php.php. Si todo ha ido bien, la información mostrada debe ser diferente. En el primer caso, el módulo cargado es el de PHP5 y, en el segundo, el de PHP4.

Referencias