apache

En este tutorial veremos como configurar un Reverse Proxy con el módulo mod_proxy de Apache. También usando certificados SSL(certificado de seguridad).

Vamos a aprender a utilizar el módulo proxy de Apache.

Para aquellos que desarrollan aplicaciones o sistemas web, en algún momento han tenido que hacer un bypass dns. Cuando son diferentes tecnologías posiblemente la implementación la hagas a través de subdominios apuntando a un servidor local desde internet.

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.

Actualizar conexión con Facebook 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 debemos reiniciar el servicio:

sudo service apache2 restart

Configuración del vhost

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

<VirtualHost *:80>
  ServerAdmin webmaster@jaimefranko.com
  ServerName jaimefranko.com
  ServerAlias www.jaimefranko
  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.jaimefranko.com/app nos presente dicha aplicación.

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.

<VirtualHost *:80>
  ServerAdmin webmaster@jaimefranko.com
  ServerName jaimefranko.com
  ServerAlias www.jaimefranko.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 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.

Tomemos el siguiente vhosts como ejemplo con SSL

<IfModule mod_ssl.c>
  <VirtualHost _default_:443>
    ServerAdmin webmaster@jaimefranko.com
    ServerName jaimefranko.com
    ServerAlias www.jaimefranko.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.