15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
09.10.2024

Como Configurar o Nginx para Escutar em Múltiplas Portas

O Nginx pode escutar em múltiplas portas simultaneamente adicionando múltiplas diretivas `listen` dentro de um ou mais blocos `server` na sua configuração. Cada diretiva `listen` vincula o Nginx a uma combinação específica de IP/porta, permitindo que uma única instância do servidor lide com tráfego HTTP, HTTPS e de aplicações personalizadas em portas distintas sem executar processos separados.

Esta capacidade é essencial para ambientes multi-tenant, separação de portas de staging/produção, arquiteturas de proxy reverso e roteamento de microsserviços — tudo a partir de uma única instância de VPS Hosting.

Pré-requisitos

Antes de prosseguir, confirme o seguinte:

  • O Nginx está instalado e o serviço está ativo (`systemctl status nginx`)
  • Você tem privilégios `root` ou `sudo` no servidor
  • Você entende a diferença entre `/etc/nginx/nginx.conf` (configuração global) e `/etc/nginx/sites-available/` (blocos de configuração por site)
  • As regras de firewall (`ufw`, `iptables` ou um grupo de segurança em nuvem) permitem tráfego nas portas que você pretende abrir
  • Certificados SSL válidos estão disponíveis se estiver configurando portas HTTPS (autoassinados ou emitidos por CA)

Arquitetura de Configuração do Nginx: O Que Você Precisa Saber Primeiro

O Nginx usa um modelo de configuração hierárquico: o contexto `http` contém um ou mais blocos `server`, cada um dos quais pode conter uma ou mais diretivas `listen`. Entender esta hierarquia previne os erros de configuração incorreta mais comuns.

Principais diretivas envolvidas:

  • `listen [address:]port [ssl] [http2] [default_server]` — vincula o bloco do servidor a uma porta específica e IP opcional
  • `server_name` — corresponde ao cabeçalho `Host` para rotear solicitações para o bloco correto
  • `default_server` — designa qual bloco do servidor lida com solicitações que não correspondem a nenhum outro `server_name`

Localizações dos arquivos de configuração por distribuição:

DistribuiçãoConfig PrincipalConfigs de Sites
Ubuntu / Debian`/etc/nginx/nginx.conf``/etc/nginx/sites-available/`
CentOS / RHEL / AlmaLinux`/etc/nginx/nginx.conf``/etc/nginx/conf.d/`
Arch Linux`/etc/nginx/nginx.conf``/etc/nginx/sites-available/`
Docker (imagem oficial)`/etc/nginx/nginx.conf``/etc/nginx/conf.d/`

Em sistemas baseados em Debian, os arquivos em `sites-available/` devem ser vinculados simbolicamente a `sites-enabled/` para ter efeito:

“`bash

sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/

“`

Passo 1: Abrir o Arquivo de Configuração do Nginx

Para uma alteração global que afeta todos os hosts virtuais:

“`bash

sudo nano /etc/nginx/nginx.conf

“`

Para uma configuração específica de site (recomendada para produção):

“`bash

sudo nano /etc/nginx/sites-available/example.conf

“`

O uso de arquivos específicos por site é fortemente preferido. Ele isola as alterações, simplifica a reversão e evita que uma única configuração incorreta derrube todos os serviços hospedados.

Passo 2: Configurar Múltiplas Diretivas listen em um Único Bloco de Servidor

A configuração multi-porta mais simples vincula um bloco de servidor a várias portas. O Nginx aplicará lógica de roteamento idêntica independentemente de qual porta o cliente se conectou.

“`nginx

server {

listen 80;

listen 8080;

server_name example.com;

root /var/www/html;

index index.html index.htm;

location / {

try_files $uri $uri/ =404;

}

access_log /var/log/nginx/example_access.log;

error_log /var/log/nginx/example_error.log warn;

}

“`

O que isso faz:

  • `listen 80;` — aceita tráfego HTTP padrão
  • `listen 8080;` — aceita tráfego na porta HTTP alternativa (comum para ambientes de desenvolvimento, APIs internas ou verificações de integridade de balanceadores de carga)
  • Ambas as portas servem conteúdo idêntico de `/var/www/html`

Caso extremo — vinculação a um endereço IP específico: Em um servidor com múltiplas interfaces de rede (por exemplo, um IP público e um IP de LAN privada), você pode restringir em qual interface o Nginx escuta:

“`nginx

listen 192.168.1.10:8080;

listen 0.0.0.0:80;

“`

Isso é crítico em configurações de servidores multi-homed para evitar exposição pública não intencional de serviços internos.

Passo 3: Configurar HTTPS em Múltiplas Portas

O HTTPS requer o parâmetro `ssl` na diretiva `listen` e caminhos válidos de certificado/chave. O exemplo a seguir vincula HTTPS tanto à porta padrão 443 quanto a uma porta personalizada 8443:

“`nginx

server {

listen 443 ssl;

listen 8443 ssl;

server_name example.com;

ssl_certificate /etc/nginx/ssl/example.com.crt;

ssl_certificate_key /etc/nginx/ssl/example.com.key;

Modern TLS hardening

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

root /var/www/html;

index index.html;

location / {

try_files $uri $uri/ =404;

}

}

“`

Por que a porta 8443 é comumente usada:

  • Permite tráfego HTTPS em ambientes onde a porta 443 está bloqueada por firewalls upstream
  • Usada em desenvolvimento/staging para executar um servidor seguro sem conflitar com um serviço de produção na porta 443
  • Exigida por alguns frameworks de aplicação (Tomcat, proxies Node.js) que expõem HTTPS em portas não padrão

Armadilha crítica: Omitir `ssl_protocols` e `ssl_ciphers` deixa o Nginx usando padrões potencialmente fracos. Sempre defina explicitamente os parâmetros TLS, especialmente em servidores que lidam com dados sensíveis. Se você precisar de um certificado confiável em vez de um autoassinado, os Certificados SSL de uma CA reconhecida eliminam avisos do navegador e satisfazem os requisitos modernos de HSTS.

Passo 4: Servir Conteúdo Diferente em Portas Diferentes

Quando as portas devem servir aplicações distintas — por exemplo, um site público na porta 80 e um painel de administração interno na porta 8080 — use blocos `server` separados:

“`nginx

server {

listen 80;

server_name example.com;

root /var/www/public;

index index.html;

location / {

try_files $uri $uri/ =404;

}

}

server {

listen 8080;

server_name example.com;

root /var/www/admin;

index index.html;

Restrict admin panel to internal network only

location / {

allow 10.0.0.0/8;

allow 192.168.0.0/16;

deny all;

try_files $uri $uri/ =404;

}

}

“`

Casos de uso do mundo real para separação de conteúdo baseada em porta:

  • Porta 80/443: Site voltado ao público
  • Porta 8080: API REST interna ou endpoint de microsserviço
  • Porta 8443: Painel de administração seguro restrito por lista de permissões de IP
  • Porta 9000: Endpoint de métricas para scraping do Prometheus (nunca exposto publicamente)
  • Porta 3000/5000: Proxy reverso para uma aplicação Node.js ou Python

Passo 5: Usar o Nginx como Proxy Reverso em Múltiplas Portas

Um padrão comum de produção é usar o Nginx para fazer proxy de diferentes portas para diferentes servidores de aplicação backend:

“`nginx

server {

listen 80;

server_name app.example.com;

location / {

proxy_pass http://127.0.0.1:3000;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection 'upgrade';

proxy_set_header Host $host;

proxy_cache_bypass $http_upgrade;

}

}

server {

listen 8080;

server_name app.example.com;

location / {

proxy_pass http://127.0.0.1:4000;

proxy_http_version 1.1;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

“`

Este padrão é a espinha dorsal de implantações em contêineres em um Servidor Dedicado onde múltiplos contêineres Docker são executados em diferentes portas internas e o Nginx atua como o único ponto de entrada externo.

Passo 6: Validar a Configuração

Nunca reinicie o Nginx sem primeiro testar a sintaxe da configuração. Um erro de sintaxe fará com que o serviço falhe ao recarregar, derrubando todos os sites hospedados.

