1. O que é Rate Limiting
rate limiting em produção. Rate limiting é um mecanismo para controlar a quantidade de requisições que um usuário ou serviço pode fazer em determinado período.
Objetivos principais:
- Evitar abusos e ataques, como DDoS ou brute force.
- Proteger recursos críticos do servidor.
- Garantir qualidade de serviço para todos os usuários.
Exemplo:
- Uma API permite 100 requisições por minuto por IP.
- Se um usuário enviar 150 requisições, 50 serão rejeitadas com HTTP 429 Too Many Requests.
Implementar rate limiting é uma das estratégias mais eficientes para proteger aplicações contra picos inesperados de tráfego ou abuso de APIs. Essa abordagem faz parte de uma mentalidade operacional mais madura, focada em prevenir incidentes antes que eles ocorram. No guia sobre como sair do modo de apagar incêndio na administração de servidores, mostramos como adotar práticas mais proativas na gestão de infraestrutura.
2. Estratégias comuns de Rate Limiting
2.1 Token Bucket (mais flexível)
- Cada usuário tem um “balde” de tokens.
- Cada requisição consome 1 token.
- Tokens são regenerados a uma taxa fixa (ex.: 10 tokens por segundo).
- Permite explosões curtas, desde que haja tokens disponíveis.
2.2 Leaky Bucket (mais constante)
- Requisições entram em um “balde com furos”.
- Saem a uma taxa constante.
- Garante fluxo regular, útil para limitar tráfego em tempo real.
2.3 Fixed Window (simples)
- Conta requisições em intervalos fixos (ex.: minuto ou hora).
- Fácil de implementar, mas pode permitir picos no final da janela.
2.4 Sliding Window (mais precisa)
- Semelhante ao Fixed Window, mas janelas se sobrepõem.
- Evita picos e distribui melhor as requisições.
3. Implementação prática
3.1 Rate limiting em APIs (exemplo com Nginx)
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
server {
location /api/ {
limit_req zone=mylimit burst=10 nodelay;
proxy_pass http://backend;
}
}
}
rate=5r/s→ máximo 5 requisições por segundo por IP.burst=10→ permite até 10 requisições adicionais em um pico.nodelay→ responde imediatamente com 429 se estourar o limite.
3.2 Rate limiting em aplicações (exemplo Node.js / Express)
import rateLimit from 'express-rate-limit';
const apiLimiter = rateLimit({
windowMs: 60 * 1000, // 1 minuto
max: 100, // máximo 100 requisições por IP
standardHeaders: true,
legacyHeaders: false,
message: 'Você excedeu o limite de requisições.'
});
app.use('/api/', apiLimiter);
- Fácil de adicionar a qualquer rota de API.
- Pode ser customizado por usuário, rota ou método HTTP.
3.3 Rate limiting distribuído (Redis / Memcached)
- Para vários servidores, usar memória local não funciona.
- Estratégia comum: armazenar contadores em Redis.
- Permite sincronizar limites de requisições por usuário em múltiplas instâncias.
Exemplo conceitual:
Chave Redis: rate:{user_id}
Valor: contador de requisições
Expiração: 1 minuto
- Incrementa contador a cada requisição.
- Se contador > limite → retorna 429.
4. Boas práticas
- Retorne 429 com Retry-After → informa ao cliente quando tentar novamente.
- Diferencie limites por usuário vs IP → APIs autenticadas podem ter limites maiores.
- Proteja rotas críticas primeiro → login, reset de senha, checkout.
- Evite bloquear serviços internos → limite apenas tráfego externo.
- Monitoramento e alertas → identificar abusos ou falhas de configuração.
5. Exemplos reais de uso
| Serviço | Limite |
|---|---|
| GitHub API | 5000 requisições/hora |
| Twitter API | 300 requisições/15 min |
| Cloudflare | Rate limiting configurável por regra |
| Nginx/Lua | Controla endpoints internos em produção |
Muitos incidentes em produção são causados por sobrecarga inesperada de requisições ou ausência de mecanismos de proteção na aplicação. Implementar controles como rate limiting é uma forma eficiente de evitar incidentes recorrentes e sair do modelo reativo de operação de servidores.
Guia Completo de Rate Limiting em Produção
1. Conceito e Estratégia
Objetivo: proteger APIs e aplicações web de abusos, DDoS e picos inesperados, sem prejudicar usuários legítimos.
Estratégia recomendada em produção:
- Rate limiting por IP (para tráfego público).
- Rate limiting por usuário/conta (para APIs autenticadas).
- Limite diferenciado por endpoint (login, checkout, reset de senha recebem limites mais restritos).
- Rate limiting distribuído (para múltiplos servidores, usando Redis ou Memcached).
2. Nginx: Rate Limiting na Prática
2.1 Configuração básica (single server)
http {
# Define zona de limite por IP
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
listen 80;
server_name suaapi.com;
location /api/ {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://127.0.0.1:3000;
}
}
}
rate=10r/s→ 10 requisições por segundo por IPburst=20→ permite até 20 requisições extras em picosnodelay→ rejeita imediatamente se ultrapassar burst- Retorna HTTP 429 para requisições acima do limite
2.2 Rate Limiting com chaves personalizadas (usuário/rota)
limit_req_zone $http_api_key zone=userlimit:10m rate=5r/s;
location /api/critical/ {
limit_req zone=userlimit burst=5 nodelay;
proxy_pass http://127.0.0.1:3000;
}
- Aqui o limite é por
API Key(ou token no header) em vez de IP. - Permite limites diferenciados para cada cliente.
3. Node.js / Express: Rate Limiting na Aplicação
3.1 Rate limiting básico por IP
import rateLimit from 'express-rate-limit';
const apiLimiter = rateLimit({
windowMs: 1 * 60 * 1000, // 1 minuto
max: 100, // 100 requisições por IP
message: 'Você excedeu o limite de requisições. Tente novamente mais tarde.',
standardHeaders: true,
legacyHeaders: false
});
app.use('/api/', apiLimiter);
3.2 Rate limiting por usuário autenticado (Redis distribuído)
import rateLimit from 'express-rate-limit';
import RedisStore from 'rate-limit-redis';
import Redis from 'ioredis';
const redisClient = new Redis({ host: '127.0.0.1', port: 6379 });
const userLimiter = rateLimit({
store: new RedisStore({ sendCommand: (...args) => redisClient.call(...args) }),
windowMs: 60 * 1000, // 1 minuto
max: 200, // 200 requisições por usuário
keyGenerator: (req) => req.user.id, // limite por ID de usuário
message: 'Limite de requisições por usuário excedido.'
});
app.use('/api/private/', userLimiter);
Vantagem: funciona em multi-server e mantém contagem centralizada no Redis.
4. Monitoramento e Logs
- Nginx logs:
log_format ratelimit '$remote_addr - $status [$time_local] "$request" '
'limit_req_status=$limit_req_status';
access_log /var/log/nginx/access.log ratelimit;
$limit_req_statusindica se a requisição foi limitada (ex: 429).
- Node.js logs:
app.use((req, res, next) => {
res.on('finish', () => {
if(res.statusCode === 429) {
console.warn(`Rate limit hit: ${req.ip} on ${req.originalUrl}`);
}
});
next();
});
- Alertas:
- Configurar alertas se >5% das requisições estiverem retornando 429 → possível ataque ou mal uso.
- Ferramentas: Prometheus + Grafana, ou logs enviados para ELK/Graylog.
5. Boas Práticas
- Endpoints críticos primeiro: login, checkout, reset de senha.
- Use Retry-After: informa aos clientes quando tentar de novo.
- Diferencie limites: usuários autenticados podem ter mais requisições.
- Burst control: permita pequenos picos sem bloquear tráfego legítimo.
- Teste com carga: verifique que o serviço se mantém estável sob limite aplicado.
6. Exemplo de Checklist para Produção
- Nginx configurado com
limit_req - Express com rate limiting básico
- Redis para contagem distribuída
- Logging de requisições limitadas
- Alertas para picos de 429
- Endpoints críticos com limites mais restritos
- Documentação para API clientes (ex: 429 + Retry-After)

FAQ
É o código de resposta que indica que o usuário excedeu o limite de requisições permitido.
Se bem configurado, não. Estratégias como burst control permitem picos curtos sem bloqueio injusto.
Token Bucket: permite picos curtos
Leaky Bucket: mantém fluxo constante, evitando sobrecarga
Redis centraliza contadores, permitindo rate limiting distribuído em múltiplos servidores.
Login, reset de senha, checkout e qualquer rota crítica para segurança ou performance.
Veja Mais:
Sair do Modo Apagar Incêndio em Servidores
Storage em Cloud: NVMe Local vs Compartilhado vs Object Storage
Reduzindo Ruído em Monitoramento de Servidores
SSD NVMe Lento: 9 Causas Comuns e Como Resolver

