Cómo configurar un proxy inverso con Apache

Muy a menudo se desea configurar un servidor Apache como front-end para ocultar los servidores que contienen realmente las aplicaciones web. De este modo, sólo el Apache está en la DMZ, mientras que el servidor de back-end queda dentro de la red interna:

esquema_dmz

Este esquema se puede utilizar sin importar el protocolo o puerto que utilice el servidor de back-end. Para poder implementar el proxy es necesario que el servidor apache tenga habilitados una serie de módulos, que dependen del protocolo a través del cual se desea atacar el servidor de back-end. En este ejemplo voy a suponer que el servidor de back-end está escuchando por el puerto 80.

Los pasos a seguir son:

  • Habilitar los módulos necesarios.
  • Crear un nuevo vhost para albergar el frontal
  • Configurar un alias DNS frontend.organizacion.com que apunte al servidor donde está Apache
  • Habilitar el vhost y reiniciar el servicio

Habilitar los módulos necesarios

En el front-end, se habilitan los módulos "proxy" y "proxy_http":

sudo a2enmod proxy proxy_http 

Crear un nuevo host virtual para albergar el frontal

Se crea un nuevo vhost en /etc/apache2/sites-avalaible/frontend.conf:
<VirtualHost *:80>
	ErrorLog "/var/log/apache2/frontend-error.log"
	CustomLog "/var/log/apache2/frontend-access.log" common
	ServerName frontend.organizacion.com
	ProxyRequests Off
	ProxyPreserveHost On
	ProxyPass / http://backend.organizacion.com/
	ProxyPassReverse / http://backend.organizacion.com/
</VirtualHost>

La directiva "ServerName" hace referencia a la URL a la que se dirige la petición. Deberá configurarse una entrada en el DNS que apunte al servidor.

La directiva ProxyRequests Off evita que el front-end sea utilizado como proxy, es decir, que usuarios puedan saltar al front-end y de ahí a cualquier otra dirección. Es muy importante dejarlo deshabilitado para evitar problemas de seguridad o incluso legales.

La directiva ProxyPreserveHost On permite que el salto del servidor de front-end al de back-end sea transparente para el usuario. Si no estuviera habilitada, el usuario se dirigiría a http://frontend.organización.com pero inmediatamente vería como la dirección cambia a http://backend.organizacion.com. Además, como en este supuesto el servidor de back-end no es visible desde Internet el usuario vería un error.

Por último, las directivas ProxyPass y ProxyPassReverse gestionan el salto y la vuelta del servidor de front-end al de back-end.

Habilitar el vhost y reiniciar el servicio

Sólo queda habilitar el vhost que se acaba de crear y recargar el servicio:

sudo a2ensite frontend.conf
sudo service apache2 reload

Tras estos pasos, si se accede a http://frontend.organizacion.com apache redireccionará de forma transparente a http://backend.organizacion.com

Referencias

Explicación de la directiva ProxyRequests
Publicado en tutoriales Etiquetado con: , , ,
6 Comentarios en “Cómo configurar un proxy inverso con Apache
  1. Javier dice:

    Hola buenas, con esta configuración es normal que no se visualice las imágenes y los links correctamente?

    He seguido la guía y funcionaba bien excepto lo mencionado,

    ErrorLog “/var/log/apache2/frontend-error.log”
    CustomLog “/var/log/apache2/frontend-access.log” common
    ServerName http://sefirosweb.servegame.com
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass /dow http://127.0.0.1/subweb/
    ProxyPassReverse /dow http://127.0.0.1/subweb/

  2. Hola Javier,

    Si las peticiones van de raíz a raíz ese problema no pasa, pero si juegas con subcarpetas puede pasarte que los CSS y los enlaces fallen. Nunca me he pegado con ello, pero en su día investigué y creo que la solución pasa por el módulo “mod-proxy-html”:

    http://apache.webthing.com/mod_proxy_html/

    Si lo consigues avísame y lo incorporo al post.

    Suerte!

  3. Pinchos dice:

    Hola, estoy igual que el compañero, no me carga ninguna imagen, y si tengo el proxy_html descomentado, tengo xampp instalado y en xammp trabajo con vhost es decir subcarpetas, por favor espero que puedas ayudarme puesto que esto me trae de cabeza, mil gracias de antemano, un saludo!

  4. Pinchos dice:

    Hola, esto lo vengo haciendo por lo siguiente, tengo dos servidores, Servidor 1 y Servidor 2, en el servidor 1 que es al que llegan las peticiones tengo un webpanel para mis usuarios de hosting, y el servidor 2 para que no se mezcle nada, lo uso para mi, para mis dominios, mis webs mis cosas, entonces pretendo que cuando se haga una peticion a una web mia, pase por el primer servidor y la envie al segundo, todo va bien, solo que no carga las imagenes T.T

  5. roncki dice:

    Fijarse que en el primer elemento del proxy acaba en “/dow” mientras que el destino acaba en “/”.
    En principio deberian acabar a ambos lados en “/”.

    Tampoco veo que se haya implementado un DocumentRoot en un directorio para servir estaticos y evitar flujo innecesario de datos, hay que intentar pensar que el frontend tratara la presentación y el backend la lógica ya que esta es la solucion que mas velocidad te dara.
    Para esto seria necesario subir los estáticos al frontend.
    Una vez subidos muchas veces es necesaria la implementacion de politicas para evitar que esas peticiones se redirijan al backend.

    Para detectar los problemas con los estáticos, lo mas recomendable es observar las peticiones mediante la consola de depuracion de tu navegador web. Así puedes ver si la peticion cumple el patron de redireccion definido en los proxypass.
    Puede ser comun implementar mas de un ProxyPass o uno unico desde raiz.

    Supongo que ya esta todo mas que solucionado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*