Mostrando entradas con la etiqueta apache. Mostrar todas las entradas
Mostrando entradas con la etiqueta apache. Mostrar todas las entradas

sábado, 2 de enero de 2010

Personalización del listado de directorios de Apache

mod_autoindex


Aunque para entornos de producción nunca es buena idea dejar disponible para el público el listado de directorios, para algunas tareas es una funcionalidad que viene bien. Por ejemplo, para un repositorio de paquetes para una distribución Linux. Y la pregunta que surge al ver cómo quedan esos listados tan elaborados es saber cómo se pueden hacer fácilmente.

La respuesta viene de la de mano del módulo autoindex para Apache. Pero antes de entrar en detalle en este módulo, recordemos cómo evitar la generación de estos listados automáticos en la configuración de Apache.

Nota: Todas las referencias a la configuración y funcionamiento de Apache se han hecho sobre la versión 2.2.14 para Win32, excepto las que se indiquen explícitamente.

Desactivación de los listados automáticos

Dentro de las directivas Location y Directory, la directiva Options se encarga de configurar las opciones disponibles para esa determinada ubicación. El modificador Indexes es el encargado de activar al módulo autoindex, por lo que para evitar esta funcionalidad, deberemos configurarlo más o menos así:
<Location />
Options -Indexes …
…
</Location>

Otra opción más radical es comentar la línea de carga del módulo en el fichero httpd.conf. Pero si elegimos esta opción, deberemos revisar el resto de la configuración para quitar la opción Indexes de cualquier directiva Options en la que aparezca. En caso contrario, al reiniciar el servicio, Apache informará que se ha producido un error y no arrancará.

Creación de la configuración para autoindex


Si nos fijamos en el fichero de configuración global de Apache, la siguiente línea se encuentra comentada por defecto:
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf

Por lo que si tenemos activado el listado automático, veremos que el resultado es de lo más espartano.

Ejemplo de listado de directorio sin la configuración de mod_autoindex

En lugar de hacer modificaciones sobre el fichero httpd-autoindex.conf, vamos a crear uno nuevo, llamado custom_autoindex.conf, que situaremos en el mismo directorio donde se encuentre el archivo httpd.conf. De esta forma, sólo con incluir esta línea al final del fichero httpd.conf, se cargarán nuestras modificaciones:
# Añadir al final del fichero httpd.conf
Include conf/custom_autoindex.conf

Personalización de las directivas


En el manual oficial de Apache, se encuentran explicadas cada una de las directivas disponibles para el módulo autoindex. En el presente artículo sólo se muestran algunas de ellas, por lo que si alguien necesita alguna funcionalidad más de las aquí presentadas, recomiendo la lectura de la documentación oficial.
IndexOptions

Los modificadores de esta directiva se pueden agrupar todos dentro de la misma línea o bien se pueden ir agregando uno por línea, para que el fichero quede más claro y legible y para que sea más fácil jugar (comentar/descomentar) las diferentes opciones.

La primera opción en nombrar es, precisamente, la que permite activar otras opciones más avanzadas de los listados de directorios. Se llama FancyIndexing y, si está desactivada, el listado de archivos se presenta en forma de lista simple (tal y como se puede ver en la imagen del primer ejemplo).

La siguiente que vamos a presentar es FoldersFirst y, como su nombre indica, independientemente del orden que escoja el usuario (las columnas nombre, última modificación, tamaño, etc), siempre aparecerán primero los directorios y después los ficheros.

Otra opción relacionada con la ordenación es IgnoreCase. Si está activada, mayúsculas y minúsculas no importarán a la hora de ordenar los archivos.

Adicionalmente, también vamos a añadir la opción VersionSort para que, en el caso de mostrar varios ficheros con mismo nombre pero versión diferente, se ordenen perfectamente de acuerdo a la versión y no al orden ASCII: la versión 1.12 iría después de la 1.9, por ejemplo.

IconsAreLinks permite que los iconos asociados a cada fichero también sean un enlace a dicho archivo. Como las imágenes suelen ser zonas muy apetecibles para el ratón, dejaremos esta opción activada.

Para nuestro ejemplo, vamos a activar la opción SuppressDescription, para no mostrar la descripción de los tipos de archivo en el listado. Aunque en un entorno real, es una funcionalidad que puede ser interesante si se listan tipos de fichero poco usuales.

Para tener más control sobre la salida HTML generada por mod_autoindex, vamos a activar las opciones SuppressRules, SuppressHTMLPreamble y XHTML. De esta forma, obligamos a que el módulo saque el contenido del listado en formato XHTML (y no en HTML 3.2) y que se ocupe sólamente de generar dicho listado. El resto de la página la generaremos nosotros más adelante.

El fichero custom_autoindex.conf, con todo lo visto hasta ahora, comenzaría así:
IndexOptions FancyIndexing
IndexOptions FoldersFirst
IndexOptions IgnoreCase
IndexOptions VersionSort
IndexOptions IconsAreLinks
IndexOptions SuppressDescription
IndexOptions SuppressRules
IndexOptions SuppressHTMLPreamble
IndexOptions XHTML

Directorio de iconos

Los iconos por defecto que vienen distribuidos con Apache, aunque funcionales, se han quedado algo antiguos en cuanto a diseño. Por esa razón, vamos a cambiarlos por los que vienen en la colección hidroxygen.

Para ello, vamos a poner en un mismo directorio todos los iconos de esta colección de tamaño 32x32 píxeles. Conviene recordar que cualquier cambio en la asociación de ficheros, requiere reiniciar Apache.

La configuración de este directorio, quedaría así:
Alias /icons/ "D:/Apache2/conf/hidroxygen/"

<Directory "D:/Apache2/conf/hidroxygen">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Asociación de tipos de archivos

Hay varias directivas relacionadas con la asociación:

  • AddIconByEncoding: sirve para asociar un icono a una codificación MIME.

  • AddIconByType: asocia un icono a un tipo MIME.

  • AddIcon: asocia un icono a una extensión.


