Apache como proxy inverso
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)