Apache como proxy inverso

Apache es un servidor web que se puede utilizar como proxy inverso. En este artículo se explica cómo configurar Apache para que actúe como proxy inverso.

Configuración

Lo primero que haremos será aplicar el escenario donde encontraremos:

  • Un escenario vagrant con dos máquinas virtuales:

    • Una máquina proxy conectada al exterior y a una red interna.
    • Una máquina servidorweb conectada a la red interna.
  • Una receta ansible para configurar las dos máquinas virtuales del escenario anterior.

Lo siguiente será instalar apache en la máquina proxy y configurarla para acceder a las páginas web de la máquina servidorweb. La primera URL es www.app1.org y la segunda es www.app2.org.

Activaremos el módulo proxy y proxy_http de apache:

a2enmod proxy
a2enmod proxy_http

Y reiniciaremos el servidor web:

systemctl restart apache2

Ahora crearemos un archivo de configuración para cada una de las aplicaciones que queremos que se sirvan a través de apache. En este caso, crearemos dos archivos de configuración: app1.conf y app2.conf. Estos archivos de configuración se guardarán en la ruta /etc/apache2/sites-available.

El contenido de app1.conf será el siguiente:

<VirtualHost *:80>
        ServerName www.app1.org
        ProxyPass               /       "http://interno.example1.org"
        ProxyPassReverse        /       "http://interno.example1.org"
</VirtualHost>

Y el contenido de app2.conf será el siguiente:

<VirtualHost *:80>
        ServerName www.app2.org
        ProxyPass               /       "http://interno.example2.org"
        ProxyPassReverse        /       "http://interno.example2.org"
</VirtualHost>

Ahora activaremos los archivos de configuración de las aplicaciones:

a2ensite app1.conf
a2ensite app2.conf

Y reiniciaremos el servidor web:

systemctl restart apache2

Ahora configuraremos el archivo /etc/hosts de la máquina host para que resuelva los nombres de las aplicaciones a las direcciones IP de las máquinas servidorweb. El contenido del archivo /etc/hosts será el siguiente:

192.168.121.63 www.app1.org www.app2.org

Ahora configuraremos el archivo /etc/hosts de las máquinas servidorweb para que resuelva los nombres de las aplicaciones a las direcciones IP de la máquina proxy. El contenido del archivo /etc/hosts será el siguiente:

10.0.0.6 interno.example1.org interno.example2.org

Ahora, desde la máquina host, accederemos a las aplicaciones a través de la máquina proxy. Para ello, abriremos un navegador web y accederemos a las siguientes URLs:

Creamos un virtualhost para las dos aplicaciones

En vez de crear un virtualhost para cada aplicación, podemos crear un virtualhost para las dos aplicaciones. El contenido del archivo servidor.conf será el siguiente:

<VirtualHost *:80>
    ServerName www.servidor.org
    <Location "/app1">
        ProxyPass           "http://interno.example1.org"
        ProxyPassReverse    "http://interno.example1.org"
    </Location>
    <Location "/app2">
        ProxyPass           "http://interno.example2.org"
        ProxyPassReverse    "http://interno.example2.org"
    </Location>
</VirtualHost>

Ahora activaremos el archivo de configuración de la aplicación:

a2ensite servidor.conf

Y reiniciaremos el servidor web:

systemctl restart apache2

Cambiaremos el contenido del archivo /etc/hosts de la máquina host para que resuelva el nombre de la aplicación a la dirección IP de la máquina proxy. El contenido del archivo /etc/hosts será el siguiente:

192.168.121.63 www.app1.org www.app2.org www.servidor.org

Ahora, desde la máquina host, accederemos a las aplicaciones a través de la máquina proxy. Para ello, abriremos un navegador web y accederemos a las siguientes URLs:

Modificaciones

En el primer escenario, hemos configurado http://www.app1.org/directorio para que se sirva a través de la máquina proxy. Ahora vamos a modificarlo quitando la directiva ProxyPassReverse. El contenido del archivo app1.conf será el siguiente:

<VirtualHost *:80>
        ServerName www.app1.org
        ProxyPass               /       "http://interno.example1.org"
</VirtualHost>

Si realizamos una petición HEAD con curl, veremos que cambia Location de la respuesta:

Si ponemos de nuevo la directiva ProxyPassReverse, y queremos comprobar que redirección se realiza, podemos comprobarlo en la cabecera de Location de la respuesta:

Como podemos ver en las siguientes imágenes, también sucede con el virtualhost servidor.conf.

(Antes de quitar ProxyPassReverse)

(Después de quitar ProxyPassReverse)