Esta é uma pergunta canônica sobre proxies reversos, como eles funcionam e como são configurados.
Como posso atender solicitações de um serviço em uma porta diferente ou de um servidor diferente com o mesmo servidor da Web e distingui-lo por meio da URL?
Se você deseja veicular conteúdo de vários serviços ou vários servidores do mesmo domÃnio, você pode configurar seu servidor da Web para atuar como um proxy reverso. Os serviços (muitas vezes chamados de servidor backend ou servidor de aplicação ) não precisam necessariamente ser acessados ​​diretamente do cliente, é comum que apenas o servidor web que realmente atende o cliente seja alcançável diretamente. Também é possÃvel ter esquemas ou protocolos diferentes (http, https, ajp, ...) entre cliente e servidor e entre servidor e backend.
Exemplos
O proxy reverso pode ser configurado como diretórios virtuais ou como subdomÃnios.
Configuração de exemplo para Apache
Você precisa carregar os módulos apache necessários para poder usá-lo como proxy reverso. Estes são pelo menos:
Para mais protocolos, você precisará habilitar mais módulos.
Você pode habilitar os módulos com distribuições baseadas em Debian/Ubuntu como esta:
Com distribuições baseadas em RedHat/CentOS, você precisará encontrar os arquivos de configuração adequados
/etc/httpd/
e habilitar os módulos manualmente.Uma configuração para os exemplos acima pode ser assim:
Configuração de exemplo para nginx
Configuração de back-end
Uma coisa a ter em mente é que o servidor de back-end deve ser configurado de acordo. Se, por exemplo, o Jenkins estiver configurado para atender a solicitações com a URL
http://192.168.42.18:8080/
, ele usará essa URL base para caminhos para arquivos CSS, JS e de imagem, resultando em muitos erros 404 ou tempos limite e um servidor inoperante. Ele deve ser configurado com a URL do proxyhttps://example.com/jenkins/
como URL base para que funcione.Outros back-ends exigem uma configuração semelhante. Este é o método preferencial para resolver problemas com URLs apontando para o servidor back-end em vez do servidor front-end. Se por algum motivo não for possÃvel alterar a configuração do servidor back-end, você pode configurar o servidor front-end para reescrever o HTML antes de servi-lo ao cliente.
No entanto, isso deve ser visto como um método de último recurso, pois adiciona carga desnecessária ao servidor front-end.
Apache
Com o Apache você pode usar o módulo
mod_proxy_html
. Este módulo fornece a diretivaProxyHTMLURLMap
, que você pode usar para reescrever a resposta.Isso deve reescrever todas as ocorrências da URL do servidor local na resposta com a URL publichostname.
nginx
Com o nginx, um resultado semelhante pode ser obtido com o ngx_http_sub_module :