terça-feira, 8 de março de 2016

Reverse Proxy com o nginx

A utilização de um reverse proxy permite que um servidor acessível a partir da Internet forneça serviços existentes na sua rede privada para a Internet.
Desta forma, basta uma única máquina com este serviço para depois permitir o acesso a, por exemplo, vários serviços web existentes na rede privada.

Requisitos

O serviço de reverse proxy será feito com recurso ao nginx num servidor ubuntu 14.04.

Servidores internos a disponibilizar na internet:

  • 192.168.1.11:80 - servidor web principal
  • 192.168.1.12:80 - servidor web de teste

Instalação do nginx

apt-get install nginx

Após isto o serviço HTTP fica disponível e acessível na porta 80
netstat -tap
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:http                  *:*                     LISTEN      8967/nginx      

Os ficheiros de configuração de cada site ficam disponíveis em: /etc/nginx/sites-available
Por defeito existe apenas o default que permite ver a página por defeito do nginx.

Configuração do reverse proxy

Como o reverse proxy não vai disponibilizar serviço web direto, a configuração default que pode ser removida:
rm /etc/nginx/sites-enabled/default

Após qualquer alteração deste género é necessário fazer o reload das configurações do servidor:
service nginx reload

Neste caso, após ser removido o site default, passará a ser dado um aviso que a página não está disponível.

Resta agora criar um ficheiro de configuração para cada servidor:
nano /etc/nginx/sites-avaiable/www
server {
    listen 80;
    server_name www.exemplo.org exemplo.org;

    location / {
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;
       proxy_pass http://192.168.1.11;
    }
}

nano /etc/nginx/sites-avaiable/test
server {
    listen 80;
    server_name test.exemplo.org;

    location / {
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;
       proxy_pass https://192.168.1.12;
    }
}

Resta agora ativar os sites, para tal é necessário criar um link simbólico de cada um dos ficheiros para o diretório sites-enabled:
ln -s /etc/nginx/sites-available/www /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled/

E reiniciar o serviço
service nginx reload

Após isto caso o DNS esteja a apontar para o servidor correto e a porta 80 do router encaminhe tudo para o novo servidor, será possível aceder a cada um dos servidores pelo seu nome de domínio.

Esta configuração pode ser escalável para muitos mais serviços de forma semelhante.

Referências

[1] - Documentação Oficial: https://www.nginx.com/resources/admin-guide/reverse-proxy/
[2] - Exemplo: https://www.garron.me/en/linux/nginx-reverse-proxy.html