Cuando configuramos un servidor en el que vamos a alojar múltiples sitios web, lo habitual es tener un archivo de configuración para cada uno de los sites que vamos a alojar. Estos ficheros en un sistema Debian GNU/Linux o derivado (Ubuntu) se alojan en el directorio /etc/apache2/sites-available, de manera que la estructura es la siguiente:
/etc/apache2/sites-available [directorio]
/etc/apache2/sites-available/sitio1 [configuración www.sitio1.com]
...
/etc/apache2/sites-available/sitioN [configuración www.sitioN.com]
Si utilizamos el mismo framework para varios sitios alojados, veremos como los ficheros de configuración de dichos sitios son muy parecidos. De hecho, lo habitual es que en estos sitios sólo varíen la ruta del DocumentRoot y el nombre del host. Por ejemplo, para una instalación de un CMS cualquiera podemos tener el siguiente fichero de configuración:
<VirtualHost *:80>
Servername www.sitio1.com
DocumentRoot /var/www/www.sitio1.com
<Directory />
AllowOverride none
Order allow,deny
Deny from all
</Directory>
<Directory /var/www/www.sitio1.com>
Options FollowSymLinks
AllowOverride All
LimitRequestBody 40960000
php_flag engine on
php_value log_errors 1
php_flag magic_quotes_gpc off
php_value memory_limit 128M
php_value post_max_size 30M
php_value upload_max_filesize 30M
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Si configuramos otro sitio similar, tendríamos que hacer un fichero igual tan solo cambiando los valores de ServerName y DocumentRoot. Como ya podéis imaginar, cuando haya que cambiar globalmente para todos los sitios de este tipo alguno de los valorer de configuración, como por ejemplo, aumentar el tamaño máximo de los archivos aceptados por el servidor, habrá que ir archivo por archivo editando el valor y esto es algo bastante tedioso.
Para evitar estas situaciones podemos hacer uso de mod_macro. Este módulo permite definir secciones de configuración completas y parametrizadas, de manera que puedan ser incluidas múltiples veces evaluándolas con diferentes valores. Es una aproximación muy cercana al mundo de la programación, en la que el símil sería una función definida por el usuario.
Si instalamos mod_macro en nuestra distribución y lo activamos con a2enmod, podremos crear la siguiente macro en el archivo /etc/apache2/sites-available/macros/cmssite.conf:
<Macro CMSSite $hostname>
<VirtualHost *:80>
Servername $hostname
DocumentRoot /var/www/$hostname
<Directory />
AllowOverride none
Order allow,deny
Deny from all
</Directory>
<Directory /var/www/$hostname>
Options FollowSymLinks
AllowOverride All
LimitRequestBody 40960000
php_flag engine on
php_value log_errors 1
php_flag magic_quotes_gpc off
php_value memory_limit 128M
php_value post_max_size 30M
php_value upload_max_filesize 30M
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Con esto, podemos reescribir cada uno de los ficheros que utilizan la configuración común para que sólo tengan la siguiente llamada a la macro:
Include /etc/apache2/sites-available/macros/cmssite.conf
Use CMSSite www.sitio1.com
La primera línea incluye el fichero con la macro, para que esté disponible. La segunda línea ejecuta la macro pasando como parámentro www.sitio1.com.
De esta manera, ya tenemos la configuración parametrizada. El problema es que solo podemos incliur la macro una sola vez, así que para evitar errores de definiciones duplicadas de macros, podemos llevarnos la inclusión de la macro a un "falso site" que se carga antes de cualquier otro, de esta manera la macro estará disponible para cualquier otro site que se ejecute posteriormete. Para hacer esto tenemos que meter la definición de la macro en el fichero /etc/apache2/sites-available/00_load_macros:
Include /etc/apache2/sites-available/macros/cmssite.conf
/etc/apache2/sites-available [directorio]
/etc/apache2/sites-available/sitio1 [configuración www.sitio1.com]
...
/etc/apache2/sites-available/sitioN [configuración www.sitioN.com]
Si utilizamos el mismo framework para varios sitios alojados, veremos como los ficheros de configuración de dichos sitios son muy parecidos. De hecho, lo habitual es que en estos sitios sólo varíen la ruta del DocumentRoot y el nombre del host. Por ejemplo, para una instalación de un CMS cualquiera podemos tener el siguiente fichero de configuración:
<VirtualHost *:80>
Servername www.sitio1.com
DocumentRoot /var/www/www.sitio1.com
<Directory />
AllowOverride none
Order allow,deny
Deny from all
</Directory>
<Directory /var/www/www.sitio1.com>
Options FollowSymLinks
AllowOverride All
LimitRequestBody 40960000
php_flag engine on
php_value log_errors 1
php_flag magic_quotes_gpc off
php_value memory_limit 128M
php_value post_max_size 30M
php_value upload_max_filesize 30M
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Si configuramos otro sitio similar, tendríamos que hacer un fichero igual tan solo cambiando los valores de ServerName y DocumentRoot. Como ya podéis imaginar, cuando haya que cambiar globalmente para todos los sitios de este tipo alguno de los valorer de configuración, como por ejemplo, aumentar el tamaño máximo de los archivos aceptados por el servidor, habrá que ir archivo por archivo editando el valor y esto es algo bastante tedioso.
Para evitar estas situaciones podemos hacer uso de mod_macro. Este módulo permite definir secciones de configuración completas y parametrizadas, de manera que puedan ser incluidas múltiples veces evaluándolas con diferentes valores. Es una aproximación muy cercana al mundo de la programación, en la que el símil sería una función definida por el usuario.
Si instalamos mod_macro en nuestra distribución y lo activamos con a2enmod, podremos crear la siguiente macro en el archivo /etc/apache2/sites-available/macros/cmssite.conf:
<Macro CMSSite $hostname>
<VirtualHost *:80>
Servername $hostname
DocumentRoot /var/www/$hostname
<Directory />
AllowOverride none
Order allow,deny
Deny from all
</Directory>
<Directory /var/www/$hostname>
Options FollowSymLinks
AllowOverride All
LimitRequestBody 40960000
php_flag engine on
php_value log_errors 1
php_flag magic_quotes_gpc off
php_value memory_limit 128M
php_value post_max_size 30M
php_value upload_max_filesize 30M
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
</Macro>
Con esto, podemos reescribir cada uno de los ficheros que utilizan la configuración común para que sólo tengan la siguiente llamada a la macro:
Include /etc/apache2/sites-available/macros/cmssite.conf
Use CMSSite www.sitio1.com
La primera línea incluye el fichero con la macro, para que esté disponible. La segunda línea ejecuta la macro pasando como parámentro www.sitio1.com.
De esta manera, ya tenemos la configuración parametrizada. El problema es que solo podemos incliur la macro una sola vez, así que para evitar errores de definiciones duplicadas de macros, podemos llevarnos la inclusión de la macro a un "falso site" que se carga antes de cualquier otro, de esta manera la macro estará disponible para cualquier otro site que se ejecute posteriormete. Para hacer esto tenemos que meter la definición de la macro en el fichero /etc/apache2/sites-available/00_load_macros:
Include /etc/apache2/sites-available/macros/cmssite.conf
y activar dicho site. Como la apache lee los ficheros de configuración en /etc/apache2/sites-available por orden alfabético, se incluirá primero el fichero con la definición de la macro (por eso le ponemos el nombre 00_loquesea) y posteriormente el resto que tengamos activos.
Si hacemos un cambio en el código de la macro, para que se haga efectivo debemos recargar la configuración del apache de la forma habitual con /etc/init.d/apache2 reload
Espero que os sea útil. Hasta la próxima entrada.
Mario J. Barchéin
No hay comentarios:
Publicar un comentario