Apache puede funcionar como un proxy inverso, reenviando las solicitudes del cliente a los servidores backend y devolviendo sus respuestas, utilizando el módulo mod_proxy y sus submódulos relacionados.
Un proxy inverso actúa como intermediario para las solicitudes del cliente, dirigiéndolas a uno o más servidores backend internos. Presenta una interfaz unificada a internet mientras oculta la arquitectura de red interna. Los beneficios incluyen seguridad mejorada, equilibrio de carga, terminación SSL/TLS, almacenamiento en caché y gestión simplificada del backend.
Habilitación de mod_proxy
Para configurar Apache como un proxy inverso, el módulo principal mod_proxy y submódulos específicos deben estar habilitados. Estos módulos proporcionan diferentes soportes de protocolo y características.
Módulos esenciales:
mod_proxy: El módulo proxy principal.mod_proxy_http: Para proxy de tráfico HTTP y HTTPS.mod_proxy_balancer: Requerido para el equilibrio de carga entre múltiples servidores backend.mod_proxy_wstunnel: Para proxy de WebSocket.mod_ssl: Si Apache manejará la terminación SSL/TLS para las conexiones del cliente.
Habilite los módulos usando el comando a2enmod en sistemas basados en Debian/Ubuntu, o descomentando las directivas LoadModule en httpd.conf en sistemas basados en CentOS/RHEL:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod proxy_wstunnel
sudo a2enmod ssl
sudo systemctl restart apache2
Configuración Básica de Proxy Inverso HTTP
Las directivas fundamentales para un proxy inverso son ProxyPass y ProxyPassReverse. La configuración se suele colocar dentro de un bloque <VirtualHost> o directamente en httpd.conf.
<VirtualHost *:80>
ServerName yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
# Proxy all requests for /app to a backend server
ProxyPass /app http://backend-app-server:8080/app
ProxyPassReverse /app http://backend-app-server:8080/app
# Proxy all requests for the root path / to another backend
ProxyPass / http://backend-web-server:8000/
ProxyPassReverse / http://backend-web-server:8000/
# For SSL/TLS termination at Apache, and forwarding HTTP to backend
# RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
Directivas Clave
ProxyRequests Off: Esto es crítico. Deshabilita las capacidades de proxy de reenvío de Apache, evitando que actúe como un proxy abierto, lo cual es un riesgo de seguridad significativo. Para un proxy inverso, esta directiva siempre debe establecerse enOff.ProxyPreserveHost On: Esta directiva asegura que el encabezadoHostoriginal de la solicitud del cliente se pase al servidor backend. Si está enOff, el encabezadoHostse establecerá con el nombre de host y el puerto del servidor backend.ProxyPass [path] [url]: Mapea una ruta URL local (path) a una URL de backend (url). Apache intercepta las solicitudes que coinciden conpathy las reenvía aurl.- Ejemplo:
ProxyPass /app http://backend-app-server:8080/appsignifica que una solicitud ahttp://yourdomain.com/app/page.htmlse reenvía ahttp://backend-app-server:8080/app/page.html.
- Ejemplo:
ProxyPassReverse [path] [url]: Reescribe los encabezadosLocation,Content-LocationyURIen las respuestas HTTP del servidor backend. Esto asegura que las redirecciones o enlaces generados por el backend apunten de nuevo a la URL del proxy de cara al público, evitando que los clientes queden expuestos a URLs internas.<Proxy *>: Define el control de acceso para el propio proxy.Require all grantedpermite que todos los clientes usen el proxy. Para una seguridad más estricta, se pueden permitir direcciones IP o redes específicas.
Características Avanzadas de mod_proxy
Equilibrio de Carga
mod_proxy_balancer permite distribuir las solicitudes entrantes entre múltiples servidores backend, mejorando la disponibilidad y la escalabilidad.
<VirtualHost *:80>
ServerName app.yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy balancer://mycluster>
BalancerMember http://backend1.internal:8080 route=1 loadfactor=10
BalancerMember http://backend2.internal:8080 route=2 loadfactor=10
# Optional: ProxySet for specific balancer settings
ProxySet lbmethod=byrequests stickysession=JSESSIONID nofailover=Off
# For session stickiness, the backend must set a cookie like JSESSIONID
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
<Location "/balancer-manager">
SetHandler balancer-manager
Require ip 192.168.1.0/24 # Restrict access to internal network
</Location>
</VirtualHost>
Atributos de BalancerMember
| Atributo | Descripción |