“`bash

sudo nginx -t

“`

Saída esperada em caso de sucesso:

“`

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

“`

Se aparecerem erros, a saída especificará o arquivo e o número da linha. Corrija todos os problemas relatados antes de prosseguir.

Para um recarregamento sem tempo de inatividade (preferível a uma reinicialização completa em produção):

“`bash

sudo systemctl reload nginx

“`

Uma reinicialização completa só é necessária ao alterar as diretivas `worker_processes`, `user` ou outras diretivas de nível de processo mestre:

“`bash

sudo systemctl restart nginx

“`

Passo 7: Verificar se o Nginx Está Escutando nas Portas Corretas

Após aplicar a configuração, confirme que o Nginx se vinculou às portas esperadas usando `ss` (preferível ao obsoleto `netstat`):

“`bash

sudo ss -tlnp | grep nginx

“`

Saída de exemplo:

“`

LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:(("nginx",pid=1234,fd=7))

LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1234,fd=8))

LISTEN 0 511 0.0.0.0:8443 0.0.0.0:* users:(("nginx",pid=1234,fd=9))

“`

Se uma porta não aparecer, verifique:

  1. A sintaxe da diretiva `listen` no arquivo de configuração
  2. Se outro processo já está ocupando essa porta: `sudo ss -tlnp | grep :8080`
  3. Se `nginx -t` passou sem erros
  4. Políticas SELinux ou AppArmor que podem bloquear a vinculação de portas não padrão

Testando com curl pela linha de comando (mais confiável do que um navegador para depuração):

“`bash

curl -I http://example.com

curl -I http://example.com:8080

curl -Ik https://example.com

curl -Ik https://example.com:8443

“`

O sinalizador `-I` busca apenas cabeçalhos. Uma resposta `200 OK` ou `301 Moved Permanently` confirma que a porta está ativa e o Nginx está respondendo corretamente.

Passo 8: Abrir Portas no Firewall

Escutar em uma porta no Nginx é insuficiente se o firewall do host bloquear conexões de entrada. Certifique-se de que as portas estão permitidas:

UFW (Ubuntu/Debian):

“`bash

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

sudo ufw allow 8080/tcp

sudo ufw allow 8443/tcp

sudo ufw reload

“`

firewalld (CentOS/RHEL/AlmaLinux):

“`bash

sudo firewall-cmd –permanent –add-port=8080/tcp

sudo firewall-cmd –permanent –add-port=8443/tcp

sudo firewall-cmd –reload

“`

iptables (direto):

“`bash

sudo iptables -A INPUT -p tcp –dport 8080 -j ACCEPT

sudo iptables -A INPUT -p tcp –dport 8443 -j ACCEPT

“`

Em infraestrutura em nuvem (AWS EC2, DigitalOcean, Hetzner), você também deve atualizar o grupo de segurança ou as regras de firewall em nuvem no nível do provedor — alterações no firewall no nível do host por si só não são suficientes.

Comparação: Configurações Nginx de Porta Única vs. Múltiplas Portas

RecursoPorta ÚnicaMúltiplas Portas (Mesmo Bloco)Múltiplas Portas (Blocos Separados)
Complexidade de configuraçãoBaixaBaixaMédia
Isolamento de conteúdoNenhumNenhumTotal
Controle de acesso por portaNão aplicávelNão possívelTotalmente suportado
Caso de usoSites simplesEspelhos de dev/stagingMicrosserviços, painéis de administração
Proxy reverso por portaUpstream únicoUpstream únicoUpstreams independentes
Terminação SSLPor blocoCertificado compartilhadoCertificados independentes por bloco
Separação de logsLog únicoLog únicoArquivos de log por porta

Armadilhas Comuns e Como Evitá-las

Conflito de porta com serviços existentes: A porta 80 pode já estar em uso pelo Apache. Execute `sudo ss -tlnp | grep :80` antes de configurar. Pare os serviços conflitantes ou reconfigure-os para usar portas diferentes.