Para nuestro ejemplo, este sería el código:
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (IMG,/icons/image.png) image/*
AddIconByType (SND,/icons/sound.png) audio/*
AddIconByType (VID,/icons/video.png) video/*

AddIcon /icons/binary.png .bin .exe
AddIcon /icons/tar.png .tar
AddIcon /icons/zip.png .Z .z .tgz .gz .zip
AddIcon /icons/pdf.png .ps .ai .eps .pdf .dvi
AddIcon /icons/www.png .html .shtml .htm
AddIcon /icons/txt.png .txt
AddIcon /icons/text-x-csrc.png .c .h
AddIcon /icons/application-x-php.png .php
AddIcon /icons/application-x-perl.png .pl
AddIcon /icons/application-x-python.png .py
AddIcon /icons/text-x-script.png .conf .sh .shar .csh .ksh .tcl .cgi
AddIcon /icons/tex.png .tex
AddIcon /icons/rar.png .rar
AddIcon /icons/rpm.png .rpm
AddIcon /icons/text-css.png .css

AddIcon /icons/violet-go-up.png ..
AddIcon /icons/gnome-blog.png README
AddIcon /icons/oxyviolet-folder.png ^^DIRECTORY^^

Las últimas 3 líneas son especiales porque sirven para asociar al directorio anterior (..), los archivos README y los directorios, respectivamente.

La lista de asociación se puede hacer tan larga y específica como se quiera o necesite. Como podemos ver, puede ser genérica (usando AddIconByEncoding y AddIconByType) o más particular (con AddIcon y la lista de extensiones).

Hay una directiva más, DefaultIcon, que sirve para mostrar un icono por defecto para los tipos de archivo que no hayamos declarado explícitamente:
DefaultIcon /icons/unknown.png

Salida XHTML

Antes hemos dicho que del módulo autoindex sólo queríamos que generara los listados de archivos, porque el resto de la salida la personalizaríamos nosotros.

La directiva HeaderName sirve para indicar el fichero que se antepondrá al listado de mod_autoindex. Y la directiva ReadmeName, para indicar el archivo que se añadirá al final de listado generado. De esta forma, y con ayuda de la opción SuppressHTMLPreamble, tendremos control total sobre el HTML que enviaremos al navegador desde el servidor web.

Si se quisieran diferentes contenidos de cabecera y pie para cada directorio a mostrar, es posible hacerlo indicando una ruta relativa a los ficheros en estas directivas. Sin embargo, para este ejemplo, vamos a usar una ruta absoluta, que debe estar (esta sí) dentro del directorio de publicación de Apache.
ReadmeName "/autoindex/footer.shtml"
HeaderName "/autoindex/header.shtml"

IndexIgnore

Para acabar con la configuración de este ejemplo, conviene nombrar la directiva IndexIgnore. Sirve para ocultar del listado automático ciertos archivos. Por ejemplo, para evitar que se muestren las copias de seguridad (ficheros acabados en ~ en los sistemas Linux), los propios archivos usados para cabecera y pie de los listados, etcétera.
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t *.shtml

Contenido de los archivos HeaderName y ReadmeName


El contenido de estos ficheros debe generar HTML, por lo que o bien puede estar en HTML puro o puede estar programado en algún lenguaje interpretado como SSI, PHP, Python o Perl, por ejemplo. Esta opción es interesante para poder mostrar contenido variable y poder tener unos ficheros de cabecera globales. Dicho contenido variable nos lo proporciona el propio servidor a través de sus variables de entorno.

En nuestro ejemplo, vamos a hacer la programación en SSI, puesto que sólo vamos a mostrar algunas de estas variables de Apache. Para activar la interpretación de las instrucciones SSI en el directorio donde hemos puesto los archivos .shtml, debemos añadir a la configuración:
<Location "/autoindex">
Options +Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</Location>


En entornos Linux, los archivos .shtml deben tener el atributo de ejecución (además del de lectura para el usuario que ejecute Apache) para que puedan ser ejecutados por el servidor web.

Ejemplo completo



Como resultado de la configuración aplicada en este artículo, el contenido del directorio que hemos mostrado antes, ahora luciría de esta forma:

Ejemplo de listado de directorio empleando mod_autoindex

El contenido completo del fichero custom_autoindex.conf:
IndexOptions FancyIndexing
IndexOptions FoldersFirst
IndexOptions IgnoreCase
IndexOptions VersionSort
IndexOptions IconsAreLinks
IndexOptions SuppressDescription
IndexOptions SuppressRules
IndexOptions SuppressHTMLPreamble
IndexOptions XHTML

Alias /icons/ "D:/Apache2/conf/hidroxygen/"

<Directory "D:/Apache2/conf/hidroxygen">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (IMG,/icons/image.png) image/*
AddIconByType (SND,/icons/sound.png) audio/*
AddIconByType (VID,/icons/video.png) video/*

AddIcon /icons/binary.png .bin .exe
AddIcon /icons/tar.png .tar
AddIcon /icons/zip.png .Z .z .tgz .gz .zip
AddIcon /icons/pdf.png .ps .ai .eps .pdf .dvi
AddIcon /icons/www.png .html .shtml .htm
AddIcon /icons/txt.png .txt
AddIcon /icons/text-x-csrc.png .c .h
AddIcon /icons/application-x-php.png .php
AddIcon /icons/application-x-perl.png .pl
AddIcon /icons/application-x-python.png .py
AddIcon /icons/text-x-script.png .conf .sh .shar .csh .ksh .tcl .cgi
AddIcon /icons/tex.png .tex
AddIcon /icons/rar.png .rar
AddIcon /icons/rpm.png .rpm
AddIcon /icons/text-css.png .css

AddIcon /icons/violet-go-up.png ..
AddIcon /icons/gnome-blog.png README
AddIcon /icons/oxyviolet-folder.png ^^DIRECTORY^^

DefaultIcon /icons/unknown.png

ReadmeName "/autoindex/footer.shtml"
HeaderName "/autoindex/header.shtml"

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t *.shtml

<Location "/autoindex">
Options +Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</Location>

Contenido del fichero header.shtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><!--#echo var="SERVER_NAME" --><!--#echo var="REQUEST_URI" --></title>
<link rel="stylesheet" type="text/css" href="/autoindex/style.css" media="screen" />
</head>
<body>
<div id="header">
<h1><!--#echo var="SERVER_NAME" --><!--#echo var="REQUEST_URI" --></h1>
</div>
<div id="content">

Contenido de footer.shtml:
</div>
<div id="footer">
<address>Copyright © jact 2010</address>
<address><!--#echo var="SERVER_SOFTWARE" --> on <!--#echo var="SERVER_NAME" --></address>
</div>
</body>
</html>

Hoja de estilos (style.css):
body {
background: #F6F6F6;
font-family: "Trebuchet MS", sans-serif;
margin: 1.5em;
}

#header {
border-bottom: 1px solid #000;
}

#content pre {
font-family: "Lucida Console", monospace;
font-size: 120%;
}

#footer {
border-top: 1px solid #000;
padding-top: 1em;
}

a img {
border: none;
}

address {
font-style: normal;
font-size: 90%;
}

Referencias


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

jueves, 24 de agosto de 2006

Cómo instalar WAPP

Para empezar, ¿qué significa eso de WAPP? Es un acrónimo que quiere decir Windows Apache PHP4 PHP5. Si hay infinidad de referencias a cómo instalar LAMP (Linux Apache MySQL PHP) o AMP (Apache MySQL PHP), tanto en Linux como en Windows, hay muy pocas explicaciones acerca de cómo instalar un entorno mixto de desarrollo para PHP (versiones 4 y 5). De eso trata este artículo.

PHP es un lenguaje de programación bastante usado en entornos web dinámicos, que ha evolucionado muchísimo en muy poco tiempo. Hace ya 2 años que salió la versión 5, sin embargo, aun siendo mejor, no está siendo usada por la comunidad de programadores. Las razones son simples. Mejor dicho, la razón es simple. Casi todo el hosting que permite la ejecución de scripts PHP está sólamente preparado para PHP4. Los cambios entre ambas versiones son profundos (sobre todo en cuestiones de OOP) y la compatibilidad hacia atrás de la versión 5 tiene sus problemas. Ante esta perspectiva, las empresas de hospedaje web han preferido mantener la versión 4 para que todo el código existente (que es cuantioso) siga funcionando.

Pero como las mejoras de la versión 5 (aunque ya está en preparación la versión 6) son evidentes, qué mejor que juguetear con ella en un entorno controlado (como puede ser nuestro ordenador personal) e ir viendo sobre el terreno cómo se comportan nuestros programas en ambas versiones.

Los siguientes pasos explican como instalar la versión 4 de PHP como módulo de Apache y la versión 5 como CGI, sobre un entorno de desarrollo con Microsoft Windows XP y Apache (ambos componentes se sobrentiende que están ya instalados). Para facilitar la instalación, se considerará que Apache (versión 1.3.x o 2.0.x, no la versión 2.2.x porque actualmente todavía no existe módulo de PHP para esta versión) está instalado en c:\apache\.


  1. Descargar las últimas versiones disponibles tanto de la versión 4 como de la 5. A día de hoy: 4.4.4 y 5.1.6. Es conveniente bajar los comprimidos para win32, no los instaladores. De esta forma podremos llevar a cabo la instalación de una forma más limpia y sin que nos falte nada (los instaladores para Windows sólo instalan PHP como CGI, no como módulo de Apache, y vienen sin extensiones externas).

  2. Descomprimir la versión 4 en el directorio c:\php\.

  3. Copiar el archivo c:\php\php.ini-recommended como c:\php\php.ini.

  4. Será necesario cambiar algunos parámetros del archivo php.ini. Son estos:

    extension_dir = "c:/php/extensions/"

    session.save_path = "C:\php\session" ; además será necesario crear ese directorio


  5. Añadir al PATH del sistema las rutas c:\php y c:\php\extensions. Para ello, al final del actual PATH, añadimos lo siguiente: ;c:\php;c:\php\extensions. El punto y coma es el separador de rutas. De esta forma, en lugar de copiar el fichero al directorio c:\windows\system32\, podremos actualizar a la próxima versión de PHP4 de una forma más ágil y limpia. Lo malo de hacerlo así, es que será necesario reiniciar el ordenador para que el sistema relea el PATH (con cerrar la sesión de usuario no es suficiente).

  6. Crear el fichero c:\apache\conf\php4.conf con el siguiente contenido:

    <VirtualHost *:80>
    # carga el módulo de Apache de PHP
    LoadModule php4_module "c:/php/sapi/php4apache2.dll"

    # permite tener el fichero php.ini en ese directorio y no en c:\windows
    PHPIniDir "C:/php"
    </VirtualHost>


  7. Editamos el fichero c:\apache\conf\httpd.conf y añadimos como última línea esto:

    include conf/php4.conf

    Es conveniente terminar la línea con un retorno de carro (por si acaso).

  8. Por último, como antes he indicado, habrá que reiniciar el sistema por haber cambiado el PATH. Tras hacerlo, ya tendremos instalado PHP4 como módulo de Apache. Para comprobarlo, crearemos en DocumentRoot (se considera como directorio de publicación para este artículo c:\apache\htdocs\, pero se puede cambiar en el archivo de configuración), el fichero prueba_php.php, que tendrá el siguiente contenido:

    <?php
    phpinfo();
    ?>

    Para ejecutarlo, habrá que apuntar el navegador web a http://localhost/prueba_php.php y ver qué aparece. Si todo ha ido bien, deberían mostrarse las características del entorno y los módulos de PHP cargados.



Ahora sigamos con PHP5.

  1. Para ello, lo primero será descomprimir la versión 5 en el directorio c:\php5\.

  2. Copiar el archivo c:\php5\php.ini-recommended como c:\php5\php.ini.

  3. Habrá que retocar ciertos parámetros del archivo php.ini. Son estos:

    ; Windows: "\path1;\path2"
    ;include_path = ".;c:\php5\includes" ; aunque esté comentado, corregimos la ruta para futuros usos

    extension_dir = "c:/php5/ext/"

    session.save_path = "c:/php5/session" ; además será necesario crear ese directorio


  4. Paso opcional. Si necesitamos acceder a bases de datos MySQL, deberemos habilitar la extensión en el archivo php.ini porque por defecto, en la versión 5, viene deshabilitada. Deberemos dejar así esta línea:

    extension=php_mysql.dll ; sin el punto y coma del principio para que no se tome como comentario


  5. Crear el fichero c:\apache\conf\php5.conf con el siguiente contenido:

    # para habilitar la escucha de Apache en otro puerto además del 80
    Listen 8080

    <VirtualHost *:8080>
    ScriptAlias /php5/ "c:/php5/"
    SetEnv PHPRC c:/php5

    # si nuestro DocumentRoot es otro directorio, habrá que cambiarlo
    <Directory "c:/apache/htdocs">
    Options +ExecCGI +FollowSymLinks
    </Directory>
    AddHandler php-cgi-script .php
    Action php-cgi-script /php5/php-cgi.exe
    </VirtualHost>


  6. Editamos el fichero c:\apache\conf\httpd.conf y añadimos como última línea esto:

    include conf/php5.conf

    Es conveniente, como antes hemos indicado, terminar la línea con un retorno de carro (por si acaso).

  7. Como último paso, habrá que reinicar de nuevo el servicio de Apache para que admita los cambios de configuración. Para probar que esta parte también funciona, esta vez pondremos en el navegador web http://localhost:8080/prueba_php.php. Nótese el cambio de puerto en la petición. PHP4, al ser módulo de Apache, recogerá las peticiones que se hagan al puerto 80. PHP5, en cambio, escuchará lo que se le mande en el puerto 8080. De esta forma, ya tenemos listo el entorno mixto de PHP.



Actualización (2006-11-09):
En la instalación de PHP4, si queremos habilitar alguna extensión (por ejemplo la relacionada con gettext [php_gettext.dll] para internacionalizar nuestras aplicaciones), será necesario añadir al path del sistema el directorio c:\php\dlls\. Para ello, habrá que modificar el path y agregar al final: ;c:\php\dlls. Después, hay que reiniciar el equipo para que el sistema se adapte al cambio.