Gateway and proxy errors
A proxy or a load balancer (nginx, an AWS ALB) could not get a valid answer from the server behind it, and returned 502, 503 or 504.
Your AWS Application Load Balancer returns 502 Bad Gateway with Server: awselb/2.0. Tell whether the ALB or your app produced it, then fix keep-alive, TLS and deploy causes.
nginx could not open a connection to the backend: nothing listens on that address and port. Check whether the app runs, where it listens, and what proxy_pass points to.
Another process already listens on port 80 or 443, often Apache, a Docker container or a second nginx, so nginx cannot start. Find it with ss, stop it, then start nginx.
Every server in the nginx upstream block was marked unavailable, so nginx returned 502 without trying. Find the errors that marked them down, and the nginx-proxy placeholder.
nginx logs this when the backend drops the connection before sending its response header, and the client gets a 502. Find out what killed the request and fix it.
nginx waited longer than proxy_read_timeout for the backend's response and returned 504 Gateway Time-out. Find the slow route, fix the cause, raise the timeout only where needed.
- 503 Service Unavailable: what it is and how to fix it
Maintenance, overload, nginx ingress, an empty ALB target group or CloudFront: the causes of a 503 and the fix for each.
HTTP status codes
What a status code means, who sends it, and how to fix the request or the server.
- From 200 to 503: the most common HTTP status codes
Every common code from 200 to 504, with what triggers it and how to fix it.
- 401 vs 403: authentication vs permissions
401 means the server does not know who you are, 403 that you are not allowed.
- 404 vs 500: client vs server errors
Why 4xx errors come from the request and 5xx errors from the server.
- Request method 'POST' not supported
The route does not accept POST (HTTP 405): the usual causes and fixes.
- Request method 'GET' not supported
The route only accepts POST: fixes for Spring Boot, Express, Flask and Django.
Server and resource errors
The process was killed or ran out of resources, often the real cause behind a 502.
- OOM killer: find what killed your process
Read the Killed process line in dmesg, understand oom_score and protect critical services.
Cron and scheduled jobs
A scheduled job did not run, ran and failed, or was never installed. Cron says little about any of it.
Your cron job printed something, cron tried to mail it to you, found no mail server and threw it away. Read the output you lost, then send it to a log file or silence it.
A command that works in your terminal is not found when cron runs it. Cron's PATH is /usr/bin:/bin and its shell is /bin/sh: use absolute paths, set PATH, or set SHELL.
Your crontab entry never fires, or fires and does nothing. Check the cron daemon and its log, then the usual suspects: PATH, the % sign, the missing newline, file names in /etc/cron.d.
crontab refused your file because a line does not parse: bad minute, bad hour, bad day-of-week, bad command. Find the line it names and the usual culprits: Quartz syntax, ranges, export.
- Windows Task Scheduler: Last Run Result 0x1, 0x10, 0x41303
Why a task that failed still logs "successfully completed", and what each Last Run Result code means.
- Kubernetes CronJob not running
A pod stuck in Pending that blocks the schedule (JobAlreadyActive), missed start times that are dropped, and the controller's timezone.
- GitHub Actions scheduled workflow not running
Delayed and dropped runs, and schedules disabled after 60 days without activity in public repositories.
- Laravel scheduler not running
The missing schedule:run cron entry, stale overlap locks and thenPing reporting failures as successes.
- Celery beat not running
A beat process that died or runs twice, and periodic tasks that never reach a worker.
- Vercel cron job not running
Production-only crons, Hobby plan precision and CRON_SECRET: why a Vercel cron does not fire.
SSL and certificates
The certificate could not be issued or renewed, or the server serves one that clients refuse.
Let's Encrypt could not validate your domain, so Certbot did not issue or renew the certificate. Read the Type and Detail lines, then fix port 80, the challenge path, DNS or the TXT record.
- How to auto generate SSL certificates on the fly
OpenResty and Let's Encrypt for custom domains, and a wildcard certificate with Certbot.
Is it just you?
Before digging into logs, check whether the site is down for everyone with Is my site down?, which tests a URL from several regions at once. To hear about the next error before your users do, set up uptime monitoring.