Conflitos `default_server`: Se múltiplos blocos de servidor omitem `default_server` ou múltiplos blocos o reivindicam para a mesma porta, o Nginx usará o primeiro bloco na ordem do arquivo. Seja explícito:

“`nginx

listen 80 default_server;

“`

IPv6 não coberto: Adicionar `listen 80;` vincula apenas ao IPv4. Para servidores dual-stack, adicione:

“`nginx

listen [::]:80;

listen [::]:8080;

“`

SELinux bloqueando portas não padrão: No RHEL/CentOS com SELinux em modo de aplicação, o Nginx não pode se vincular a portas que não estão em sua política sem permissão explícita:

“`bash

sudo semanage port -a -t http_port_t -p tcp 8080

sudo semanage port -a -t http_port_t -p tcp 8443

“`

Esquecer de recarregar após alterações: As edições de configuração não têm efeito até que o Nginx recarregue. Automatize isso em pipelines CI/CD com uma etapa `nginx -t && systemctl reload nginx` pós-implantação.

Matriz de Decisão Prática

Use esta lista de verificação para determinar o padrão de configuração multi-porta correto para o seu cenário:

  • Mesmo conteúdo, múltiplas portas — Use múltiplas diretivas `listen` em um único bloco `server`
  • Conteúdo diferente por porta — Use blocos `server` separados com diretórios `root` distintos
  • Diferentes aplicações backend por porta — Use blocos `server` separados com `proxy_pass` apontando para diferentes endereços upstream
  • Proteger uma porta não padrão — Adicione `ssl` à diretiva `listen` e referencie os caminhos do seu certificado; certifique-se de que o SAN do certificado cobre o domínio
  • Restringir uma porta ao tráfego interno — Adicione diretivas `allow`/`deny` ou vincule `listen` apenas a um IP privado
  • Executando em um VPS com cPanel — Verifique se a configuração Apache/Nginx integrada do cPanel não conflita; use o "Include Editor" do cPanel ou um diretório dedicado de configuração Nginx drop-in
  • Gerenciando múltiplas opções de painel de controle — Revise os Painéis de Controle VPS disponíveis para encontrar um que exponha o gerenciamento de portas Nginx através de uma GUI

FAQ

O Nginx pode escutar na mesma porta em múltiplos blocos de servidor?

Sim. Múltiplos blocos `server` podem compartilhar a mesma porta. O Nginx diferencia entre eles usando a diretiva `server_name`, que corresponde ao cabeçalho HTTP `Host`. Se nenhum `server_name` corresponder, o bloco `default_server` lida com a solicitação.

Adicionar mais portas de escuta afeta o desempenho do Nginx?

A sobrecarga é insignificante. Cada diretiva `listen` adiciona um descritor de arquivo ao processo mestre do Nginx. O limite prático é o teto de descritores de arquivo abertos do sistema (`ulimit -n`), não o número de portas. Para implantações de alto tráfego, ajuste `worker_rlimit_nofile` e `worker_connections` em `nginx.conf`.

Como redireciono todo o tráfego da porta 8080 para a porta 80?

Use um bloco de servidor dedicado com uma diretiva `return`:

“`nginx

server {

listen 8080;

server_name example.com;

return 301 http://example.com$request_uri;

}

“`

Por que o Nginx não está escutando em uma porta mesmo que a configuração pareça correta?

As quatro causas mais comuns são: (1) a configuração não foi recarregada após a edição, (2) outro processo já está vinculado a essa porta, (3) uma regra de firewall está bloqueando a porta, ou (4) SELinux/AppArmor está impedindo a vinculação. Trabalhe em cada causa sistematicamente usando `ss -tlnp`, `nginx -t` e comandos de status do firewall.

Posso usar diferentes certificados SSL para diferentes portas HTTPS no mesmo domínio?

Sim. Cada bloco `server` tem suas próprias diretivas `ssl_certificate` e `ssl_certificate_key`. Dois blocos de servidor podem escutar nas portas 443 e 8443 respectivamente e referenciar arquivos de certificado completamente diferentes, mesmo para o mesmo `server_name`. Isso é útil ao rotacionar certificados ou executar um certificado legado junto com um novo durante um período de transição.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar