← Terug naar kennisbank HOSTING

502 Bad Gateway — wat het betekent en hoe je 'm oplost

Bezoekers krijgen "502 Bad Gateway", soms met de Cloudflare-orange page, soms met "nginx" eronder. De fout zegt iets specifieks: jouw site staat achter een tussenstap (Cloudflare, Nginx-proxy, hosting-load-balancer) en die tussenstap kreeg een onbruikbaar antwoord van je werkelijke server. Anders dan een 500 ligt het probleem dus tussen twee componenten — niet in jouw code zelf. Deze gids legt uit wáár de breuk zit en hoe je 'm fixt.

De foutmelding heeft verschillende verschijningsvormen, allemaal hetzelfde onderliggende probleem:

  • 502 Bad Gateway
  • 502 Bad Gateway nginx
  • HTTP Error 502
  • Error 502 — Bad gateway (Cloudflare-pagina met Ray ID)
  • The proxy server received an invalid response from an upstream server
  • "Web server received an invalid response while acting as a gateway or proxy server"

Wat is een 502 Bad Gateway eigenlijk?

Moderne websites draaien zelden op één enkele machine. De typische opstelling:

Bezoeker → Cloudflare → Hosting Nginx → PHP-FPM → MySQL

Of een vergelijkbare keten. Op elk pijl-punt kan het misgaan, en een 502 betekent: "de partij waar de bezoeker mee praat wist niet wat 't aan moest met wat de partij erachter terugstuurde." Klinkt cryptisch, maar in de praktijk valt het terug op vier scenario's:

  1. De origin-server (jouw hosting) is down of onbereikbaar
  2. PHP-FPM crashte voordat het een response stuurde
  3. De PHP-worker leverde een onvolledige of ongeldige response
  4. De firewall of netwerk-route tussen proxy en origin is gebroken

Onderscheid met andere foutcodes:

  • 500 — applicatie zelf crashte (PHP fatal in code), maar er kwam wel een response. Zie 500 Internal Server Error oplossen
  • 502 — proxy kreeg een ongeldige of geen response van backend
  • 503 — service tijdelijk niet beschikbaar (onderhoud, overload-protectie)
  • 504 — backend reageerde überhaupt niet binnen de timeout. Zie 504 Gateway Timeout oplossen

Stap 1: bepaal of het Cloudflare of je hosting is

Cruciale eerste vraag: zit Cloudflare ertussen, en zo ja, wie geeft de 502?

Test of de origin werkt zonder Cloudflare

Als Cloudflare actief is en de 502 toont, kan dat twee dingen betekenen: Cloudflare zelf heeft moeite, óf je origin is down en Cloudflare meldt dat correct. Test door direct naar je origin te gaan:

# Vervang IP door het echte origin-IP (zie hosting paneel of eerder DNS)
curl -I --resolve jouwsite.nl:443:123.45.67.89 https://jouwsite.nl

Of werk via je /etc/hosts-bestand: voeg tijdelijk toe 123.45.67.89 jouwsite.nl, refresh in browser. Krijg je dan wél de site of een ander soort fout, dan ligt 't aan Cloudflare. Krijg je weer 502 (of een time-out), dan ligt 't aan origin.

Cloudflare status & dashboard

Cloudflare heeft een "Cloudflare Status"-pagina (cloudflarestatus.com) — kijk of er een actieve incident is. In je Cloudflare-dashboard onder Analytics → Network zie je de origin response codes. Als je daar veel 502's binnen krijgt, weet je: origin is de bron.

Stap 2: lees error_log van je origin

Net als bij een 500: het echte verhaal staat in het error_log van je origin-server.

  • cPanel: Metrics → Errors
  • Plesk: Logs → klik domein → Error Log
  • DirectAdmin: Domain Setup → klik domein → Domain logs
  • SSH: tail -100 ~/logs/error_log

