12 de octubre de 2010

Apache: Migración transparente de un sitio web

Hay situaciones en las que nos vemos forzados a migrar un sitio web de un servidor a otro por diversos motivos, como podría ser la alta carga del sitio web. Como suele suceder en esos casos, no basta con colocar un mensaje de "Nos encontramos en Mantenimiento" y solo procedemos a mover el contenido del sitio web de un servidor a otro.

Luego de efectuar dicha labor es necesario actualizar la entrada o entradas DNS que guardan la relación IP del sitio web - Dominio.

Si nuestro sitio web cuenta con visitantes de diversas partes del planeta, el proceso de replicación del registro DNS en todos los servidores alrededor del mundo puede tomar varios días. Ello significa que mientras dura el proceso de replicación, los visitantes que intenten visitar nuestra página web pueden ser dirigidos (en el mejor caso) al nuevo servidor en el que se halla el sitio web o (en el peor caso) serán dirigidos al antiguo servidor.

En sitios de alto tráfico o que proporcionan un servicio, mantener el mensaje de "Sitio en mantenimiento" por varios días no es viable y optar por redirigir todos los visitantes que vayan al antiguo servidor haciendo uso de la dirección IP del nuevo servidor puede provocar más de una sospecha (y más de un susto) en los visitantes; es extraño visitar un sitio web accediendo a una url: http://sitio-web.com y al momento de ser redireccionado al nuevo servidor ver en la barra de direcciones una dirección IP.

A continuación, a manera de sugerencia, se presentará una alternativa para poder llevar a cabo las migraciones de sitios web de forma transparente para el usuario.



Trabajaremos con dos servidores:
  • Servidor Origen: Servidor que actualmente contiene el sitio web que deseamos migrar. Este servidor tiene IP 1.2.3.4
  • Servidor Destino: Servidor al cual deseamos migrar los contenidos del sitio web. Este servidor cuenta con IP 5.6.7.8

El dominio de nuestro sitio web ficticio será: http://sitio-web.com

Nota: Los IPs mencionados sirven únicamente como referencia para este ejemplo.

Procedimiento:
  1. Crear el virtual host en el Servidor Destino
  2. Copiar la base de datos y los archivos (código de la aplicación web, archivos de los usuarios) desde el Servidor Origen al Servidor Destino
  3. Probar la configuración del servidor Destino (para poder verificar que la configuración del virtual host es la correcta, es probable requieran modificar el archivo hosts de una PC.
  4. Configurar el mod_proxy en el servidor de origen

    <VirtualHost *:80>
        UseCanonicalName Off
        ServerName sitio-web.com
        ProxyRequests Off
        <Proxy *>
            Order allow,deny
            Allow from all
        </Proxy>
        ProxyVia On
        ProxyPreserveHost On
        ProxyPass / http://5.6.7.8/
        ProxyPassReverse / http://5.6.7.8/
        ProxyPassReverse / http://sitio-web.com
        # Agregar una linea ProxyPassReverse por cada ServerAlias registrado
    </VirtualHost>

    Reiniciar el Apache:

    service httpd reload


  5. Probar la configuración del Servidor Destino (Deshacer los cambios en el archivo hosts luego de culminada esta prueba)
  6. Actualizar el registro DNS
  7. Configurar una página de espera en el Servidor Origen (se sugiere que cada vez que esta página sea cargada, un mensaje de advertencia sea remitido por correo).
  8. Esperar ...
  9. Luego de corroborar que ya no existieran peticiones al Servidor Origen por el sitio que acabamos de migrar, procedemos a desactivar el mod_proxy
  10. Efectuar un backup de los datos (base de datos, archivos, logs, configuraciones) del sitio web que aun existen en el Servidor Origen antes de proceder a eliminarlos de dicho servidor.
  11. Documentar la experiencia y celebrar

Nota: La configuración del mod_proxy mostrada en el ejemplo únicamente redirige el tráfico con destino al sitio web sitio-web.com y puerto 80.

2 comentarios:

  1. Y dónde se encuentra el archivo de configuración?
    Es en /etc/apache2/mods-available/proxy.conf?
    Lo hago y no me funciona. Alguna idea?

    ResponderEliminar
  2. En el caso de Ubuntu o Debian, se requiere habilitar previamente el módulo proxy a través del comando a2enmod.

    ResponderEliminar