Já perdi noites de sono porque um serviço web travou em silêncio atrás do proxy e eu só fiquei sabendo meia hora depois, quando o primeiro usuário me mandou mensagem reclamando. Esse é o perigo de colocar uma aplicação atrás da Cloudflare: para quem olha de fora, o DNS continua respondendo rápido e a CDN entrega uma tela com Error 521 (Web Server is Down) ou Error 522 (Connection Timed Out). O visitante vê o erro, mas o seu servidor não recebe nenhuma conexão nova.
Para não depender do aviso de clientes, configurei rotinas automatizadas de checagem. A Cloudflare tem uma ferramenta nativa para isso, chamada Health Checks. Neste guia, mostro como ela funciona, o que muda entre os planos e como montei uma alternativa gratuita usando Cloudflare Workers e um endpoint estático no Nginx.
Como funcionam os Health Checks da Cloudflare#
Ao contrário de rodar um script de monitoramento dentro da própria VPS ou disparar um ping de uma única máquina de testes, os Health Checks da Cloudflare rodam nos datacenters da rede global. Eles enviam requisições periódicas para o hostname ou IP da origem.
As vantagens práticas dessa abordagem:
- Monitoramento de origens individuais: não exige contratar o módulo de Load Balancing. Posso monitorar um único servidor dedicado ou VPS.
- Parâmetros granulares: defino protocolo (HTTP, HTTPS ou TCP), porta, caminho exato da URI (como
/healthz), método HTTP e a lista de códigos aceitos (geralmente200). - Visibilidade de latência regional: o painel de Health Check Analytics mostra o tempo de resposta separado por continentes e regiões geográficas, facilitando identificar rotas congestionadas antes de o site cair de vez.
- Diagnóstico imediato do tipo de falha: quando o servidor falha, o log registra o motivo técnico exato, seja timeout, conexão recusada, erro de TLS ou código HTTP inesperado.
O banho de água fria do plano Free e o Passive Monitoring#
Quando abri o painel da Cloudflare pela primeira vez para configurar uma checagem ativa, encontrei a primeira barreira comercial:
| Recurso | Plano Free | Plano Pro | Business / Enterprise |
|---|---|---|---|
| Standalone Health Checks | 0 inclusos | 10 inclusos | 50 a 1.000 inclusos |
| Intervalo mínimo | N/A | 60 segundos | 10 a 15 segundos |
| Passive Origin Monitoring | Sim | Sim | Sim |
| Notificações por E-mail | Sim | Sim | Sim |
Os Health Checks ativos e configuráveis custam a partir do plano Pro (US$ 20 a 25 mensais por domínio). No plano Free, a cota de verificações ativas avulsas é zero.
O que o plano Free tem: Passive Origin Monitoring#
Mesmo sem pagar a mensalidade Pro, dá para usar o Passive Origin Monitoring. Em vez de ficar fazendo requisições sintéticas a cada minuto, a Cloudflare observa o tráfego dos seus visitantes reais. Se a taxa de erros 521, 522 ou 524 subir acima do padrão, a plataforma envia um e-mail de aviso.
Para ativar esse recurso gratuito:
- No menu principal da conta, acesse Notifications.
- Clique em Add e procure por Passive Origin Monitoring.
- Escolha a sua zona e cadastre o e-mail que deve receber os alertas.
Criando um endpoint leve no Nginx (/healthz)#
Um erro comum que vejo em monitoramento é apontar a sonda para a página inicial (/) ou para um script PHP pesado (como o index.php do WordPress). Fazer uma requisição a cada 60 segundos nessas rotas obriga o servidor a carregar extensões, abrir conexões com o banco de dados e gastar CPU à toa.
Para evitar esse desperdício, configurei um endpoint estático direto no arquivo do Nginx:
# Health check estatico ultra-leve (sem passar por PHP ou MySQL)
location = /healthz {
access_log off;
default_type text/plain;
return 200 "OK\n";
}
O ganho prático aqui é duplo:
access_log off;: o Nginx não grava essas requisições nos arquivos de log, evitando inflar discos com dezenas de milhares de linhas inúteis por mês.return 200 "OK\n";: a resposta é entregue em menos de 1 milissegundo direto da memória, sem tocar no socket do PHP-FPM.
Depois de alterar, basta testar a configuração e recarregar o Nginx:
nginx -t && systemctl reload nginx
A alternativa gratuita: Worker com Cron Trigger#
Se você está no plano Free e quer a certeza de uma checagem ativa a cada 60 segundos (sem depender de tráfego de visitantes reais), a saída mais limpa é criar um Cloudflare Worker com agendamento por Cron Trigger.
O Worker roda na borda da própria Cloudflare, faz uma requisição HTTP rápida para o /healthz e, se o servidor falhar ou estourar o timeout, dispara um Webhook para o Discord ou Telegram.
O código do Worker (worker.js)#
export default {
async scheduled(event, env, ctx) {
const TARGET_URL = "https://perciocastelo.com.br/healthz";
const WEBHOOK_URL = env.ALERT_WEBHOOK_URL;
const TIMEOUT_MS = 5000;
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);
try {
const response = await fetch(TARGET_URL, {
method: "GET",
headers: { "User-Agent": "Cloudflare-Worker-Probe/1.0" },
signal: controller.signal
});
clearTimeout(timeoutId);
if (response.status !== 200) {
await notifyAlert(WEBHOOK_URL, `ORIGEM FORA DO AR: HTTP status ${response.status}`);
}
} catch (err) {
clearTimeout(timeoutId);
const isTimeout = err.name === "AbortError";
const errorMsg = isTimeout
? `TIMEOUT: Origem nao respondeu em ${TIMEOUT_MS / 1000}s.`
: `FALHA DE REDE: ${err.message}`;
await notifyAlert(WEBHOOK_URL, `ALERTA CRITICO: ${errorMsg}`);
}
}
};
async function notifyAlert(webhookUrl, message) {
if (!webhookUrl) return;
await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
content: `[Monitor de Origem] ${message} - ${new Date().toISOString()}`
})
});
}
Configurando o agendamento no wrangler.toml#
Para rodar o script a cada minuto:
name = "origin-health-probe"
main = "src/index.js"
compatibility_date = "2026-09-24"
[triggers]
crons = ["* * * * *"]
Um minuto de intervalo gera cerca de 43.200 execuções mensais, bem abaixo do teto gratuito de 100.000 requisições por dia que a Cloudflare oferece no plano Free de Workers.
Passo a passo no plano Pro (Interface Nativa)#
Para quem tem conta Pro ou Business e quer usar a interface oficial:
- No painel do domínio, acesse Traffic e clique em Health Checks.
- Clique no botão Create Health Check.
- Preencha os parâmetros:
- Name:
Origin-Healthz - Path:
/healthz - Protocol:
HTTPS - Port:
443 - Expected response codes:
200 - Interval:
60segundos - Retries:
2(evita alarmes falsos por oscilações rápidas) - Timeout:
5segundos
- Salve e avance para a etapa de notificações para cadastrar os e-mails ou webhooks de alerta.
Conclusão#
Você não precisa gastar 20 dólares mensais só para saber se o seu servidor web caiu. O monitoramento passivo nativo da Cloudflare cobre o tráfego real sem custo, e uma sonda simples via Worker com Cron Trigger resolve as checagens ativas por minuto com alerta direto no celular.
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários