Docker + Nginx + Asp.Net Core: Aprenda como configurar um proxy reverso​

Se você já ouviu diversas vezes o termo proxy reverso mas não sabe nem o que é, este artigo é para você! Mas primeiro, antes de entender o que é um proxy reverso, você sabe o que é um proxy? Um servidor proxy nada mais é do que um servidor intermediário entre o dispositivo gerador de uma requisição e o servidor receptor da requisição.

Sabe quando você está em uma empresa com sérias restrições de internet, e você tenta dar aquela escapadinha para acessar o facebook? E quando acessa o site, o facebook esta bloqueado? Então, neste caso o proxy funciona da seguinte maneira: A rede interna solicita para acessar um web site externo, e caso o acesso a este web site esteja mapeado como permitido o request será redirecionado ao servidor externo, que devolverá uma resposta ao proxy, que devolverá uma resposta ao dispositivo solicitante. Já no caso do web site estar mapeado como não permitido, ao receber o request o proxy não o repassará para o servidor externo e o bloqueará.

Proxy Reverso

Agora que você já sabe o que é um proxy, explicar o que é um proxy reverso é muito mais fácil! Se o proxy é um servidor intermediário entre uma rede interna e a internet, um proxy reverso nada mais é do que um intermediário entre a internet e a rede interna.

Curte aqui minha página do facebook! @kenerry.software.engineer
Acesse meu site e baixe o e-book de Arquitetura! https://kenerry.com.br

Exemplo: Vamos lá, você desenvolveu um software extremamente complexo que realiza a somatória de dois números inteiros! Sim, você é diferenciado. E você fez esse software para a empresa “Matemática na Veia”. No processo tradicional, para que os usuários do mundo inteiro consigam acessar essa incrível feature disponibilizada, seria necessário apenas dois passos, primeiro, hospedar a aplicação na infraestrutura da empresa, segundo expor o serviço na internet. Agora imagine que a empresa não queira expor o endereço IP do servidor, então o que você deve fazer neste caso é criar um servidor proxy, mais precisamente um servidor proxy reverso, e expôr o proxy reverso na internet deixando o IP do servidor interno mascarado pelo IP do proxy reverso.

Resumo da Ópera: Proxy, intermediador de requests de dentro de casa (On premises) para internet. Proxy reverso, intermediador de requests da internet para dentro de casa (On premises).

Colocando a Teoria na Prática

Demonstrarei como utilizar um proxy reverso utilizando nginx em um container docker juntamente com um web api conteinerizada também e tudo isso orquestrado pelo docker compose.

Se você não quiser criar um web api do zero, pode utilizar esta aqui.

Veja a simplicidade do Dockerfile do container de proxy reverso com nginx. Estou apenas deletando o arquivo padrão de configuração do nginx, e copiando os novos arquivos de configuraço para dentro do container.

Quer entender mais como funciona a configuração de proxy reverso com Nginx? Confira nesta documentação aqui.

Crie o arquivo reverse-proxy.conf conforme a seguir.

Nesse arquivo definimos as configurações do servidor de proxy reverso, perceba que a sintaxe é muito simples e clean. Primeiramente está definido o objeto servidor e, dentro dele suas configurações, neste caso porta e rota para “proxear”. A porta do servidor de proxy reverso é definida com a propriedade listen, qual configurei a porta padrão 80. Na sequência vem a definição de qual caminho será redirecionado para qual servidor, a partir do objeto location. Na frente de location temos uma barra, o que significa que todas as requisições ao endereço do servidor de proxy reverso deverão ser redirecionadas ao endereço do servidor configurado na propriedade proxy_pass.

Se a aplicação em questão também tiver um frontend web, você pode utilizar o mesmo servidor proxy. O arquivo reverse-proxy.conf ficaria assim:

Apenas mais um arquivo de configuração, proxy.conf.

Para finalizar, seguem os arquivos para orquestrar os contêineres, lembrando que esta parte é opcional, já que você pode subir os contêineres na mão.

docker-compose.yaml

docker-compose.override.yaml

Como você pode ver na figura abaixo, o container patterns-webapi está rodando na porta 8080, enquanto o container reverse-proxy está rodando na porta 80. O que deve acontecer é o seguinte, devemos conseguir acessar nossa web api através do endereço proxy.

Primeiro, vamos testar o acesso ao container patterns-webapi para garantir que esta de pé, porta 8080.

Veja agora o acesso ao container reverse-proxy, porta 80.

Mas veja agora o que acontece se ativarmos a rota /api/v1/swagger no container reverse-proxy. O swagger será renderizado normalmente. Por trás o request foi redirecionado para o web api mas na rota o endereço IP continua sendo o do proxy reverso. Confira!

Por hoje é só! Espero que tenha gostado! Se este artigo te ajudou de alguma maneira, não deixe de compartilhar com os amigos! Muito obrigado e um grande abraço!

Código Completo.