O Apache pode funcionar como proxy reverso, encaminhando as requisições dos clientes para servidores de backend e devolvendo suas respostas, por meio do módulo mod_proxy e de seus submódulos relacionados.
Um proxy reverso atua como intermediário para as requisições dos clientes, direcionando-as a um ou mais servidores de backend internos. Ele apresenta uma interface unificada para a internet enquanto oculta a arquitetura interna da rede. Entre os benefícios estão segurança reforçada, balanceamento de carga, terminação SSL/TLS, cache e gerenciamento simplificado do backend.
Habilitando o mod_proxy
Para configurar o Apache como proxy reverso, o módulo principal mod_proxy e submódulos específicos precisam estar habilitados. Esses módulos fornecem suporte a diferentes protocolos e recursos.
Módulos essenciais:
mod_proxy: o módulo de proxy principal.mod_proxy_http: para fazer proxy de tráfego HTTP e HTTPS.mod_proxy_balancer: necessário para balanceamento de carga entre vários servidores de backend.mod_proxy_wstunnel: para proxy de WebSocket.mod_ssl: caso o Apache vá tratar a terminação SSL/TLS das conexões dos clientes.
Habilite os módulos com o comando a2enmod em sistemas baseados em Debian/Ubuntu, ou descomentando as diretivas LoadModule no httpd.conf em sistemas baseados em CentOS/RHEL:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod proxy_wstunnel
sudo a2enmod ssl
sudo systemctl restart apache2
Configuração básica de proxy reverso HTTP
As diretivas fundamentais de um proxy reverso são ProxyPass e ProxyPassReverse. A configuração normalmente fica dentro de um bloco <VirtualHost> ou diretamente no httpd.conf.
<VirtualHost *:80>
ServerName yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
# Encaminha todas as requisições de /app para um servidor de backend
ProxyPass /app http://backend-app-server:8080/app
ProxyPassReverse /app http://backend-app-server:8080/app
# Encaminha todas as requisições do caminho raiz / para outro backend
ProxyPass / http://backend-web-server:8000/
ProxyPassReverse / http://backend-web-server:8000/
# Para terminação SSL/TLS no Apache, encaminhando HTTP para o backend
# RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
Diretivas principais
ProxyRequests Off: isso é crítico. Desativa a capacidade de proxy direto (forward proxy) do Apache, impedindo que ele atue como proxy aberto, o que representa um risco de segurança significativo. Em um proxy reverso, essa diretiva deve estar sempre definida comoOff.ProxyPreserveHost On: essa diretiva garante que o cabeçalhoHostoriginal da requisição do cliente seja repassado ao servidor de backend. Se estiverOff, o cabeçalhoHostserá definido com o hostname e a porta do servidor de backend.ProxyPass [path] [url]: mapeia um caminho de URL local (path) para uma URL de backend (url). O Apache intercepta as requisições que correspondem apathe as encaminha paraurl.- Exemplo:
ProxyPass /app http://backend-app-server:8080/appsignifica que uma requisição parahttp://yourdomain.com/app/page.htmlé encaminhada parahttp://backend-app-server:8080/app/page.html.
- Exemplo:
ProxyPassReverse [path] [url]: reescreve os cabeçalhosLocation,Content-LocationeURInas respostas HTTP vindas do servidor de backend. Isso garante que redirecionamentos ou links gerados pelo backend apontem de volta para a URL pública do proxy, evitando que os clientes sejam expostos a URLs internas.<Proxy *>: define o controle de acesso ao próprio proxy.Require all grantedpermite que todos os clientes usem o proxy. Para maior segurança, é possível liberar apenas endereços IP ou redes específicas.
Recursos avançados do mod_proxy
Balanceamento de carga
O mod_proxy_balancer permite distribuir as requisições recebidas entre vários servidores de backend, aumentando a disponibilidade e a escalabilidade.
<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
# Opcional: ProxySet para configurações específicas do balanceador
ProxySet lbmethod=byrequests stickysession=JSESSIONID nofailover=Off
# Para afinidade de sessão, o backend precisa definir um cookie como JSESSIONID
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
<Location "/balancer-manager">
SetHandler balancer-manager
Require ip 192.168.1.0/24 # Restringe o acesso à rede interna
</Location>
</VirtualHost>
