Apache demás de utilizarse como servidor Web estático o dinámico dispone de otras características desarrolladas en él (cómo la mayoría de servidores HTTP), en este caso explicamos que es y cómo realizar proxy inverso, también llamado servidor de paso. Esta opción que permite recuperar recursos del mismo servidor o de otro de forma trasparente para el cliente web, promoviendo otro contenido estático y/o dinámico.
¿Cómo funciona el proxy inverso?
En este escenario el propio servicio no genera contenido ni aloja datos, en su lugar el contenido se obtiene de los servidores Backend, que normalmente tienen conexión directa con redes internas. Cuando el servicio web recibe una petición de un cliente, se hace una petición a uno de estos servidores Backend gestionándola y generando el contenido. Entonces envía el contenido al servidor proxy (Apache en este caso) y este envía la respuesta al cliente.
Hay múltiples razones para la implementación de esta función, entre ellas, seguridad, alta disponibilidad, balanceo de carga y centralización de autorización. Normalmente en estas implementaciones que la arquitectura y el diseño de la infraestructura de los servidores Backend suelen estar aislados/protegidos del exterior (DMZ); la única conexión debería ser con el servidor proxy (qué recibe y proporciona la respuesta al cliente).
¿Qué protocolos admite Apache Proxy?
Apache admite los protocolos más populares, así como varios algoritmos de equilibrio de carga diferentes (los módulos de terceros pueden agregar soporte para protocolos adicionales) y se debe cargar el conjunto de módulos para proporcionar las funciones necesarias. Estos módulos se pueden incluir estáticamente en el momento de la compilación o dinámicamente a través de su directiva.
El conjunto debe incluir:
- mod_proxy, que proporciona capacidades básicas de proxy
- mod_proxy_balancer, o más módulos balanceadores si se requiere balanceo de carga.
- Uno o más módulos de protocolos para proxy admitidos:
- AJP13 (Apache JServe protocolo versión 1.3): mod_proxy_ajp
- CONNECT (para SSL): mod_proxy_connect
- FastCGI: mod_proxy_fcgi
- FTP: mod_proxy_ftp
- HTTP/0.9, HTTP/1.0, and HTTP/1.1: mod_proxy_http
- HTTP/2.0: mod_proxy_http2
- SCGI: mod_proxy_scgi
- UWSGI: mod_proxy_uwsgi
- WS and WSS (Web-sockets): mod_proxy_wstunnel
Realización de proxy mediante Apache
Si no tienes instalado Apache deberás instalar el paquete:
Debian/Ubuntu:
# apt install apache2
RHEL/CentOS:
# yum install apache2
Luego la activación de los módulos requeridos, para este ejemplo son proxy, proxy_http, proxy_balancer, ssl, headers y el método bybusyness para balancear:
# a2enmod proxy proxy_http proxy_balancer headers ssl proxy_ajp lbmethod_bybusyness
Pero podrías activar únicamente los que requieras. Utilizar el correspondiente te aportará un mejor rendimiento al realizar proxy con sus opciones avanzadas. Puedes revisar las variables de entorno en enlace de cada uno de ellos en su pagina oficial (enlaces vinculados).
Para desactivar un módulo, por ejemplo proxy_ajp es el siguiente comando:
# a2dismod proxy_ajp
Una vez realizada la activación de los módulos es necesario realizar un reinicio del servicio Apache:
# systemctl restart apache2
Luego edita en la configuración del sitio:
# vi /etc/apache2/sites-available/000-default.conf
Para un proxy simple, este sería un ejemplo de configuración de virtualhost para el puerto HTTP. También puedes establecer los timeout para la conexión y/o añadir las cabeceras al proxy (reinicia posteriormente el servicio):
<VirtualHost *:80>
ServerName dominio.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ProxyPreserveHost On
ProxyAddHeaders On
ProxyPass / http://127.0.0.1:8080/ connectiontimeout=5 timeout=30
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
Se ha utilizado realizando proxy al mismo servidor, pero podría ser otro servidor con un certificado configurado y también utilizar un certificado en el servidor proxy cómo en el siguiente ejemplo que hemos utilizado Certbot para el certificado (reinicia posteriormente el servicio):
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName dominioproxy.com
SSLCertificateFile /etc/letsencrypt/live/domainproxy.com-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domainproxy.com-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ProxyPreserveHost On
SSLProxyEngine On
ProxyPass / https://serverbackend.com
ProxyPassReverse / https://serverbackend.com
</VirtualHost>
</IfModule>
Para este ejemplo, también será necesario para una conexión HTTPS con del servidor backend deberá tener el certificado válido. En caso negativo, deberás añadir desactivar las comprobaciones:
SSLProxyVerify None
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
SSLProxyCheckPeerExpire Off
Balanceo de carga con Apache
También hay un modulo proxy ofrece la posibilidad de balancear la carga (proxy_balancer), lo hemos activado previamente en el artículo.
Un ejemplo de configuración es la siguiente con enrutamiento de cookies (reinicia posteriormente el servicio):
<IfModule mod_ssl.c>
<VirtualHost *:443>
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
ServerName dominioproxy.com
SSLCertificateFile /etc/letsencrypt/live/domainproxy.com-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domainproxy.com-0001/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Proxy "balancer://micluster">
BalancerMember "http://10.20.10.5:80"
BalancerMember "http://10.20.10.6:80"
ProxySet lbmethod=bybusyness
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass "/" "balancer://micluster"
ProxyPassReverse "/" "balancer://micluster"
</VirtualHost>
</IfModule>
Cómo se puede observar hemos usado el método bybusyness. Realiza un seguimiento de cuántas solicitudes tiene actualmente asignado cada trabajador y una nueva solicitud se asigna automáticamente al miembro del clúster con el menor número de solicitudes activas. Pero hay los siguientes métodos:
Será necesario activarlos previamente para su uso.
Esperamos que este tutorial te haya sido de ayuda, si tienes consultas sobre esta u otra cuestión relacionada con tus servidores en Clouding, no dudes en contactar a soporte@clouding.io ¡Estamos para ayudarte!