Specifiek voor 502 zoek je naar:

  • upstream prematurely closed connection — PHP-FPM worker stopte voordat klaar
  • recv() failed (104: Connection reset by peer) — backend brak verbinding
  • connect() failed (111: Connection refused) — PHP-FPM niet bereikbaar
  • FastCGI sent in stderr — PHP-FPM rapporteerde fatal
  • worker process exited on signal 11 — segfault, vaak door C-extensie of mod_security

De zes meest voorkomende oorzaken

1. PHP-FPM crashte op een fatal error

Een ernstige PHP-fout (memory exhaustion, segmentation fault, syntax-fout) doet de PHP-FPM-worker stuk gaan voordat 'ie z'n response kon afmaken. Nginx wacht en krijgt onverwacht een afgebroken connectie → 502.

Symptoom in error_log: PHP Fatal error direct gevolgd door upstream prematurely closed.

Fix: zoek de PHP-fatal en los die op (zie 500 Internal Server Error oplossen voor het volledige stappenplan). Vaak blijkt 't om een memory-issue te gaan — zie Allowed memory size exhausted oplossen.

2. PHP-FPM workers uitgeput

PHP-FPM heeft een limiet op het aantal gelijktijdige workers (typisch 10-50 op shared hosting). Als alle workers bezet zijn met trage requests en er komt een nieuwe request binnen, geeft Nginx 502 (of 503/504, afhankelijk van config).

Symptoom: 502 verschijnt vooral op piek-momenten of na zware traffic. Komt en gaat met load.

Fix:

  • Op managed hosting: support contacten en vragen of pm.max_children verhoogd kan worden
  • Op je eigen server: in /etc/php-fpm.d/www.conf de pm.max_children verhogen, dan PHP-FPM herstarten
  • Onderzoek wáárom requests zo lang duren — meestal trage queries of externe API-calls. Zie trage WordPress site versnellen
  • Caching activeren voorkomt dat dezelfde dure pagina elke keer opnieuw door PHP gegenereerd wordt

3. Origin-server down of overload

Hosting heeft een storing, je VPS staat uit, of het hele systeem is overweldigd. Cloudflare meldt dan 502 omdat 'ie niets kan bereiken.

Check:

  • Hosting status-pagina (vrijwel elke NL-hoster heeft er één)
  • SSH-toegang werkt nog? Zo ja: top/htop om CPU/memory te zien
  • MySQL nog bereikbaar? mysql -u user -p

Fix: bij hosting-storing alleen wachten en eventueel hoster bellen. Bij overload: te veel traffic, te veel cron-tasks, of een aanval. Zie scenario 5 hieronder.

4. Cloudflare-origin connectie probleem

Cloudflare staat op proxy (oranje wolkje) en wil naar je origin maar kan 'm niet bereiken. Oorzaken:

  • Origin-IP gewijzigd (bijvoorbeeld na hosting-migratie) maar Cloudflare DNS niet bijgewerkt
  • Origin-firewall blokkeert Cloudflare-IP-ranges (typisch na install van een nieuwe firewall-plugin of fail2ban die te streng is)
  • SSL-cert op origin verlopen en je staat op Cloudflare "Full (strict)" mode → Cloudflare weigert connectie
  • HTTPS-poort 443 niet open op origin terwijl Cloudflare via HTTPS verbindt

Fix: in Cloudflare → Audit Log zien welk origin-IP Cloudflare gebruikt. Controleer dat IP op je hosting. Whitelist Cloudflare-IP-ranges in firewall (lijst is te vinden op cloudflare.com/ips).

5. Bot- of DDoS-aanval die resources opeet

Server functioneert technisch, maar wordt zo zwaar belast dat legit requests geen worker meer krijgen → 502 voor iedereen.

Diagnose: access_log filteren op IP-frequentie. Top-10 IPs en User-Agents:

awk '{print $1}' ~/logs/access_log | sort | uniq -c | sort -rn | head -10
awk -F'"' '{print $6}' ~/logs/access_log | sort | uniq -c | sort -rn | head -10

Zie je één IP met duizenden requests, of een verdachte User-Agent — daar is je bron.

Fix: blokkeren via .htaccess, fail2ban, of Cloudflare WAF-rule. Bij echte DDoS: hosting support inschakelen, eventueel Cloudflare Pro voor geavanceerdere protectie.

6. Anti-virus / mod_security blokkeert PHP-output

Sommige hosters draaien server-side anti-virus (ImunifyAV, Maldet) of WAF (ModSecurity) die specifieke PHP-output verdacht vinden en de connectie afbreken. Resultaat: PHP-FPM levert correct af, maar de tussenlaag knipt de response weg → Nginx ziet een ongeldige response → 502.

Symptoom: 502 alleen op specifieke pagina's, en in error_log meldingen van ModSecurity of vergelijkbaar.

Fix: hosting support vragen om de specifieke regel uit te schakelen of een whitelist toe te voegen voor die URL.

Specifieke scenario's

502 alleen op /wp-admin/ of bij plugin-acties

Backend werkt, frontend werkt — maar admin-acties (plugin installeren, theme activeren, bulk-edit) crashen met 502. Vrijwel altijd: PHP-FPM-worker timeout of memory exhausted op een lange admin-actie. Verhoog de timeouts en memory-limit voor admin (WP_MAX_MEMORY_LIMIT).

502 sinds gisteren — niets veranderd

Hosting-side update is de meest waarschijnlijke oorzaak. Hosters updaten regelmatig PHP, Nginx of OS-componenten. Check hosting changelog of status-pagina, of neem contact op met support — vaak wordt het binnen uren door hen erkend en gefixt.

502 alleen voor Cloudflare-bezoekers, niet als je via VPN/IP komt

Origin werkt prima, maar Cloudflare-IPs worden geblokkeerd door je firewall of door een rate limit. Whitelist Cloudflare-IP-ranges (officiële lijst op cloudflare.com/ips).

Snelle diagnose-checklist

  1. Hosting status-pagina checken — actieve storing?
  2. Cloudflare-status (cloudflarestatus.com) als je Cloudflare gebruikt
  3. Test origin direct (curl met --resolve, of via /etc/hosts) om Cloudflare uit te sluiten
  4. Open error_log van origin — zoek naar "upstream prematurely closed", "FastCGI", "worker process exited"
  5. PHP-fatal in log? Los onderliggend op — zie 500-artikel
  6. Memory-fout in log? Zie memory-artikel
  7. Komt 502 op piekmomenten? PHP-FPM-workers waarschijnlijk uitgeput
  8. access_log analyseren op IP/UA-frequentie — bot-aanval?
  9. Recent SSL gewijzigd of cert verlopen? Cloudflare-mode mismatch?
Belangrijk: de 502-melding zelf bevat soms een Ray ID (Cloudflare) of een server-naam (Nginx). Schrijf die op voordat je gaat zoeken — bij hosting-support is dat de identifier waarmee zij in hun logs kunnen kijken. Zonder die context zoeken ze naar een speld in een hooiberg.

Wanneer schakel je hulp in?

  • 502 keert intermittent terug en je vindt geen patroon in error_log of access_log
  • Cloudflare aan, origin lijkt te werken, maar 502 blijft komen — vaak Cloudflare-config-issue
  • Verhoging van workers/memory/timeouts maskeert het probleem maar lost niets op
  • Mogelijk DDoS — vraagt om snelle WAF-rules en eventueel Cloudflare-tuning
  • Net een migratie of SSL-installatie en alle bezoekers krijgen 502
  • WooCommerce-shop, betaal-callback krijgt 502 en orders blijven hangen
  • Hosting zegt "wij zien niks", maar bezoekers krijgen wél 502 — onafhankelijke diagnose nodig

Een 502 is in 70% van de gevallen een PHP-fatal of een resource-uitputting op de origin — diepte-info staat in error_log. In de overige 30% gaat 't om Cloudflare-origin-mismatches, firewalls die Cloudflare blokkeren, of WAF-regels die te streng staan. De stappen hierboven dekken vrijwel alles wat ik in de praktijk tegenkom — voor de uitschieters helpt iemand met dagelijkse ervaring sneller dan trial-and-error.