Proxy Reverso · 17 min read · Jan 24, 2026
Um Guia para executar um Proxy Reverso para HTTP(S), SSH e MySQL/MariaDB usando NGINX

Este guia irá orientá-lo na instalação e configuração do NGINX para permitir a execução de múltiplos servidores físicos, máquinas virtuais ou uma combinação de ambos atrás de um único endereço IP público. Você pode optar por executar vários servidores web em máquinas virtuais e administrá-los localmente ou pode ser necessário utilizar ferramentas de acesso remoto, como SSH, para cada um dos hosts. Por exemplo, se o acesso local não estiver disponível fora do horário comercial normal. Este guia pode facilitar ambos os cenários.
As configurações mostradas aqui seriam mais adequadas para um laboratório em casa ou uma rede de pequeno negócio que tem limitações nos endereços IP públicos disponíveis. Não haveria muita razão, se houver alguma, para executar uma configuração como esta, quando você tem vários servidores ou máquinas virtuais alugadas de um serviço de hospedagem, você receberá um endereço IP público para cada servidor ou host de qualquer maneira.
Eu vou mostrar como instalar o NGINX e fazer configurações que permitirão que o servidor atue como um Proxy Reverso para HTTP(S), SSH, FTP e MySQL/MariaDB. Presumo que para o servidor host do NGINX você tenha: acesso local, uma instalação nova do Ubuntu 18.04 e que você optou por instalar o servidor SSH durante as etapas de instalação do servidor Ubuntu.
Esta configuração funciona bem para mim, mas por favor, entenda que não posso garantir que isso funcionará para você. Claro, se você encontrar algo errado, me avise para que possa ser corrigido. Por favor, certifique-se de ler todo o guia antes de começar, há uma parte (streams) onde mostro duas maneiras de gerenciá-la.
Começando
Neste guia, estarei usando os seguintes nomes de host e endereços IP.
rproxy.example.com 192.168.1.1
web1.example.com 192.168.1.2
db1.exmple.com 192.168.1.3Você deve ter uma conta de usuário não-root no servidor para uma instalação padrão do servidor Ubuntu 18.04 que você criou durante a instalação. Comece fazendo login no servidor onde você instalará o NGINX com esse usuário. Como este é provavelmente um servidor local, você pode precisar fazer login diretamente no servidor pela primeira vez para configurar o servidor SSH. Você precisará, é claro, de um teclado e monitor conectados ao servidor para fazer isso.
Nota: Se como eu você usa software de virtualização como VMWare que inclui uma interface de navegador, então você deve ter um console dentro desse sistema e pode realizar esta etapa sem acesso “direto”. Você poderia tentar realizar toda essa configuração dentro desse console, no entanto, descobri que alguns recursos, como copiar e colar, não funcionaram no console baseado em navegador, embora isso possa ser específico do navegador, então pode valer a pena tentar ver se você consegue.
Preparando o servidor host
No seu shell de console (navegador ou conectado diretamente)
sudo nano /etc/ssh/sshd_configDescomente as linhas: Port altere o número da porta para algo como 23456, ListenAddress e altere para 0.0.0.0. Para aqueles que podem não estar familiarizados com o nano, pressione CTRL + X, digite y e depois pressione enter. Isso salvará e fechará um arquivo, se nenhuma alteração foi feita no arquivo, CTRL + x fechará o arquivo sem solicitar para salvar. Você será retornado ao prompt de comando.
Não irei me aprofundar no restante das configurações dentro deste arquivo porque este já é um guia consideravelmente longo e há muitos guias que mostrarão quais configurações você deve alterar para uma série de coisas, como usar chaves SSH e permitir login SSH root. Você também pode encontrar esses guias bem aqui no site HowtoForge.
Com as alterações concluídas, você precisará reiniciar o servidor ssh para que as mudanças tenham efeito. Seu login atual não é afetado por esta reinicialização.
systemctl restart sshVerifique se você consegue fazer login usando SSH a partir de um terminal em outro computador dentro da sua rede local.
ssh [email protected] -p23456Mantenha este terminal aberto após fazer login com sucesso usando SSH e saia do console/servidor. Você não precisará mais usá-lo pelo restante deste guia.
A partir deste ponto, você estará executando comandos de nível root a partir do seu terminal. O próximo comando eliminará a necessidade de preceder comandos subsequentes com sudo.
sudo -sAtualize o banco de dados de pacotes Apt e atualize o Ubuntu para garantir que você tenha os pacotes mais recentes instalados.
apt update && apt -y upgradeSe você ver algo durante a atualização que relata novos kernels sendo instalados, então você deve reiniciar uma vez que o apt tenha terminado de atualizar para garantir que você está trabalhando em um sistema totalmente atualizado.
Definindo o nome do host do servidor proxy reverso.
hostnamectl set-hostname rproxy.example.comSe você estiver executando um servidor virtual, pode ter um arquivo chamado cloud.cfg que precisa ser modificado para preservar o nome do host que é definido aqui. O seguinte comando mostrará um arquivo com conteúdo ou uma página vazia. Se você ver uma página vazia, pode simplesmente CTRL + x e pular esta etapa, pois não há nada que você precise fazer.
nano /etc/cloud/cloud.cfgAltere a linha de preservação do nome do host para true e feche/salve o arquivo.
Se seu sistema é atualmente apenas local, você precisará mostrar a este servidor onde estão seus outros servidores/hospedes virtuais.nano /etc/hostsO arquivo hosts ficará algo assim após você fazer as alterações, os endereços IP e Hosts devem corresponder à sua própria infraestrutura.
127.0.0.1 localhost
127.0.1.1 rproxy.example.com
192.168.1.2 web1.example.com
192.168.1.3 db1.example.com
# As seguintes linhas são desejáveis para hosts compatíveis com IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allroutersInstalando o NGINX
apt install -y nginxApós a instalação, você deve verificar sua versão do NGINX, é fundamental que você tenha uma versão 1.9 ou superior para permitir que você faça Proxy Reverso para SSH e MySQL/MariaDB.
ginx -vComo você pode ver, eu tenho a versão 1.14 do NGINX instalada, que é a padrão no Ubuntu 18.04 (10 de outubro de 2019)
ginx version: nginx/1.14.0 (Ubuntu)Preparando o NGINX para funcionar como um Proxy Reverso
Com esta configuração, você não estará servindo nenhum site diretamente do servidor host do Proxy Reverso. Você criará uma nova estrutura de diretório sob /etc/nginx/. Isso preservará as configurações padrão do NGINX caso você queira reverter essas alterações mais tarde ou decidir que na verdade também deseja servir sites diretamente deste host. É possível executar a configuração padrão juntamente com essas configurações de Proxy Reverso, no entanto, se o Apache2 estiver no mesmo servidor, ele precisará de portas alternativas para escutar e você ainda precisará fazer Proxy Reverso para os sites que esta instância do Apache2 serve.
Construindo a estrutura de diretório do Proxy Reverso
cd /etc/nginx && mkdir rproxy && cd rproxy && mkdir http http/available http/enabled stream stream/available stream/enabledAgora que você tem a estrutura no lugar, pode prosseguir com a criação dos arquivos de configuração. Eu uso o nano, mas você pode usar o editor com o qual se sentir confortável. O Nano criará/atualizará os arquivos ao salvar.
Antes de prosseguir, abra um documento vazio no seu computador ou pegue uma caneta e papel para anotar as portas que você configurar.Configurando proxies reversos de servidor web (http)
Crie o(s) arquivo(s) de configuração http para o(s) site(s) ajustando conforme necessário
nano http/available/example.com.confCopie o bloco do servidor na página aberta no terminal com o nano, ajustando conforme necessário.
# Anote as portas 80 e 443
server {
server_name example.com www.example.com;
listen 80;
set $upstream 192.168.1.2;
location / {
proxy_pass_header Authorization;
proxy_pass http://$upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
client_max_body_size 0;
proxy_read_timeout 10000s;
proxy_redirect off;
}
}Configurando proxies reversos de SSH, MySQL/MariaDB (stream)
Antes de prosseguir, decida qual você deseja utilizar, por host ou por serviço. Por host, você criará uma configuração para cada host, o que pode ser útil para alterar rapidamente as configurações de um único host. Por serviço, você terá as portas de serviço para todos os servidores em um arquivo para cada um, SSH, MySQL/MariaDB e FTP.
Usando configurações por serviço
Adicione as configurações de SSH.
nano stream/available/ssh.conf# Anote as portas de escuta
upstream web1-ssh {
server 192.168.1.2:22;
}
server {
listen 22002;
proxy_pass web1-ssh;
}
upstream db1-ssh {
server 192.168.1.3:22;
}
server {
listen 22003;
proxy_pass db1-ssh;
}
# Adicione quantos pares de blocos upstream e server você precisar para seus servidores SSH acessados remotamente.Adicione as configurações de MySQL/MariaDB.
nano stream/available/db.conf# Anote as portas de escuta
upsteam db1-mysql {
server 192.168.1.3:3306;
}
server {
listen 33063;
proxy_pass db1-mysql;
}
# Adicione quantos pares de blocos upstream/server você precisar para seus servidores MySQL/MariaDB acessados remotamente a este arquivo.Agora crie as configurações de Proxy Reverso FTP.
nano stream/available/ftp.confupstream web1-ftp {
server 192.168.1.3:21
}
server {
listen 21002;
proxy_pass web1-ftp;
}
# Adicione quantos pares de blocos upstream/server você precisar para seus servidores FTP acessados remotamente.Usando arquivos de configuração por host
nano /etc/nginx/rproxy/stream/available/web1.example.com.conf# Anote as portas de escuta
upstream web1-ssh {
server 192.168.1.3:22;
}
server {
listen 22002;
proxy_pass web-ssh;
}
Criando o arquivo de host para db1.example.com
nano /etc/nginx/rproxy/stream/available/db1.example.com.conf# Anote as portas de escuta
upsteam db1-mysql {
server 192.168.1.3:3306;
}
server {
listen 33063;
proxy_pass db1-mysql;
}
upstream db1-ssh {
server 192.168.1.3:22;
}
server {
listen 22003;
proxy_pass db1-ssh;
}
Como você pode ver, é um pouco não convencional. Você está usando portas públicas de uma maneira não padrão, escolhendo as portas que precisa e, em seguida, apontando-as para o NGINX. Isso seria normal, exceto que agora você está usando um número de porta diferente para cada serviço em cada servidor que deseja acessar remotamente. Isso significa, usando SSH como exemplo, um número de porta diferente para cada host habilitado para SSH 22 222 2222 22222, por exemplo, apontaria para a porta 22 em quatro servidores ou máquinas virtuais diferentes.
Este não é o caso para o NGINX fazer Proxy Reverso para sites, desde que o NGINX tenha uma configuração de servidor definida para um site, ele funcionará corretamente com apenas as portas 80 e 443 encaminhadas para ele.
Neste ponto, você provavelmente percebeu que poderia simplesmente usar os passos de HTTP e pular os passos de stream, e em vez disso, encaminhar várias portas para os múltiplos serviços para o servidor/endereço IP apropriado. De fato, isso pode ser feito. No entanto, isso adicionaria outra camada de complexidade e se tornaria difícil de manter à medida que o número de servidores aumenta, pois você pode precisar alterar as portas padrão em cada servidor para ssh, mysql e ftp. Esta configuração já é complexa, ainda assim, poderia ser feita se você quisesse.
Usar um proxy reverso para esses serviços da maneira que mostrei a você diminui significativamente a complexidade, fornecendo um único lugar para fazer essas alterações de configuração e você não precisaria fazer alterações nas portas em toda a sua infraestrutura.
Como um bônus adicional para esta configuração, os outros servidores em sua infraestrutura só precisam escutar em interfaces locais e portas padrão, se assim preferir. Se você estiver gerenciando localmente, pode usar os endereços IP locais e as portas de serviço padrão para acessar os serviços necessários, então você não precisará consultar suas anotações para lembrar as portas corretas, você só precisa saber o endereço IP e as credenciais de login.
Juntando tudo
Para começar a usar as configurações do Proxy Reverso do NGINX, você precisará fazer algumas edições no arquivo de configuração principal. Comente a linha de inclusão atual no bloco http (se você não estiver servindo sites diretamente do NGINX também).
cd /etc/nginx && nano nginx.confNote as partes destacadas abaixo para determinar o que precisa ser alterado.
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Configurações Básicas
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Configurações SSL
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Descartando SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Configurações de Log
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Configurações Gzip
##
gzip on;
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascri$
##
# Configurações de Host Virtual
##
include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*;
# Arquivos de configuração de proxy reverso http.
include /etc/nginx/rproxy/http/enabled/*.conf;
}
stream {
# Arquivos de configuração de proxy reverso stream.
include /etc/nginx/rproxy/streams/enabled/*.conf;
}
#mail {
# # Veja o script de autenticação de exemplo em:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
Ativando as configurações de proxy reverso.
Primeiro, habilite todas as configurações http
ln -s /etc/nginx/rproxy/http/available/*.conf /etc/nginx/rproxy/http/enabledHabilite todas as configurações de stream
ln -s /etc/nginx/rproxy/stream/available/*.conf /etc/nginx/rproxy/stream/enabledRealize um teste para verificar se a configuração do NGINX como Proxy Reverso está correta.
ginx -TNa saída, você deve ver uma mensagem de sucesso junto com todas as configurações personalizadas que você fez anteriormente.
Reinicie o NGINX para colocar as configurações de Proxy Reverso em ação.
systemctl restart nginxVerifique se o NGINX está escutando em todas as portas configuradas. verifique contra suas anotações se todas as portas estão mostradas nos resultados.
netstat -tulpn | grep nginxA saída deve ser algo assim
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4964/nginx: master
tcp 0 0 0.0.0.0:22002 0.0.0.0:* LISTEN 4964/nginx: master
tcp 0 0 0.0.0.0:22003 0.0.0.0:* LISTEN 4964/nginx: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4964/nginx: master
tcp 0 0 0.0.0.0:33062 0.0.0.0:* LISTEN 4964/nginx: master
tcp 0 0 0.0.0.0:33063 0.0.0.0:* LISTEN 4964/nginx: master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 4964/nginx: master Abrindo o servidor para tráfego
Agora que o NGINX está escutando e pronto para agir como Proxy Reverso para todas as conexões que queremos permitir tráfego, desative temporariamente o UFW enquanto passa pelas próximas etapas. Isso tornará a solução de problemas mais fácil se as coisas não estiverem funcionando corretamente.
ufw disableEncaminhando Portas
Infelizmente, não posso lhe dar orientações aqui. Você precisará consultar o manual do seu roteador ou procurar online para aprender como fazer isso. Em resumo, no entanto, você deseja encaminhar cada uma das portas que o NGINX está escutando para a máquina host do NGINX. No meu roteador específico, consigo configurar “aplicações” personalizadas.
Isso me permite atribuir qualquer número de portas não atribuídas ou intervalos de portas à aplicação personalizada, que será então atribuída a um endereço IP da LAN ou a um dispositivo conectado específico identificado pelo seu nome de host. Em qualquer caso, isso significa que posso alternar todas as portas atribuídas a essa aplicação personalizada para qualquer host na minha rede sem ter que excluir todas as portas e reatribui-las. Esta é uma excelente opção a ter e recomendo fortemente que você escolha um roteador que a suporte.
Este pequeno, mas incrivelmente útil recurso no firewall do meu roteador me levou a instalar um segundo Proxy Reverso espelhando as configurações do meu Proxy Reverso ativo. Eu o mantenho desligado e consigo inicializá-lo e ter as portas trocadas para ele em menos de 3 minutos de descoberta. Imagino que haja empresas de hospedagem profissionais que teriam dificuldade em atender a esse tempo de resposta para recuperação de desastres e tudo isso surgiu devido ao desejo de executar vários servidores em uma rede doméstica.
SSL grátis Letsencrypt para o Servidor Proxy Reverso
Instale o Certbot e o plugin Certbot NGINX. Esta etapa é realizada aqui porque você não pode criar um certificado até que tenha DNS funcional para todos os nomes (sub.)domínio listados em um certificado e seja capaz de fazer uma conexão com o domínio via HTTP. Ao completar isso após ter encaminhado as portas para o proxy reverso, também atua como um teste extra para suas configurações. Se o certificado falhar porque o domínio não pode ser alcançado, você verá um aviso de erro significativo na saída.
Para garantir que você está obtendo a versão mais recente do certbot, adicione o repositório certbot antes de instalar. Os repositórios do Ubuntu estão frequentemente uma versão ou mais atrás de uma versão de software e você realmente deseja as versões estáveis mais recentes de todo o seu software, se puder obtê-las.
add-apt-repository ppa:certbot/certbot
apt install -y certbot python-certbot-pluginCom o certbot e o plugin certbot nginx instalados, você pode agora criar os certificados para o NGINX.
Este comando deve ser repetido para todos os domínios e subdomínios para os quais você deseja fornecer SSL. Se esta for a primeira vez que você executa o certbot, precisará aceitar os termos e condições.
certbot --nginx -d example.com -d www.example.comNote que se você tiver um servidor funcionando com SSL no host upstream, precisará garantir que as opções selecionadas aqui correspondam àquelas no servidor host, especificamente, se você redirecionar para https no servidor upstream, deve fazer isso aqui também.
Para clareza, example.com está existindo em outro servidor, e eu selecionei redirecionar http para https dentro do ISPConfig, então por essa razão, eu escolho fazer isso aqui. O arquivo de configuração será atualizado e agora vejo que o Certbot adicionou algumas configurações próprias.
Verificando se tudo funciona.
Agora que você tem tráfego capaz de fluir para o seu Proxy Reverso, você deve verificar se tudo está funcionando como pretendido. Verifique se os sites estão funcionando corretamente, execute conexões e tarefas de SSH, FTP e MySQL/MariaDB. Uma vez que você esteja satisfeito que tudo está operando como deveria, então você habilitará o UFW e adicionará regras para permitir cada uma das portas.
Protegendo o servidor Proxy Reverso
ufw enableVocê vai querer permitir, 80 e 443 de qualquer lugar. e provavelmente restringir SSH, FTP e MySQL/MariaDB a um endereço IP ou nome de host. Você pode comentar as regras para identificar rapidamente qual serviço/servidor você atribuiu a porta.
ufw allow 80
ufw allow 443
ufw allow from 1.2.3.4 to any port 22002 comment 'web1 SSH'
ufw allow from somehost.domain.com to any port 33061 comment 'db1 MySQL/MariaDB'
ufw reload
ufw status numberedAtualizando o Apache2
Ao executar atrás de um proxy reverso, os arquivos de log do Apache2 registrarão o endereço IP do servidor Proxy Reverso em vez do endereço IP do visitante do site. Para restabelecer o registro normal de endereços IP no Apache2, um módulo está disponível para corrigir esse comportamento.
Complete as seguintes etapas em cada servidor web com uma instância do Apache2 instalada.
sudo apt install -y libapache2-mod-rpafPara garantir que o Apache2 agora registrará os endereços IP corretos, faça uma pequena modificação no arquivo rpaf.conf. O Ubuntu 18.04 já criou o arquivo para nós, só precisamos editá-lo, alterando o endereço IP destacado para o do host do Proxy Reverso NGINX.
nano /etc/apache2/mods-available/rpaf.conf
RPAFenable On
# Quando habilitado, pegue o cabeçalho X-Host de entrada e
# atualize as configurações do virtualhost de acordo:
RPAFsethostname On
# Defina quais IPs são seus proxies front-end que enviam
# os cabeçalhos X-Forwarded-For corretos:
RPAFproxy_ips 127.0.0.1 ::1
# Altere o nome do cabeçalho a ser analisado do padrão
# X-Forwarded-For para algo de sua escolha:
# RPAFheader X-Real-IP
Notas Finais
NGINX e Apache2 no mesmo host
Nenhos dois serviços podem escutar na mesma porta dentro de um servidor ou máquina virtual. Se o NGINX estiver instalado no mesmo servidor ou máquina virtual que um servidor web Apache2, você precisará alterar a porta que o Apache2 escuta. O NGINX requer as portas 80 e 443 para realizar suas funções HTTP(S), pois são as portas padrão para HTTP e HTTPS.
Volte à seção http deste guia e adicione configurações de Proxy Reverso para sites servidos por esta instância do Apache2 da mesma forma que as de outros servidores na rede.
Alterando a porta de escuta do Apache2
Se você tiver um sistema de gerenciamento de servidor instalado, como o ISPConfig, este sistema gerencia os arquivos vhost do Apache2, então você deve pesquisar como alterar as portas que o Apache2 está escutando. Pesquise nos fóruns do ISPConfig e faça os ajustes necessários. Caso contrário, você deve consultar os fóruns do Ubuntu ou o site do Apache2 para saber como realizar essas alterações.
Nota: As portas do Apache2 não precisam ser alteradas quando é o único servidor web instalado no servidor ou máquina virtual.Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.