Projetos Práticos para Aprender Nginx: Guia Passo a Passo para Iniciantes

Projetos Práticos para Aprender Nginx: Guia Passo a Passo para Iniciantes





Projetos Práticos para Aprender Nginx


Yuri Developer
Projetos práticos para aprender Nginx

Projetos Práticos para Aprender Nginx

Guia técnico com exemplos reais para dominar Nginx em produção, passo a passo. Abordo cenários de proxy, balanceamento, cache, e TLS sem enrolação.


Projeto 1: Configuração de proxy reverso para API Node.js

Objetivo: expor uma API Node.js por meio de Nginx, lidando com headers, timeouts e estabilidade. O proxy reverso atua como gateway, simplificando a gestão de certificado, logs e políticas de segurança.

  • Defino um upstream para o serviço Node.js para facilitar o balanceamento simples se necessário.
  • Redireciono o tráfego para o backend, preservando o host original e o IP do cliente.
  • Configuro timeouts e headers para compatibilidade com HTTP/1.1 e keep-alive.

server {
  listen 80;
  server_name api.exemplo.com;

  location / {
    proxy_pass http://node-app:3000;
    proxy_http_version 1.1;

    # Cabeçalhos importantes
    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_set_header X-Forwarded-Proto $scheme;

    # Evita encerramento de conexões desnecessárias
    proxy_set_header Connection "";
    proxy_read_timeout 60;
  }
}

Projeto 2: Balanceamento de carga simples com round-robin

Objetivo: distribuir requisições entre várias instâncias da aplicação para aumentar disponibilidade e throughput. Uso uma configuração de upstream com opções de balanceamento simples.

  • Defino upstream com múltiplos backends.
  • Opção de estratégia: round-robin (padrão), com melhoria opcional usando least_conn.
  • Integro com o proxy_pass para encaminhar as requisições para o grupo de servidores.

upstream app_servers {
  least_conn;              # alternativa: por conexões mínimas
  server 10.0.0.2:3000;
  server 10.0.0.3:3000;
}

server {
  listen 80;
  server_name app.exemplo.com;

  location / {
    proxy_pass http://app_servers;
    include /etc/nginx/proxy_params;  # ajuste conforme sua distro
  }
}

Projeto 3: Cache de conteúdo estático com expiração

Objetivo: reduzir load no backend ao servir assets estáticos diretamente pelo Nginx, com políticas de cache bem definidas para JS, CSS e imagens.

  • Serviço de conteúdo estático com diretório raiz e path matching para cache.
  • Encadeamento de regras para cache de cabeçalhos HTTP apropriados.

server {
  listen 80;
  server_name static.exemplo.com;

  location / {
    root /var/www/static;
    try_files $uri $uri/ =404;
  }

  # Cache estático efetivo
  location ~* \.(js|css|png|jpg|jpeg|gif|svg|woff2?|ttf)$ {
    expires 90d;
    add_header Cache-Control "public, max-age=7776000";
  }
}

Projeto 4: TLS com Let’s Encrypt para Nginx

Objetivo: disponibilizar HTTPS com certificados válidos e renováveis automaticamente, mantendo uma configuração limpa para proxies e workloads internos.

  • Redirecionamento de HTTP para HTTPS para exigir TLS.
  • Configuração de certificado, parâmetros de segurança e TLS tramite Let’s Encrypt.
  • Integração com backend através de upstream já utilizado.

# Redireciona HTTP para HTTPS
server {
  listen 80;
  server_name exemplo.com www.exemplo.com;
  return 301 https://$host$request_uri;
}

# TLS
upstream app_servers {
  server 127.0.0.1:3000;
}

server {
  listen 443 ssl;
  server_name exemplo.com www.exemplo.com;

  ssl_certificate /etc/letsencrypt/live/exemplo.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/exemplo.com/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

  location / {
    proxy_pass http://app_servers;
  }
}

Curtiu? Leve adiante seu aprendizado

Este guia traz fundamentos práticos para você aplicar rapidamente. Recomendo explorar conteúdos complementares para consolidar o entendimento e ampliar seu stack de produção: