Redirigir peticiones http de una maquina a otra sin perder hostname con mod_proxy

Hace unos dias me encontré con el siguiente problema, tengo que migrar el site foo.com del servidor A al servidor B, no podemos tener el site caido mucho tiempo mas allá de unos pocos minutos (lo que tardamos en hacer un dump de los datos y una copia de ficheros), tampoco queremos cambiar el dominio del site  (por ejemplo usando una redirección del estilo.foo.com a new.foo.com).

Resumiendo: queremos que todas las peticiones que entren al servidor A para el virtual host foo.com le lleguen al servidor B que tiene tambien configurado ese mismo dominio en sus virtual hosts.

Afortunadamente Apache 2 es el servidor web del dominio foo.com.

¿Como lo hacemos?

Voy a proponer una solución al problema utilizando mod_proxy:

Añadimos estas 3 lineas a la configuración del servidor A.

ProxyPass / http://192.240.2.93/

ProxyPassReverse / http://192.240.2.93/

ProxyPreserveHost On

Explicamos para que sirven los parametros:

  • ProxyPass redirige la petición del servidor A a la ip del servidor B.
  • ProxyPassReverse cambia la URL en las cabeceras Location, Content-Location y URI de las respuestas HTTP redirect. Se utiliza para que la respuesta de la petición vaya al cliente a traves del host A, lo cual es muy util cuando redirigimos peticiones a hosts en una red privada que no tienen acceso a internet. En nuestro caso esta directiva es opcional y podemos decidir que sea el host B el que responda al cliente directamente.
  • ProxyPreserveHost mantiene la cabecera Host de la petición en la redirección al servidor B, esta pensado especificamente para poder hacer redirecciones a servidores que utilicen virtual hosts basados en nombres de dominio.

En el host B tenemos que tener una configuración similar a esta para que acepte las peticiones que le entran desde el servidor A:

<virtualhost *:80>
ServerName foo.com
DocumentRoot /var/www/foo

<directory «/var/www/foo»>
Order allow,deny
Allow from all
</directory>

ErrorLog /var/log/apache2/foo.err
CustomLog /var/log/apache2/foo.log combined
</virtualhost>

Cambiar nombre del Host sin reiniciar en CentOS/RedHat – Linux

Este procedimiento deberia funcionar en las distribuciones RedHat Linux 7.x/9, RHEL, Fedora y CentOS sin problemas porque todas tienen similar configuración. El objetivo es nunca reiniciar sin necesidad y mantener el tiempo de uptime del servidor intacto y por supuesto no interrumpir los otros servicios.

  1. Abrimos una consola como usuario root.
  2. Editar el archivo network y cambiar el nombre del host en la variable HOSTNAME.
    nano /etc/sysconfig/network
    HOSTNAME=central
  3. Adicionar  el número ip del nuevo host.
    nano /etc/hosts
    192.168.0.1 central

    Las modificaciones realizadas en /etc/hosts y /etc/sysconfig/network son necesarias para que los cambios sean permanentes.
  4. Cambiar el nombre del host usando el comando hostname.
    hostname redhat9
  5. y ejecutar nuevamente el comando hostname sin incluir el host para ver el cambio.
    hostname
  6. Finalmente reiniciar el servicio de red para aplicar los cambios realizados.
    service network restart
  7. Para verificar que el nombre del host fue realmente cambiado debemos salir e ingresar nuevamente a la sesión. Con cerrar la terminal y abrir otra terminal veremos que el nombre ha cambiado.

Rápido, sin problemas y no interrumpimos los servicios del servidor ni tampoco perdemos el uptime de nuestro servidor.