Ir para o conteúdo

Servidor em produção: do DNS ao HTTPS sem pular a operação

Entenda o que existe entre uma aplicação pronta e um serviço público: DNS, reverse proxy, runtime, HTTPS, firewall, workers, banco, deploy, backup e recovery.

Palavras: 2299Tempo de Leitura: 12 Minutos

Uma aplicação pode estar pronta para produção e ainda não existir como serviço público.

Entre “o projeto funciona” e “usuários conseguem acessá-lo com segurança e previsibilidade” há uma cadeia de responsabilidades que costuma ficar invisível quando usamos hospedagem gerenciada ou PaaS.

Num servidor que você opera, alguém precisa responder:

  • qual host recebe o tráfego?
  • como o domínio aponta para ele?
  • quem termina HTTPS?
  • quem recebe a conexão pública?
  • como a requisição chega ao runtime da aplicação?
  • qual processo mantém a aplicação viva?
  • onde ficam banco, cache e filas?
  • quem executa workers e tarefas agendadas?
  • o que acontece durante um deploy?
  • como voltar se algo quebrar?
  • o que é feito quando o disco, o processo ou o próprio host falha?

Isso é “colocar no ar” de verdade.

Não significa que toda aplicação precise de uma VPS própria. Muitas vezes PaaS, hospedagem gerenciada ou serviços administrados são escolhas melhores.

Mas entender a cadeia é importante mesmo quando outra plataforma a executa por você.

Produção começa com uma fronteira pública

Localmente, sua aplicação costuma ouvir em um endereço privado da máquina. Produção adiciona uma fronteira entre Internet e processo.

Essa fronteira precisa ter identidade, roteamento, criptografia, política de exposição e observabilidade.

Domínio e DNS: nome não é servidor

Um domínio é uma identidade legível. DNS resolve nomes para informações que permitem localizar serviços.

Quando você aponta um domínio para um servidor, não “instala o site no domínio”. Você cria uma relação entre nome e infraestrutura.

Isso tem consequências práticas:

  • mudança de IP pode exigir atualização de registros;
  • caches e TTL influenciam quanto tempo mudanças levam para propagar;
  • subdomínios podem apontar para serviços diferentes;
  • email, validações e outros serviços usam registros próprios;
  • DNS correto não prova que a aplicação está respondendo.

Uma falha pode estar na resolução do nome, na rota até o host, no firewall, no reverse proxy ou no processo da aplicação.

Separar essas camadas torna troubleshooting muito mais rápido.

Reverse proxy: separar Internet do processo da aplicação

Seu framework não precisa necessariamente ser o primeiro processo exposto à Internet.

Um reverse proxy como Nginx pode receber a conexão pública e encaminhar a requisição para outro processo.

O fluxo mental fica assim:

cliente
  ↓
DNS resolve o host
  ↓
porta pública 80/443
  ↓
Nginx / reverse proxy
  ↓
runtime ou servidor da aplicação

Essa camada pode concentrar TLS, roteamento por hostname/path, arquivos estáticos, limites, headers e outras políticas.

O Nginx upstream descreve exatamente esse papel de proxy: receber requisições, encaminhá-las ao servidor de aplicação e devolver a resposta ao cliente.

Isso cria uma fronteira útil: o processo da aplicação pode escutar apenas numa interface local, enquanto o reverse proxy é o componente exposto publicamente.

Runtime: código precisa de um processo previsível

PHP, Node, Go, Python e outras stacks materializam a aplicação de formas diferentes.

PHP pode trabalhar atrás de FastCGI/PHP-FPM. Node pode executar um servidor HTTP próprio. Uma aplicação Go pode ser um binário único.

As diferenças importam, mas a responsabilidade é a mesma:

alguém precisa manter o processo correto executando com usuário, ambiente, diretório e política de restart conhecidos.

Rodar php artisan serve, npm start ou um binário manualmente numa sessão SSH não cria automaticamente um serviço de produção.

O processo precisa estar integrado ao gerenciador adequado, ter logs, receber shutdown controlado e voltar de forma previsível após reboot.

Variáveis de ambiente e secrets

Produção possui configuração que não deveria estar fixa na imagem ou no código:

  • credenciais de banco;
  • tokens de serviços externos;
  • chaves de APIs;
  • ambiente da aplicação;
  • endpoints;
  • parâmetros operacionais.

O princípio é separar código, configuração e segredo.

Isso não significa que toda variável de ambiente seja automaticamente segura. O importante é ter um mecanismo conhecido, permissões adequadas e processo de rotação para dados sensíveis.

HTTPS: criptografia também tem lifecycle

HTTPS protege a comunicação entre cliente e servidor usando TLS.

Para isso, o servidor apresenta um certificado que vincula uma identidade de domínio a material criptográfico confiável para o cliente.

Let’s Encrypt automatiza emissão e renovação por meio do protocolo ACME. O cliente ACME demonstra controle sobre o domínio e solicita o certificado.

