Como otimizar a infraestrutura de produção do Node.js: melhores práticas para 2025

Melhores práticas de implantação de produção do Node.js de nossa infraestrutura testada e comprovada que lida com milhões de solicitações diariamente.

Na Forward Email, passamos anos aperfeiçoando a configuração do nosso ambiente de produção Node.js. Este guia abrangente compartilha nossas práticas recomendadas de implantação de produção Node.js, testadas em campo, com foco na otimização de desempenho, monitoramento e nas lições que aprendemos escalando aplicativos Node.js para lidar com milhões de transações diárias.

Nossa Revolução de Otimização de Desempenho de Núcleo Único de 573%

Ao migrarmos dos processadores Intel para AMD Ryzen, alcançamos um Melhoria de desempenho de 573% em nossos aplicativos Node.js. Esta não foi apenas uma otimização menor — mudou fundamentalmente o desempenho de nossos aplicativos Node.js em produção e demonstra a importância da otimização de desempenho de núcleo único para qualquer aplicativo Node.js.

[!DICA] Para as melhores práticas de implantação de produção do Node.js, a escolha do hardware é crucial. Escolhemos especificamente a hospedagem DataPacket para a disponibilidade do AMD Ryzen porque o desempenho de núcleo único é crucial para aplicativos Node.js, já que a execução do JavaScript é single-threaded.

Por que a otimização de desempenho de núcleo único é importante para o Node.js

Nossa migração do Intel para o AMD Ryzen resultou em:

  • Melhoria de desempenho de 573% no processamento de solicitações (documentado em nossa página de status do GitHub Issue #1519)
  • Atrasos de processamento eliminados para respostas quase instantâneas (mencionadas em Edição nº 298 do GitHub)
  • Melhor relação preço-desempenho para ambientes de produção Node.js
  • Tempos de resposta melhorados em todos os nossos endpoints de aplicação

O aumento de desempenho foi tão significativo que agora consideramos os processadores AMD Ryzen essenciais para qualquer implantação de produção séria do Node.js, esteja você executando aplicativos da web, APIs, microsserviços ou qualquer outra carga de trabalho do Node.js.

Para mais detalhes sobre nossas opções de infraestrutura, confira:

Configuração do ambiente de produção Node.js: nossa pilha de tecnologia

Nossas melhores práticas de implantação de produção do Node.js incluem escolhas tecnológicas bem pensadas, baseadas em anos de experiência em produção. Veja o que usamos e por que essas escolhas se aplicam a qualquer aplicação Node.js:

Gerenciador de Pacotes: pnpm para Eficiência de Produção

O que usamos: pnpm (versão fixada)

Escolhemos pnpm em vez de npm e yarn para nossa configuração de ambiente de produção Node.js porque:

  • Tempos de instalação mais rápidos em pipelines de CI/CD
  • Eficiência do espaço em disco por meio de links físicos
  • Resolução de dependência estrita que previne dependências fantasmas
  • Melhor desempenho em implantações de produção

[!NOTA] Como parte das nossas práticas recomendadas de implantação de produção do Node.js, fixamos versões exatas de ferramentas críticas, como o pnpm, para garantir um comportamento consistente em todos os ambientes e máquinas dos membros da equipe.

Detalhes de implementação:

Framework Web: Koa para Produção Moderna de Node.js

O que usamos:

Escolhemos o Koa em vez do Express para nossa infraestrutura de produção Node.js devido ao seu suporte moderno a async/await e à composição mais limpa do middleware. Nosso fundador, Nick Baugh, contribuiu tanto para o Express quanto para o Koa, nos dando uma visão aprofundada de ambos os frameworks para uso em produção.

Esses padrões se aplicam quer você esteja criando APIs REST, servidores GraphQL, aplicativos web ou microsserviços.

Nossos exemplos de implementação:

Processamento de trabalho em segundo plano: Bree para confiabilidade de produção

O que usamos: bree agendador

Criamos e mantemos o Bree porque os agendadores de tarefas existentes não atendiam às nossas necessidades de suporte a threads de trabalho e recursos JavaScript modernos em ambientes de produção Node.js. Isso se aplica a qualquer aplicativo Node.js que precise de processamento em segundo plano, tarefas agendadas ou threads de trabalho.

Nossos exemplos de implementação:

Tratamento de erros: @hapi/boom para confiabilidade da produção

O que usamos: @hapi/boom

Usamos @hapi/boom para respostas de erro estruturadas em todos os nossos aplicativos de produção Node.js. Esse padrão funciona para qualquer aplicativo Node.js que precise de tratamento de erros consistente.

Nossos exemplos de implementação:

Como monitorar aplicativos Node.js em produção

Nossa abordagem para monitorar aplicações Node.js em produção evoluiu ao longo de anos de execução de aplicações em escala. Implementamos o monitoramento em múltiplas camadas para garantir confiabilidade e desempenho para qualquer tipo de aplicação Node.js.

Monitoramento de produção Node.js em nível de sistema

Nossa implementação principal: helpers/monitor-server.js

O que usamos: node-os-utils

Nossos limites de monitoramento de produção (do nosso código de produção atual):

  • Limite de tamanho de heap de 2 GB com alertas automáticos
  • 25% de uso de memória limite de alerta
  • 80% de uso da CPU limiar de alerta
  • 75% de uso do disco limite de alerta

[!AVISO] Esses limites funcionam para nossa configuração específica de hardware. Ao implementar o monitoramento de produção do Node.js, revise nossa implementação monitor-server.js para entender a lógica exata e adaptar os valores à sua configuração.

Monitoramento em nível de aplicativo para produção Node.js

Nossa classificação de erros: helpers/is-code-bug.js

Este auxiliar distingue entre:

  • Erros de código reais que requerem atenção imediata
  • Erros do usuário que são comportamentos esperados
  • Falhas de serviço externo que não podemos controlar

Esse padrão se aplica a qualquer aplicativo Node.js: aplicativos web, APIs, microsserviços ou serviços em segundo plano.

Nossa implementação de registro: helpers/logger.js

Implementamos redação de campo abrangente para proteger informações confidenciais, mantendo recursos de depuração úteis em nosso ambiente de produção Node.js.

Monitoramento específico da aplicação

Nossas implementações de servidor:

Monitoramento de fila: Implementamos limites de fila de 5 GB e tempos limite de 180 segundos para o processamento de solicitações a fim de evitar o esgotamento de recursos. Esses padrões se aplicam a qualquer aplicativo Node.js com filas ou processamento em segundo plano.

Monitoramento de produção do Node.js com verificações de integridade do PM2

Refinamos a configuração do nosso ambiente de produção Node.js com PM2 ao longo de anos de experiência em produção. Nossas verificações de integridade do PM2 são essenciais para manter a confiabilidade em qualquer aplicativo Node.js.

Nosso sistema de verificação de saúde PM2

Nossa implementação principal: jobs/check-pm2.js

Nosso monitoramento de produção do Node.js com verificações de integridade do PM2 inclui:

  • Funciona a cada 20 minutos via agendamento cron
  • Requer no mínimo 15 minutos de tempo de atividade antes de considerar um processo saudável
  • Valida o status do processo e o uso da memória
  • Reinicia automaticamente processos com falha
  • Evita loops de reinicialização por meio de verificação inteligente de saúde

[!CAUTION] For Node.js production deployment best practices, we require 15+ minutes uptime before considering a process healthy to avoid restart loops. This prevents cascading failures when processes are struggling with memory or other issues.

Nossa configuração de produção PM2

Nossa configuração de ecossistema: Estude nossos arquivos de inicialização do servidor para configuração do ambiente de produção Node.js:

Esses padrões se aplicam quer você esteja executando aplicativos Express, servidores Koa, APIs GraphQL ou qualquer outro aplicativo Node.js.

Implantação automatizada do PM2

Implantação do PM2: ansible/playbooks/node.yml

Automatizamos toda a nossa configuração do PM2 por meio do Ansible para garantir implantações de produção consistentes do Node.js em todos os nossos servidores.

Sistema de classificação e tratamento de erros de produção

Uma das nossas práticas recomendadas mais valiosas de implantação de produção do Node.js é a classificação inteligente de erros que se aplica a qualquer aplicativo Node.js:

Nossa implementação isCodeBug para produção

Fonte: helpers/is-code-bug.js

Este auxiliar fornece classificação de erros inteligente para aplicativos Node.js em produção para:

  • Priorize os bugs reais sobre erros do usuário
  • Melhore nossa resposta a incidentes concentrando-se em questões reais
  • Reduzir a fadiga de alerta de erros esperados do usuário
  • Entenda melhor problemas de aplicação vs. gerados pelo usuário

Esse padrão funciona para qualquer aplicativo Node.js, esteja você criando sites de comércio eletrônico, plataformas SaaS, APIs ou microsserviços.

Integração com nosso registro de produção

Nossa integração com o registrador: helpers/logger.js

Nosso registrador usa isCodeBug para determinar níveis de alerta e redação de campos, garantindo que sejamos notificados sobre problemas reais enquanto filtramos o ruído em nosso ambiente de produção Node.js.

Saiba mais sobre nossos padrões de tratamento de erros:

Depuração de desempenho avançada com v8-profiler-next e cpupro

Utilizamos ferramentas avançadas de criação de perfil para analisar snapshots de heap e depurar problemas de OOM (falta de memória), gargalos de desempenho e problemas de memória do Node.js em nosso ambiente de produção. Essas ferramentas são essenciais para qualquer aplicativo Node.js que apresente vazamentos de memória ou problemas de desempenho.

Nossa abordagem de criação de perfil para produção em Node.js

Ferramentas que recomendamos:

  • v8-profiler-next - Para gerar instantâneos de heap e perfis de CPU
  • cpupro - Para analisar perfis de CPU e instantâneos de heap

[!DICA] Usamos o v8-profiler-next e o cpupro juntos para criar um fluxo de trabalho completo de depuração de desempenho para nossos aplicativos Node.js. Essa combinação nos ajuda a identificar vazamentos de memória, gargalos de desempenho e otimizar nosso código de produção.

Como implementamos a análise de instantâneos de heap

Nossa implementação de monitoramento: helpers/monitor-server.js

Nosso monitoramento de produção inclui a geração automática de snapshots de heap quando os limites de memória são excedidos. Isso nos ajuda a depurar problemas de falta de memória (OOM) antes que causem travamentos nos aplicativos.

Principais padrões de implementação:

  • Snapshots automáticos quando o tamanho do heap excede o limite de 2 GB
  • Criação de perfil baseada em sinal para análise sob demanda em produção
  • Políticas de retenção para gerenciar armazenamento de instantâneos
  • Integração com nossos trabalhos de limpeza para manutenção automatizada

Fluxo de trabalho de depuração de desempenho

Estude nossa implementação atual:

Para análise de instantâneo de heap:

  1. Instalar v8-profiler-next para geração de instantâneos
  2. Usar cpupro para analisar os instantâneos gerados
  3. Implementar limites de monitoramento semelhante ao nosso monitor-server.js
  4. Configurar limpeza automatizada para gerenciar o armazenamento de instantâneos
  5. Criar manipuladores de sinais para criação de perfil sob demanda em produção

Para criação de perfil de CPU:

  1. Gerar perfis de CPU durante períodos de alta carga
  2. Analisar com cpupro para identificar gargalos
  3. Foco em caminhos quentes e oportunidades de otimização
  4. Monitorar antes/depois melhorias de desempenho

[!AVISO] Gerar snapshots de heap e perfis de CPU pode afetar o desempenho. Recomendamos implementar a limitação e habilitar a criação de perfil apenas ao investigar problemas específicos ou durante janelas de manutenção.

Integração com nosso monitoramento de produção

Nossas ferramentas de criação de perfil se integram à nossa estratégia de monitoramento mais ampla:

  • Acionamento automático com base nos limites de memória/CPU
  • Integração de alertas quando problemas de desempenho são detectados
  • Análise histórica para monitorar tendências de desempenho ao longo do tempo
  • Correlação com métricas de aplicação para depuração abrangente

Essa abordagem nos ajudou a identificar e resolver vazamentos de memória, otimizar caminhos de código ativos e manter o desempenho estável em nosso ambiente de produção Node.js.

Segurança da infraestrutura de produção do Node.js

Implementamos segurança abrangente para nossa infraestrutura de produção Node.js por meio da automação Ansible. Estas práticas se aplicam a qualquer aplicação Node.js:

Segurança em nível de sistema para produção Node.js

Nossa implementação Ansible: ansible/playbooks/security.yml

Nossas principais medidas de segurança para ambientes de produção Node.js:

  • Troca desabilitada para evitar que dados confidenciais sejam gravados no disco
  • Despejos de núcleo desabilitados para evitar despejos de memória contendo informações confidenciais
  • Armazenamento USB bloqueado para evitar acesso não autorizado a dados
  • Ajuste de parâmetros do kernel tanto para segurança quanto para desempenho

[!AVISO] Ao implementar as práticas recomendadas de implantação de produção do Node.js, desabilitar a troca pode causar interrupções por falta de memória se o seu aplicativo exceder a RAM disponível. Monitoramos o uso de memória cuidadosamente e dimensionamos nossos servidores adequadamente.

Segurança de aplicativos para aplicativos Node.js

Nossa redação do campo de log: helpers/logger.js

Removemos campos confidenciais de logs, incluindo senhas, tokens, chaves de API e informações pessoais. Isso protege a privacidade do usuário e, ao mesmo tempo, mantém os recursos de depuração em qualquer ambiente de produção Node.js.

Automação de Segurança de Infraestrutura

Nossa configuração completa do Ansible para produção do Node.js:

Nosso conteúdo de segurança

Saiba mais sobre nossa abordagem de segurança:

Arquitetura de banco de dados para aplicativos Node.js

Utilizamos uma abordagem de banco de dados híbrido otimizada para nossos aplicativos Node.js. Estes padrões podem ser adaptados para qualquer aplicativo Node.js:

Implementação do SQLite para produção em Node.js

O que usamos:

Nossa configuração: ansible/playbooks/sqlite.yml

Usamos SQLite para dados específicos do usuário em nossos aplicativos Node.js porque ele fornece:

  • Isolamento de dados por usuário/inquilino
  • Melhor desempenho para consultas de usuário único
  • Backup simplificado e migração
  • Complexidade reduzida comparado a bancos de dados compartilhados

Esse padrão funciona bem para aplicativos SaaS, sistemas multilocatários ou qualquer aplicativo Node.js que precise de isolamento de dados.

Implementação do MongoDB para produção em Node.js

O que usamos:

Nossa implementação de configuração: helpers/setup-mongoose.js

Nossa configuração: config/mongoose.js

Usamos o MongoDB para dados de aplicativos em nosso ambiente de produção Node.js porque ele fornece:

  • Esquema flexível para estruturas de dados em evolução
  • Melhor desempenho para consultas complexas
  • Escala horizontal capacidades
  • Linguagem de consulta rica

[!NOTA] Nossa abordagem híbrida otimiza nosso caso de uso específico. Estude nossos padrões reais de uso do banco de dados na base de código para entender se essa abordagem atende às necessidades do seu aplicativo Node.js.

Processamento de trabalho em segundo plano de produção do Node.js

Construímos nossa arquitetura de tarefas em segundo plano com base no Bree para uma implantação confiável do Node.js em produção. Isso se aplica a qualquer aplicativo Node.js que precise de processamento em segundo plano:

Nossa configuração de servidor Bree para produção

Nossa principal implementação: bree.js

Nossa implantação do Ansible: ansible/playbooks/bree.yml

Exemplos de empregos de produção

Monitoramento de saúde: jobs/check-pm2.js

Automação de limpeza: jobs/cleanup-tmp.js

Todos os nossos trabalhos: Navegue em nosso diretório completo de empregos

Esses padrões se aplicam a qualquer aplicativo Node.js que precise:

  • Tarefas agendadas (processamento de dados, relatórios, limpeza)
  • Processamento em segundo plano (redimensionamento de imagens, envio de e-mail, importação de dados)
  • Monitoramento e manutenção da saúde
  • Utilização de threads de trabalho para tarefas que exigem uso intensivo de CPU

Nossos padrões de agendamento de tarefas para produção em Node.js

Estude nossos padrões atuais de agendamento de tarefas em nosso diretório de empregos para entender:

  • Como implementamos o agendamento do tipo cron na produção do Node.js
  • Nossa lógica de tratamento de erros e repetição
  • Como usamos threads de trabalho para tarefas que exigem muita CPU

Manutenção automatizada para aplicações Node.js de produção

Implementamos manutenção proativa para evitar problemas comuns de produção em Node.js. Estes padrões se aplicam a qualquer aplicação Node.js:

Nossa implementação de limpeza

Fonte: jobs/cleanup-tmp.js

Nossa manutenção automatizada para aplicativos de produção Node.js tem como alvo:

  • Arquivos temporários mais de 24 horas
  • Arquivos de log além dos limites de retenção
  • Arquivos de cache e dados temporários
  • Arquivos enviados que não são mais necessários
  • Instantâneos de heap da depuração de desempenho

Esses padrões se aplicam a qualquer aplicativo Node.js que gere arquivos temporários, logs ou dados em cache.

Gerenciamento de espaço em disco para produção Node.js

Nossos limites de monitoramento: helpers/monitor-server.js

  • Limites de fila para processamento em segundo plano
  • 75% de uso do disco limite de alerta
  • Limpeza automática quando os limites são excedidos

Automação de Manutenção de Infraestrutura

Nossa automação Ansible para produção Node.js:

Guia de implementação de implantação de produção do Node.js

Estude nosso código atual para melhores práticas de produção

Comece com estes arquivos-chave para a configuração do ambiente de produção do Node.js:

  1. Configuração: config/index.js
  2. Monitoramento: helpers/monitor-server.js
  3. Tratamento de erros: helpers/is-code-bug.js
  4. Registro: helpers/logger.js
  5. Saúde do processo: jobs/check-pm2.js

Aprenda com nossas postagens de blog

Nossos guias de implementação técnica para produção do Node.js:

Automação de infraestrutura para produção Node.js

Nossos manuais do Ansible para estudo para implantação de produção do Node.js:

Nossos estudos de caso

Nossas implementações empresariais:

Conclusão: Melhores práticas de implantação de produção do Node.js

Nossa infraestrutura de produção Node.js demonstra que os aplicativos Node.js podem atingir confiabilidade de nível empresarial por meio de:

  • Escolhas de hardware comprovadas (AMD Ryzen para otimização de desempenho de núcleo único de 573%)
  • Monitoramento de produção Node.js testado em batalha com limites específicos e respostas automatizadas
  • Classificação inteligente de erros para melhorar a resposta a incidentes em ambientes de produção
  • Depuração de desempenho avançada com v8-profiler-next e cpupro para prevenção de OOM
  • Reforço abrangente da segurança por meio da automação Ansible
  • Arquitetura de banco de dados híbrido otimizado para necessidades de aplicação
  • Manutenção automatizada para evitar problemas comuns de produção do Node.js

Conclusão principal: Estude nossos arquivos de implementação e postagens de blog em vez de seguir práticas recomendadas genéricas. Nossa base de código fornece padrões reais para implantação de produção do Node.js que podem ser adaptados para qualquer aplicativo Node.js — aplicativos web, APIs, microsserviços ou serviços em segundo plano.

Lista completa de recursos para produção do Node.js

Nossos principais arquivos de implementação

Nossas implementações de servidores

Nossa Automação de Infraestrutura

Nossas postagens de blog técnico

Nossos estudos de caso empresariais