Cómo configurar un Reverse Proxy o Gateway en Apache 2016-06-30

Tutorial para configurar un Reverse Proxy con el módulo mod_proxy de Apache. También usando certificados SSL.

Cómo configurar un Reverse Proxy o Gateway en Apache

En este nanotutorial vamos a aprender a utilizar el módulo proxy de Apache.

Para aquellos que desarrollan aplicaciones o sitios web, en algún momento han tenido que integrar un nuevo desarrollo con alguno que ya existe. Cuando son diferentes tecnologías posiblemente la implementación la hagas a través de subdominios.

Con este tutorial podrás configurar rutas especificas dentro del mismo dominio que funcionen como puente hacia otras aplicaciones en el mismo servidor. También reutilizando un certificado SSL que exista en el sitio web principal, dando cobertura a las aplicaciones bajo esta configuración.

Apache posee por defecto un buen número de módulos que nos pueden ser útiles para diferentes funciones, hoy vamos a aprender el mod_proxy.

Habilitar mod_proxy en Apache

Para habilitar y deshabilitar módulos en Apache utilizamos los comandos a2enmod y a2dismod.

sudo a2enmod proxy_http

Y luego se debe reiniciar el servicio:

sudo service apache2 restart

Habilitar mod_proxy en Apache

Configuración del vhost

A continuación un ejemplo de vhost básico.

<VirtualHost *:80>
  ServerAdmin [email protected]
  ServerName nanotutoriales.com
  ServerAlias www.nanotutoriales.com
  DocumentRoot /var/www
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory /var/www/>
    Options FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>
  ErrorLog ${APACHE_LOG_DIR}/error.log
  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Basándonos en este ejemplo, digamos tenemos una aplicación corriendo en el mismo servidor bajo el puerto 8080, queremos que al acceder a la ruta http://www.nanotutoriales.com/app nos presente dicha aplicación.

Configuración del vhost

Lo que debemos hacer es utilizar la directiva ProxyPass y ProxyPassReverse para presentar correctamente la aplicación bajo la ruta que vamos a especificar. Para eso modificamos el archivo vhost.

Ahora vamos a editar el archivo vhost con el editor de texto nano. Si aún no conoces como trabajar con este editor, te invito a que visites este nanotutorial: Tutorial del Editor de Texto Nano.

<VirtualHost *:80>
  ServerAdmin [email protected]
  ServerName nanotutoriales.com
  ServerAlias www.nanotutoriales.com
  DocumentRoot /var/www
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory /var/www/>
    Options FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>
  ErrorLog ${APACHE_LOG_DIR}/error.log
  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  CustomLog ${APACHE_LOG_DIR}/access.log combined
  
  <Location "/app/">
    ProxyPass "http://localhost:8080/"
    ProxyPassReverse "http://localhost:8080/"
  </Location>
</VirtualHost>

Una vez hecho el cambio, debemos reiniciar la configuración del vhosts, lo hacemos con el siguiente comando:

sudo service apache2 reload

Ahora cuando accedemos al dominio principal bajo la ruta /app/ se debe desplegar nuestra aplicación.

Configuración del vhost

Configuración del vhost con SSL

En el caso deseamos configurar un Reverse Proxy que utilice el SSL del dominio principal, aparte de la directiva ProxyPass y ProxyPassReverse, existen dos directivas más que debemos utilizar.

Si no sabes como configurar un SSL ó generar uno de firma propia, puedes aprender cómo hacerlo a través de este nanotutorial: Cómo crear un certificado SSL de firma propia con OpenSSL y Apache HTTP Server.

Tomemos el siguiente vhosts como ejemplo con SSL.

<IfModule mod_ssl.c>
  <VirtualHost _default_:443>
    ServerAdmin [email protected]
    ServerName nanotutoriales.com
    ServerAlias www.nanotutoriales.com
    DocumentRoot /var/www
    
    <Directory />
      Options FollowSymLinks
      AllowOverride None
    </Directory>
    
    <Directory /var/www/>
      Options -Indexes FollowSymLinks MultiViews
      AllowOverride None
      Order allow,deny
      allow from all
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    
    SSLEngine on
    SSLCertificateKeyFile /etc/ssl/certs/ssl.key
    SSLCertificateFile /etc/ssl/certs/ssl.crt
    SSLCACertificateFile /etc/ssl/certs/bundle.crt
    
    BrowserMatch "MSIE [2-6]" \
      nokeepalive ssl-unclean-shutdown \
      downgrade-1.0 force-response-1.0
    # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    SSLProxyEngine On
    ProxyPreserveHost On
    <Location "/app/">
      ProxyPass "http://localhost:8080/"
      ProxyPassReverse "http://localhost:8080/"
    </Location>
  </VirtualHost>
</IfModule>

SSLProxyEngine hace el trabajo de que el puente vaya cifrado con el certificado que hemos configurado en el dominio principal. ProxyPreserveHost hace que el dominio principal persista en todas las rutas y cabeceras HTTP. Esto para evitar algún error de seguridad con respecto al dominio del certificado.

Esto funciona aún con aplicaciones locales que no tengan HTTPS como en el ejemplo.


Acerca del autor

Hugo Gilmar Erazo Full Stack Web Developer

Soy un desarrollador web con más de 10 años de experiencia. Me considero fanático de GNU/Linux, lo cual me ha permitido complementar mis conocimientos en el desarrollo web con la administración de servidores.

Aunque manejo todo lo relacionado al Front-End, me inclino más por el desarrollo Back-End. También desarrollo aplicaciones móviles híbridas. Me gusta lo que hago.

Compartir este artículo