O detalhe operacional mais importante é que certificado não é uma configuração “feita uma vez”.

Ele expira.

Uma operação saudável precisa considerar:

  • emissão inicial;
  • renovação automática;
  • recarga do serviço quando necessário;
  • monitoramento de falha de renovação;
  • domínio correto;
  • cadeia de confiança;
  • redirecionamento coerente de HTTP para HTTPS quando aplicável.

Um site pode estar funcional internamente e falhar publicamente apenas porque o certificado expirou ou foi emitido para o hostname errado.

Firewall: publique somente o que precisa ser público

Um servidor de produção costuma executar componentes que não deveriam estar disponíveis diretamente para a Internet.

O banco pode precisar ser alcançado apenas pela aplicação. Redis pode ser interno. O runtime da aplicação pode ficar atrás do reverse proxy.

Uma política de firewall reduz a superfície exposta.

Em vez de começar por “quais portas devo abrir?”, comece por:

quais fluxos realmente precisam atravessar a fronteira pública?

Normalmente, o objetivo é que a Internet veja o mínimo necessário para entregar o serviço.

Banco, cache e filas: dependências também fazem parte da produção

Colocar apenas o processo web no servidor não materializa toda a aplicação.

Uma arquitetura pode depender de:

  • banco de dados;
  • Redis ou outro cache;
  • fila;
  • object storage;
  • serviço de email;
  • APIs externas;
  • busca;
  • processamento assíncrono.

Cada dependência adiciona perguntas operacionais:

  • onde está?
  • como a aplicação autentica?
  • qual latência é esperada?
  • o que acontece quando fica indisponível?
  • possui backup?
  • possui limite de conexão?
  • a falha deve derrubar readiness ou apenas degradar uma feature?

Serviços gerenciados podem transferir parte da responsabilidade ao provedor, mas não eliminam a dependência.

Você continua responsável por contratos, credenciais, limites e comportamento diante de falha.

Workers: produção não é apenas HTTP

Aplicações modernas frequentemente executam trabalho fora da requisição web.

Envio de email, processamento de imagem, geração de relatório, webhooks, importações e jobs podem rodar em workers.

Esses processos precisam do mesmo rigor do processo web: supervisão, restart, logs, configuração e shutdown controlado.

Um site pode responder HTTP 200 e ainda estar operacionalmente quebrado porque a fila parou de consumir.

Scheduler: “rodar todo minuto” precisa de ownership

Frameworks costumam oferecer schedulers para tarefas recorrentes.

Mas o framework não acorda sozinho.

É necessário algum mecanismo operacional que invoque o scheduler: cron, timer ou outro orquestrador.

Isso cria uma cadeia:

agendador do sistema
      ↓
scheduler da aplicação
      ↓
tarefa
      ↓
evidência de sucesso ou falha

Se uma dessas camadas falhar silenciosamente, a tarefa pode deixar de executar por dias.

Jobs críticos precisam de logs, alertas ou outra forma de verificar execução real.

Deploy: mudar versão sem perder o controle

Deploy não é “subir arquivos”. É uma transição de estado.

Uma nova versão pode exigir:

  • novo código;
  • dependências;
  • build;
  • migrations;
  • atualização de configuração;
  • restart/reload de processos;
  • invalidação de cache;
  • health check.

O processo deveria ser repetível e deixar claro qual versão está ativa.

Quanto mais etapas manuais invisíveis existirem, maior a chance de dois servidores “iguais” terminarem diferentes.

Rollback: voltar código não é voltar o sistema inteiro

Se a nova versão falha, rollback pode significar restaurar a versão anterior do artefato.

Isso não desfaz automaticamente:

  • migration destrutiva;
  • mensagem já processada;
  • alteração em API externa;
  • arquivo transformado;
  • configuração incompatível;
  • dado escrito pelo novo código.

Por isso deploy seguro considera compatibilidade e recuperação antes da mudança.

Às vezes o melhor caminho é roll-forward: corrigir rapidamente com uma nova versão compatível com o estado atual.

O conceito é o mesmo que vimos em Kubernetes: rollback é uma capacidade, não uma máquina do tempo.

Backup: cópia sem restauração testada é esperança

Backup é uma das partes mais subestimadas de produção.

Ter um arquivo gerado por cron não responde às perguntas importantes:

  • o backup contém os dados corretos?
  • está armazenado fora da mesma falha que pode destruir o original?
  • é criptografado quando necessário?
  • existe retenção?
  • sabemos restaurar?
  • quanto tempo a restauração leva?
  • qual ponto no tempo conseguimos recuperar?

Dois conceitos ajudam a tornar isso concreto:

  • RPO: quanto dado podemos perder;
  • RTO: quanto tempo podemos levar para recuperar.

Mesmo sem formalizar SRE, pensar nesses limites muda a qualidade da estratégia.

Recovery: o plano precisa existir antes do incidente

Recovery é a capacidade de voltar a operar depois de uma falha.

