Bij het bezoeken van je website zie je dat de website maar blijft laden en als je maar lang genoeg wacht krijg je de volgende melding:

 

502 bad gateway melding
Wanneer je website een 502 HTTP-status code geeft kan dit meerdere redenen hebben.  De meest voorkomende oorzaak is dat dit komt omdat de PHP processen “vol” zitten door een externe verbinding die blijft hangen.

Best wel een vervelend probleem, maar gelukkig kun je er wel voor zorgen dat de kans kleiner wordt dat je hier tegen aanloopt.

Oorzaak 

Om het probleem te snappen is het belangrijk dat je weet hoe de webserver en PHP verzoeken afhandelen. Overigens is dit niet een specifiek PHP probleem!

Als je website PHP gebruikt dan configureren wij standaard een limiet van het aantal PHP workers, welke gelijktijdig mogen draaien. Deze limiet wordt bepaald op basis van de server specificaties en de type applicatie. Deze limiet is er om je server te beschermen zodat deze niet down gaat bij te grote drukte.

Wanneer een iemand de website bezoekt wordt er een PHP worker in gebruik genomen. Wanneer het verzoek is afgehandeld (vaak binnen 1 sec) komt deze worker weer vrij voor een ander verzoek.

Wanneer je applicatie (bijv. met cURL/Guzzle) een externe endpoint raadpleegt (bijvoorbeeld om weerberichten op te halen) dan is dit normaliter binnen 0,5 seconde klaar, kan je applicatie het verzoek afronden en heeft de bezoeker resultaat op zijn scherm.

Maar stel je nou eens voor dat er problemen zijn bij het bereiken van het endpoint? Je applicatie blijft maar wachten ….. en wachten op antwoord. Het verzoek kan niet worden afgehandeld en de PHP worker blijft bezet.  Vervolgens heb je ook nog eens 40 andere bezoekers met het zelfde probleem. Met als gevolg dat alle beschikbare PHP workers bezet zijn.

Vervolgens kan de webserver zijn aanvragen niet meer kwijt en geeft een 502 terug.

Oplossing

Een echte oplossing is er helaas niet. Ook het ophogen van het aantal workers is geen oplossing, want zolang het onderliggende probleem niet wordt verholpen geldt dat het een kwestie van (weinig) tijd is dat het probleem weer terug is.

Hier een paar handige puntjes waarmee je de impact en kans kan verkleinen:

  • Zorg dat je inzichtelijk hebt welke “cURL” requests worden gedaan in je code en doe dit soort aanvragen wanneer het ook daadwerkelijk nodig is
  • Gebruik APM tooling zoals Newrelic of Datadog; in het geval van problemen zie je gelijk welk endpoint blijft hangen en de opstopping veroorzaakt
  • Een standaard cURL request (vanuit PHP) wordt na 30 seconden afgebroken. Wij adviseren dit om dit te verlagen naar bijv. 5 sec.
  • Zorg voor een noodstop waarmee je tijdelijk verbindingen naar een extern endpoint kunt pauzeren