Load Balancing
Este documento explica como implementar balanceamento de carga para n8n em ambiente de produção, abordando configuração de nginx como proxy reverso, distribuição de requisições entre múltiplas instâncias, health checks automáticos, failover inteligente, e estratégias de alta disponibilidade que garantem performance consistente e tolerância a falhas em implementações empresariais de grande escala.
O que você vai aprender
- Configuração de nginx como load balancer
- Estratégias de distribuição de carga
- Health checks e failover
- Monitoramento de performance
- Configurações de segurança
Por que usar Load Balancing?
Benefícios do Load Balancing
Sem Load Balancing (Instância Única):
- ❌ Ponto único de falha - Se o servidor cair, tudo para
- ❌ Limitação de performance - Apenas um servidor processando
- ❌ Sem escalabilidade - Não pode adicionar servidores
- ❌ Downtime durante manutenção - Atualizações param o serviço
Com Load Balancing (Múltiplas Instâncias):
- ✅ Alta disponibilidade - Falhas não afetam o serviço
- ✅ Performance melhorada - Múltiplos servidores processando
- ✅ Escalabilidade horizontal - Adicione servidores conforme necessário
- ✅ Zero downtime - Manutenção sem interrupção
- ✅ Distribuição inteligente - Carga distribuída automaticamente
Quando Usar Load Balancing
Use load balancing quando:
- Tem muitos usuários simultâneos
- Precisa de alta disponibilidade
- Quer escalabilidade automática
- Processa workflows críticos
- Precisa de manutenção sem downtime
Estratégias de Distribuição
Algoritmos de Balanceamento
Round Robin (Padrão)
upstream n8n_backend {
server n8n-1:5678;
server n8n-2:5678;
server n8n-3:5678;
}
Least Connections
upstream n8n_backend {
least_conn;
server n8n-1:5678;
server n8n-2:5678;
server n8n-3:5678;
}
IP Hash (Sticky Sessions)
upstream n8n_backend {
ip_hash;
server n8n-1:5678;
server n8n-2:5678;
server n8n-3:5678;
}
Weighted Round Robin
upstream n8n_backend {
server n8n-1:5678 weight=3;
server n8n-2:5678 weight=2;
server n8n-3:5678 weight=1;
}
Configuração por Tipo de Tráfego
Distribuição Inteligente
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Upstream para diferentes tipos de tráfego
upstream n8n_api {
least_conn;
server n8n-1:5678 max_fails=3 fail_timeout=30s;
server n8n-2:5678 max_fails=3 fail_timeout=30s;
server n8n-3:5678 max_fails=3 fail_timeout=30s;
}
upstream n8n_webhooks {
ip_hash; # Sticky sessions para webhooks
server n8n-1:5678 max_fails=3 fail_timeout=30s;
server n8n-2:5678 max_fails=3 fail_timeout=30s;
server n8n-3:5678 max_fails=3 fail_timeout=30s;
}
upstream n8n_ui {
round_robin;
server n8n-1:5678 max_fails=3 fail_timeout=30s;
server n8n-2:5678 max_fails=3 fail_timeout=30s;
server n8n-3:5678 max_fails=3 fail_timeout=30s;
}
Configuração Nginx
Configuração Básica
nginx.conf Principal
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
# Configurações básicas
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 100M;
# Gzip compression
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# Rate limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=webhook:10m rate=30r/s;
limit_req_zone $binary_remote_addr zone=ui:10m rate=5r/s;
# Upstream para n8n
upstream n8n_backend {
least_conn;
server n8n-1:5678 max_fails=3 fail_timeout=30s;
server n8n-2:5678 max_fails=3 fail_timeout=30s;
server n8n-3:5678 max_fails=3 fail_timeout=30s;
keepalive 32;
}
# Incluir configurações do site
include /etc/nginx/sites-enabled/*;
}
Configuração do Site
# <ion-icon name="sparkles-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> /etc/nginx/sites-available/n8n
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Redirecionar HTTP para HTTPS
server {
listen 80;
server_name seudominio.com www.seudominio.com;
return 301 https://$server_name$request_uri;
}
# <ion-icon name="settings-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Configuração HTTPS
server {
listen 443 ssl http2;
server_name seudominio.com www.seudominio.com;
# Certificados SSL
ssl_certificate /etc/letsencrypt/live/seudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/seudominio.com/privkey.pem;
# Configurações SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# Security Headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# API endpoints com rate limiting
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://n8n_backend;
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Health check
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
# Webhook endpoints com rate limiting
location /webhook/ {
limit_req zone=webhook burst=50 nodelay;
proxy_pass http://n8n_backend;
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# Timeouts maiores para webhooks
proxy_connect_timeout 120s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
# Health check
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
# Interface de usuário
location / {
limit_req zone=ui burst=10 nodelay;
proxy_pass http://n8n_backend;
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Health check
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
Configuração Avançada
Load Balancing com Health Checks
upstream n8n_backend {
least_conn;
# Servidores com health checks
server n8n-1:5678 max_fails=3 fail_timeout=30s;
server n8n-2:5678 max_fails=3 fail_timeout=30s;
server n8n-3:5678 max_fails=3 fail_timeout=30s;
# Configurações de keepalive
keepalive 32;
keepalive_requests 100;
keepalive_timeout 60s;
}
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Health check endpoint
location /healthz {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
Configuração com Sticky Sessions
# <ion-icon name="git-network-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Para webhooks que precisam de sessão consistente
upstream n8n_webhooks {
ip_hash;
server n8n-1:5678 max_fails=3 fail_timeout=30s;
server n8n-2:5678 max_fails=3 fail_timeout=30s;
server n8n-3:5678 max_fails=3 fail_timeout=30s;
}
# <ion-icon name="code-slash-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Para API e UI que podem ser distribuídas
upstream n8n_api {
least_conn;
server n8n-1:5678 max_fails=3 fail_timeout=30s;
server n8n-2:5678 max_fails=3 fail_timeout=30s;
server n8n-3:5678 max_fails=3 fail_timeout=30s;
}
HAProxy (Alternativa)
Configuração HAProxy
haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 4096
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
option redispatch
retries 3
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Frontend para HTTP
frontend n8n_http
bind *:80
redirect scheme https if !{ ssl_fc }
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Frontend para HTTPS
frontend n8n_https
bind *:443 ssl crt /etc/ssl/certs/n8n.pem
mode http
# ACLs para diferentes tipos de tráfego
acl is_api path_beg /api/
acl is_webhook path_beg /webhook/
acl is_health path /healthz
# Rate limiting
stick-table type ip size 100k expire 30s store http_req_rate(10s)
http-request track-sc0 src
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 10 }
# Roteamento baseado em ACLs
use_backend n8n_webhooks if is_webhook
use_backend n8n_api if is_api
use_backend n8n_ui if !is_api !is_webhook !is_health
use_backend n8n_health if is_health
# <ion-icon name="git-network-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Backend para webhooks (sticky sessions)
backend n8n_webhooks
balance roundrobin
option httpchk GET /healthz
http-check expect status 200
# Servidores
server n8n-1 n8n-1:5678 check maxconn 100 cookie n8n-1
server n8n-2 n8n-2:5678 check maxconn 100 cookie n8n-2
server n8n-3 n8n-3:5678 check maxconn 100 cookie n8n-3
# Configurações de failover
option redispatch
retries 3
timeout connect 5s
timeout server 30s
# <ion-icon name="code-slash-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Backend para API (least connections)
backend n8n_api
balance leastconn
option httpchk GET /healthz
http-check expect status 200
# Servidores
server n8n-1 n8n-1:5678 check maxconn 100
server n8n-2 n8n-2:5678 check maxconn 100
server n8n-3 n8n-3:5678 check maxconn 100
# Configurações de failover
option redispatch
retries 3
timeout connect 5s
timeout server 30s
# <ion-icon name="grid-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Backend para UI (round robin)
backend n8n_ui
balance roundrobin
option httpchk GET /healthz
http-check expect status 200
# Servidores
server n8n-1 n8n-1:5678 check maxconn 100
server n8n-2 n8n-2:5678 check maxconn 100
server n8n-3 n8n-3:5678 check maxconn 100
# Configurações de failover
option redispatch
retries 3
timeout connect 5s
timeout server 30s
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Backend para health check
backend n8n_health
mode http
http-request return status 200 content-type text/plain string "healthy\n"
Health Checks e Failover
Configuração de Health Checks
Endpoint de Health Check
# <ion-icon name="settings-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Configurar endpoint de health check no n8n
N8N_HEALTH_CHECK_ENDPOINT=/healthz
N8N_HEALTH_CHECK_TIMEOUT=5000
N8N_HEALTH_CHECK_INTERVAL=30000
Script de Health Check Avançado
#!/bin/bash
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> advanced-health-check.sh
N8N_HOST="localhost"
N8N_PORT="5678"
HEALTH_ENDPOINT="/healthz"
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar se n8n está respondendo
if curl -f -s --max-time 5 "http://$N8N_HOST:$N8N_PORT$HEALTH_ENDPOINT" > /dev/null; then
echo "OK: n8n está saudável"
exit 0
else
echo "ERROR: n8n não está respondendo"
exit 1
fi
Monitoramento de Failover
Script de Monitoramento
#!/bin/bash
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> monitor-load-balancer.sh
# <ion-icon name="key-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Configurações
BACKEND_SERVERS=("n8n-1" "n8n-2" "n8n-3")
WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
echo "=== Monitoramento do Load Balancer ==="
echo
# <ion-icon name="cloud-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar cada servidor backend
for server in "${BACKEND_SERVERS[@]}"; do
if curl -f -s --max-time 5 "http://$server:5678/healthz" > /dev/null; then
echo "✅ $server: Saudável"
else
echo "❌ $server: Não respondendo"
# Enviar notificação
curl -X POST $WEBHOOK_URL \
-H "Content-type: application/json" \
-d "{\"text\":\"🚨 Servidor $server não está respondendo!\"}"
# Tentar reiniciar o container
docker restart $server
fi
done
echo
# <ion-icon name="grid-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar distribuição de carga
echo "=== Distribuição de Carga ==="
for server in "${BACKEND_SERVERS[@]}"; do
CONNECTIONS=$(docker exec $server netstat -an | grep :5678 | grep ESTABLISHED | wc -l)
echo "$server: $CONNECTIONS conexões ativas"
done
Monitoramento de Performance
Métricas Essenciais
Script de Métricas
#!/bin/bash
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> load-balancer-metrics.sh
echo "=== Métricas do Load Balancer ==="
echo
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Status do nginx
echo "1. Status do Nginx:"
systemctl status nginx --no-pager -l
echo
# <ion-icon name="settings-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Configuração do nginx
echo "2. Configuração do Nginx:"
nginx -t
echo
# <ion-icon name="bug-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Logs de erro recentes
echo "3. Logs de Erro (últimas 10 linhas):"
tail -10 /var/log/nginx/error.log
echo
# <ion-icon name="analytics-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Estatísticas de conexões
echo "4. Estatísticas de Conexões:"
netstat -an | grep :80 | grep ESTABLISHED | wc -l
netstat -an | grep :443 | grep ESTABLISHED | wc -l
echo
# <ion-icon name="grid-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Distribuição de carga
echo "5. Distribuição de Carga:"
for server in n8n-1 n8n-2 n8n-3; do
CONNECTIONS=$(docker exec $server netstat -an | grep :5678 | grep ESTABLISHED | wc -l)
echo "$server: $CONNECTIONS conexões"
done
echo
# <ion-icon name="speedometer-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Performance do nginx
echo "6. Performance do Nginx:"
curl -s http://localhost/nginx_status
Alertas Automáticos
Configuração de Alertas
#!/bin/bash
# <ion-icon name="warning-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> load-balancer-alerts.sh
# <ion-icon name="key-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Configurações
WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
ALERT_THRESHOLD_CONNECTIONS=1000
ALERT_THRESHOLD_ERROR_RATE=5
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar número de conexões
TOTAL_CONNECTIONS=$(netstat -an | grep :443 | grep ESTABLISHED | wc -l)
if [ $TOTAL_CONNECTIONS -gt $ALERT_THRESHOLD_CONNECTIONS ]; then
curl -X POST $WEBHOOK_URL \
-H "Content-type: application/json" \
-d "{\"text\":\"⚠️ Muitas conexões: $TOTAL_CONNECTIONS\"}"
fi
# <ion-icon name="bug-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar taxa de erro
ERROR_RATE=$(tail -100 /var/log/nginx/access.log | grep -E " 5[0-9][0-9] " | wc -l)
if [ $ERROR_RATE -gt $ALERT_THRESHOLD_ERROR_RATE ]; then
curl -X POST $WEBHOOK_URL \
-H "Content-type: application/json" \
-d "{\"text\":\"⚠️ Taxa de erro alta: $ERROR_RATE erros\"}"
fi
Configurações de Segurança
Rate Limiting
Configuração Avançada de Rate Limiting
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Rate limiting por tipo de endpoint
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=webhook:10m rate=30r/s;
limit_req_zone $binary_remote_addr zone=ui:10m rate=5r/s;
limit_req_zone $binary_remote_addr zone=admin:10m rate=2r/s;
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Aplicar rate limiting
location /api/ {
limit_req zone=api burst=20 nodelay;
# ... resto da configuração
}
location /webhook/ {
limit_req zone=webhook burst=50 nodelay;
# ... resto da configuração
}
location /admin/ {
limit_req zone=admin burst=5 nodelay;
# ... resto da configuração
}
Headers de Segurança
Security Headers Avançados
# <ion-icon name="shield-checkmark-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Headers de segurança
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https:; connect-src 'self' https: wss:;" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
Troubleshooting
Problemas Comuns
Load balancer não distribui carga
# <ion-icon name="settings-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar configuração nginx
nginx -t
# <ion-icon name="cloud-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar se os servidores estão respondendo
for server in n8n-1 n8n-2 n8n-3; do
echo "=== $server ==="
curl -I http://$server:5678/healthz
done
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar logs nginx
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
Rate limiting muito restritivo
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar logs de rate limiting
grep "limiting requests" /var/log/nginx/error.log
# <ion-icon name="key-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Ajustar configurações
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Editar /etc/nginx/nginx.conf e aumentar os limites
SSL/TLS não funciona
# <ion-icon name="document-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar certificados
openssl x509 -in /etc/letsencrypt/live/seudominio.com/fullchain.pem -text -noout
# <ion-icon name="settings-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Verificar configuração SSL
nginx -t
# <ion-icon name="git-network-outline" style={{ fontSize: '24px', color: '#ea4b71' }}></ion-icon> Testar conexão SSL
openssl s_client -connect seudominio.com:443 -servername seudominio.com
Checklist de Produção
Configuração
- Load balancer configurado
- Múltiplos backends configurados
- Health checks implementados
- Failover automático testado
- SSL/TLS configurado
Performance
- Rate limiting aplicado
- Gzip compression ativado
- Keepalive configurado
- Timeouts adequados
- Monitoramento ativo
Monitoramento
- Métricas sendo coletadas
- Logs centralizados
- Alertas configurados
- Dashboard de monitoramento
- Backup de configurações
Segurança
- Security headers configurados
- Rate limiting aplicado
- Acesso restrito por IP (se necessário)
- Logs de auditoria ativos
- Certificados SSL válidos
Próximos Passos
Agora que você configurou o load balancing:
- Clustering - Configure clustering para alta disponibilidade
- Performance - Otimize performance do sistema
- Segurança - Configure autenticação avançada
- Backup e Recovery - Implemente estratégias de backup
Configure pelo menos 3 backends para alta disponibilidade real. Monitore a distribuição de carga e ajuste os algoritmos conforme necessário.
Sempre teste o failover em ambiente de desenvolvimento antes de aplicar em produção. Falhas de load balancing podem causar interrupção total do serviço.