Pode envolver restaurar banco, reprovisionar host, trocar DNS, recuperar arquivos, recriar configuração ou substituir uma dependência.

Se o procedimento só existe na memória de uma pessoa, o tempo de recuperação depende da disponibilidade e da lembrança dessa pessoa.

Documentar não significa escrever um manual de cem páginas. Um runbook mínimo pode registrar:

  • o que falhou;
  • onde está o backup;
  • quais credenciais são necessárias;
  • ordem de recuperação;
  • como validar integridade;
  • quem decide voltar o tráfego.

Health check: processo vivo não prova serviço saudável

Um endpoint HTTP que responde pode ser útil, mas saúde de produção possui camadas.

Pergunte:

  • o processo existe?
  • o reverse proxy alcança o runtime?
  • o runtime consegue acessar dependências essenciais?
  • a rota crítica funciona?
  • workers estão consumindo?
  • scheduler está executando?
  • disco e memória estão saudáveis?
  • certificado continua válido?

Um único health check não precisa testar tudo. O importante é saber qual pergunta cada sinal responde.

Logs: cada camada conta uma parte da história

Quando uma requisição falha, podem existir logs do reverse proxy, runtime, aplicação, banco e sistema operacional.

Correlacionar essas camadas é muito mais poderoso do que olhar apenas o último erro do framework.

O mapa completo de um servidor simples

Um serviço web tradicional pode ser visualizado assim:

usuário
  ↓
domínio / DNS
  ↓
firewall
  ↓
HTTPS / TLS
  ↓
reverse proxy
  ↓
runtime da aplicação
  ├─ banco
  ├─ cache
  ├─ fila → workers
  └─ scheduler

ao redor de tudo:
logs + health + deploy + backup + recovery

Nenhuma dessas camadas precisa obrigatoriamente morar no mesmo host.

O banco pode ser gerenciado. O storage pode ser externo. O TLS pode terminar num load balancer. Workers podem estar em outra máquina.

O valor do modelo é permitir que você identifique quem é responsável por cada função.

VPS, PaaS e serviços gerenciados

Entender servidores não obriga você a operar todos os componentes manualmente.

PaaS pode automatizar deploy, certificados, processos, logs e scaling.

Serviços gerenciados podem assumir patches, backup ou alta disponibilidade de banco.

Isso troca parte do trabalho operacional por custo, limites e dependência do provedor.

Essa pode ser uma excelente decisão.

O erro é usar abstração sem entender o que ela está abstraindo — principalmente quando chega a hora de diagnosticar uma falha ou decidir se precisa sair dela.

Um único servidor pode ser simples sem ser improvisado

Arquitetura de produção não precisa começar distribuída.

Uma aplicação pequena pode operar com qualidade em uma única VPS quando a carga é previsível e os riscos são conhecidos.

O que diferencia simplicidade de improviso é a disciplina ao redor do host.

Mesmo numa máquina única, ainda é possível ter:

  • versão rastreável;
  • deploy automatizado;
  • processos supervisionados;
  • HTTPS renovado automaticamente;
  • firewall restritivo;
  • logs coletados;
  • health checks;
  • backup externo;
  • restauração testada;
  • monitoramento de capacidade;
  • procedimento de rollback.

Por outro lado, concentrar web, banco, cache, workers e arquivos no mesmo host aumenta o raio de impacto de uma falha.

Isso não torna a arquitetura errada. Torna explícito o trade-off.

À medida que disponibilidade, escala ou isolamento passam a justificar o custo, componentes podem ser separados.

O importante é não confundir “mais máquinas” com “mais confiabilidade”.

Uma arquitetura distribuída sem observabilidade, ownership ou recovery pode ser muito mais frágil do que um servidor simples bem operado.

Comece pela responsabilidade operacional real. Distribua quando a separação comprar uma capacidade concreta.

“Está online” ainda não significa “está operável”

Conseguir abrir a home no navegador é apenas um smoke inicial.

Um serviço operável precisa sobreviver a situações menos felizes:

  • reboot;
  • deploy interrompido;
  • processo morto;
  • certificado perto de expirar;
  • disco em pressão;
  • worker parado;
  • falha de banco;
  • restauração de backup;
  • mudança de configuração;
  • erro humano.

Produção é o ambiente em que essas situações deixam de ser hipóteses acadêmicas.

Por isso a pergunta muda de “como colocar no ar?” para:

como manter este serviço previsível, observável e recuperável ao longo do tempo?

Essa é exatamente a fronteira que leva ao próximo tema: ServerOps.

A passagem para ServerOps

Configurar um servidor uma vez é um projeto.

Operá-lo por meses ou anos é uma função contínua.

Atualizações precisam acontecer. Capacidade muda. Logs crescem. Backups precisam ser testados. Incidentes aparecem. Dependências envelhecem. Pessoas entram e saem.

O próximo degrau da jornada não é adicionar mais uma ferramenta à stack.

É aprender a operar o sistema depois que o primeiro deploy já foi feito.

Publicado em