Aunque la instalación y configuración inicial de Drupal es relativamente sencilla y directa, configurarlo para que varios sites compartan el mismo motor fue, para mí, casi un dolor de cabeza.
Drupal
Drupal es un CMS (Sistema administrador de contenidos) open source escrito en PHP. Es muy popular y, debido a su arquitectura especialmente extensible, que permite construir aplicaciones más allá del CMS, es considerado también como framework.
La instalación es simple. Se descomprime el archivo que se descarga de
drupal.org en algún lugar del directorio web. Luego se accede a la dirección correspondiente y se siguen los pasos, que incluye indicar los parámetros de acceso a una base de datos MySQL (o PostgreSQL) y definir un usuario administrador.
Drupal Multi-Site
En el árbol drupal instalado hay un directorio
sites. Allí, en el directorio
default podemos colocar los archivos, módulos y temas del site. Además hay un directorio
all, donde el manual, los tutoriales y los libros colocan los módulos y temas para que 'estén disponibles para todos los otros sites'.
Así que uno se imagina que puede tener más sites bajo ese mismo árbol, funcionando con el mismo motor. De hecho, esa configuración se denomina
multi-site.
Pareciera que es algo que no se usa mucho, porque no lo mencionan en ningún material introductorio. En la documentación hay varios casos para leer. Si antes de hacerlo uno se imagina que bastará con crear otros subdirectorios con la misma estructura, encontrará que no es así.
Entonces, lógicamente, se lee un poco el manual... luego en los foros... blogs... googleando en la búsqueda de una explicación que quién iba a pensar sería tan difícil de encontrar. Es un problema algo frustrante. Al menos para mí; me tomó todo el día dar con una solución.
Mi ambiente
En un sistema con Windows 7, desarrollo usando XAMPP 1.7.1.
XAMPP es un paquete que facilita el desarrollo PHP/MySQL. Viene con Apache, PHP, MySQL y Mercury Mail preconfigurados para trabajar juntos, lo que es realmente un gran ahorro de tiempo, respecto a realizar manualmente cada instalación/configuración. Uso la versión 1.7.1 porque usa PHP 5.2, que no emite una alarma cada vez que un parámetro es pasado por referencia (lo cual en PHP 5.3 se ha vuelto deprecated). Y como muchos módulos que corren con Drupal 6.x tienen funciones con parámetros pasados por referencia me parece mejor ser un poco prácticos y usar una versión menos que la ultimita :)
XAMPP 1.7.1 viene con Apache 2.2.11, PHP 5.2.9, MySQL 5.1.33-community, entre otros paquetes (ver Old Version of XAMPP para más detalles).
Se supondrá que XAMPP está instalado en C:\bin\dev\xampp\. Eso significa que el directorio web es C:\bin\dev\xampp\htdocs\. Allí, Drupal 6.16 está instalado en test\drupal_101\. Es decir que, para acceder a mi drupal, el url es http://localhost/test/drupal_101/.
Podría ser más sencillo, pero no es demasiado complicado y creo que tener el drupal un poco metido en el árbol ayudará a ilustrar mejor el punto.
Mi solución
Los pasos que suelen aparecer en la mayoría de la documentación, foros, blogs y otras fuentes de internet mencionan virtualhosts o aliases en apache, .htaccess, hosts, subdominios y otras cosas complicadas.
Practicamente nadie se detiene a explicar el por qué la necesidad de estas complicaciones, o cuál es la idea básica del proceso. Y me parece que deberian hacerlo, porque aclara algo muy importante del funcionamiento de Drupal.
Cuando accedo a http://localhost/test/drupal_101/, Drupal eventualmente buscará un archivo settings.php. En una instalación típica lo encuentra en sites/default/settings.php.
Lo que no se nos dice con claridad es que, en realidad,
Drupal usa el url como parámetro para determinar dónde buscar el archivo settings.php. De hecho, parece que
default es el último lugar donde busca. Antes ha buscado en
localhost.test.drupal_101. Puede hacer la prueba renombrando
sites/default como
sites/localhost.test.drupal_101 y ver que funciona igual. Sorprendente ¿no?
Si yo quisiera un nuevo site, digamos http://localhost/test/drupal_202/, lo que tendría que hacer es correr la misma aplicación pero bajo ese nuevo nombre. Es decir, lograr que al entrar a ese url se corra exactamente el mismo php que antes. Eso haría que Drupal busque el archivo
sites/localhost.test.drupal_202/settings.php correspondiente. Y si existiera y estuviera bien configurado, listo, ¡tendríamos Drupal multi-site!
Pero ¿cómo hacer eso?. Ahí es donde la mayoría mete en el juego las complicaciones de los dominios, subdominios, hosts, virtualhosts, .htaccess, etc. Son soluciones válidas pero, en mi humilde opinión, hay un modo más sencillo, que está al alcance tanto de los usuarios Windows como Linux, y además ilustra bastante más cláramente lo que ocurre.
Abro una consola de comandos en el directorio que contiene a mi arbol drupal_101, htdocs/test/ (SHIFT+clic derecho, Open command window here), para ejecutar el comando
mklink:
mklink /J drupal_202 drupal_101
Eso crea un enlace simbólico (una especie de directorio ficticio) que permite apuntar al directorio drupal_101 con un nombre nuevo adicional drupal_202.
mklink está disponible en Windows 7 y WIndows Vista. Para Windows XP puede usar el comando Junction (puede ver más información sobre esto en el post Enlaces simbólicos en Windows). En Linux usaría un comando similar a ln -s drupal_101 drupal_202 (allí primero se indica el destino y luego el link).
Hecho esto, al entrar a http://localhost/test/drupal_202/ uno esperaría ver lo mismo que si se entrara a http://localhost/test/drupal_101/. Después de todo se trata del mismo directorio, aunque tenga dos etiquetas. Pero, como Drupal usa el url como parámetro para determinar el lugar dónde debe estar el archivo settings.php, encontrará uno diferente en sites/localhost.test.drupal_202/ y así veremos un site también diferente.
En resúmen
Drupal usa el url como parámetro para determinar que settings.php usar. Y el settings.php determina el site que se carga. De ese modo podemos tener varios sites, si logramos entrar al mismo drupal usando diferentes nombres. Una manera sencilla de lograr eso es usando enlaces simbólicos. Eso me parece menos complicado que la alternativa de los aliases, y virtualhosts.
En el fondo, esta técnica aparece en la documentación cuando habla del uso de subdominios, pero la idea escencial está tan opacada por las otras dificultades que cuesta distinguirla. Ojalá este artículo sea de ayuda.
Posibilidades
Basta cambiar la configuración de la base de datos que aparece en el settings.php para que el site se transforme en algo completamente diferente. Jugar con esto me ayudó a entender un poco mejor la naturaleza de una aplicación drupal respecto de otras opciones.
El nombre localhost.test.drupal_202 sigue un patrón que se explica mejor en el comentario contenido en el archivo
default.settings.php