Hoe PHP-FPM en Nginx Time-out Limieten te Verhogen?

Gepubliceerd 25 juli 2024

Probleem: PHP-FPM en Nginx Timeout Limieten

Timeout limieten in PHP-FPM en Nginx kunnen problemen veroorzaken bij het verwerken van lange scripts of het afhandelen van grote bestandsuploads. Deze standaardinstellingen kunnen leiden tot verbindingstimeouts, wat resulteert in onvoltooide bewerkingen en foutmeldingen voor websitebezoekers.

Configureren van PHP-FPM Timeout Instellingen

Wijzigen van PHP-FPM Configuratiebestand

Het PHP-FPM configuratiebestand bevindt zich meestal op /etc/php/[versie]/fpm/php-fpm.conf. Om de timeout instellingen te wijzigen, pas je de request_terminate_timeout parameter aan. Deze parameter stelt de maximale tijd in dat een script kan draaien voordat PHP-FPM het stopt.

Om deze parameter in te stellen:

  1. Open het PHP-FPM configuratiebestand met een teksteditor.
  2. Vind de request_terminate_timeout regel.
  3. Stel de waarde in seconden in (bijv., request_terminate_timeout = 300 voor een 5-minuten timeout).
  4. Als de regel ontbreekt, voeg deze dan toe aan het bestand.

Tip: Backup Maken Voor Het Bewerken

Voordat je wijzigingen aanbrengt in je PHP-FPM configuratiebestand, maak je een backup. Hierdoor kun je wijzigingen terugdraaien indien nodig. Gebruik dit commando:

sudo cp /etc/php/[versie]/fpm/php-fpm.conf /etc/php/[versie]/fpm/php-fpm.conf.backup

Aanpassen van PHP-FPM Pool Instellingen

PHP-FPM pools zijn groepen PHP-processen die verzoeken afhandelen. Elke pool kan zijn eigen configuratie hebben, inclusief timeout instellingen. De pool configuratiebestanden bevinden zich meestal in /etc/php/[versie]/fpm/pool.d/.

Om pool-specifieke timeout instellingen te wijzigen:

  1. Open het pool configuratiebestand (vaak genaamd www.conf).
  2. Vind de request_terminate_timeout parameter.
  3. Stel de waarde in seconden in voor die specifieke pool.
  4. Als de parameter ontbreekt, voeg deze dan toe aan het bestand.

Configureren van Nginx Timeout Instellingen

Instellen van Nginx Fastcgi Timeout

De fastcgi_read_timeout richtlijn regelt hoe lang Nginx wacht tot PHP-FPM een verzoek verwerkt. Deze instelling helpt 504 Gateway Timeout fouten te voorkomen wanneer scripts lang duren om te draaien.

Om de fastcgi_read_timeout in Nginx in te stellen:

  1. Open je Nginx configuratiebestand (vaak op /etc/nginx/nginx.conf of in de /etc/nginx/sites-available/ map).
  2. Vind het server of location blok.
  3. Voeg de fastcgi_read_timeout richtlijn toe of wijzig deze:
    fastcgi_read_timeout 300s;

    Dit stelt de timeout in op 300 seconden (5 minuten).

Tip: Pas Timeout Aan Op Basis Van Script Vereisten

Houd rekening met je specifieke applicatiebehoeften bij het instellen van de fastcgi_read_timeout. Voor scripts die grote hoeveelheden data verwerken of complexe bewerkingen uitvoeren, moet je deze waarde mogelijk verhogen. Monitor de prestaties van je applicatie en pas deze dienovereenkomstig aan.

Wijzigen van Nginx Server Blok

Om de timeout instellingen toe te passen, wijzig je het server blok in je Nginx configuratie:

  1. Vind het server blok voor je website. Het bevindt zich meestal in een bestand in /etc/nginx/sites-available/.
  2. Zoek het PHP verwerkingslocatie blok, dat er vaak zo uitziet:
    location ~ \.php$ {
       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
    }
  3. Voeg de timeout instellingen toe aan dit location blok:
    location ~ \.php$ {
       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
       fastcgi_read_timeout 300s;
    }

Implementeren van de Oplossing

Stapsgewijze Handleiding om Timeout Limieten te Verhogen

Om timeout limieten voor PHP-FPM en Nginx te verhogen, volg je deze stappen:

  1. Bewerk de PHP-FPM configuratie:

    • Open het PHP-FPM pool configuratiebestand (/etc/php/[versie]/fpm/pool.d/www.conf) met een teksteditor.
    • Voeg de request_terminate_timeout parameter toe of wijzig deze:
      request_terminate_timeout = 300
    • Sla het bestand op.
  2. Wijzig Nginx instellingen:

    • Open je Nginx configuratiebestand (/etc/nginx/nginx.conf of /etc/nginx/sites-available/).
    • Vind het server blok voor je website.
    • Voeg de fastcgi_read_timeout richtlijn toe of werk deze bij in het PHP verwerkingslocatie blok:
      location ~ \.php$ {
       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
       fastcgi_read_timeout 300s;
      }
    • Sla het bestand op.
  3. Herstart services om wijzigingen toe te passen:

    • Herstart PHP-FPM:
      sudo systemctl restart php7.4-fpm
    • Herstart Nginx:
      sudo systemctl restart nginx
  4. Test de nieuwe configuratie:

    • Voer een script uit dat langer duurt dan de standaard timeout om er zeker van te zijn dat het zonder fouten voltooid wordt.
    • Controleer je error logs op eventuele timeout-gerelateerde problemen.

Oplossen van Veelvoorkomende Problemen

Verifiëren van Configuratiewijzigingen

Om te controleren of je nieuwe instellingen zijn toegepast:

  1. Controleer PHP-FPM configuratie:

    • Voer php-fpm -tt uit om het configuratiebestand te testen op syntaxfouten.
    • Gebruik php -i | grep max_execution_time om de max execution time instelling te verifiëren.
  2. Verifieer Nginx configuratie:

    • Voer nginx -t uit om de Nginx configuratie te testen op syntaxfouten.
    • Gebruik curl -I commando om response headers te controleren en te zien of nieuwe timeout instellingen zichtbaar zijn.

Tip: Verifieer PHP-FPM Pool Configuratie

Om te controleren of je PHP-FPM pool configuratie correct is, gebruik je het volgende commando:

php-fpm -d --fpm-config=/etc/php-fpm.d/www.conf

Dit commando toont eventuele configuratiefouten in je pool bestand.

Debugging tools voor PHP-FPM en Nginx:

  1. PHP-FPM logs:

    • Controleer /var/log/php-fpm/error.log voor PHP-FPM gerelateerde problemen.
    • Schakel slow log in PHP-FPM configuratie in om trage scripts te volgen.
  2. Nginx logs:

    • Bekijk /var/log/nginx/error.log voor Nginx-specifieke fouten.
    • Gebruik nginx-debug voor meer gedetailleerde logging.
  3. Systeemmonitoring:

    • Gebruik top of htop om systeembronnen en PHP-FPM processen te monitoren.
    • Probeer strace om systeemaanroepen en signalen te traceren.

Omgaan met Aanhoudende Timeout Problemen

Als timeout problemen aanhouden, onderzoek dan deze gebieden:

  1. Database queries:

    • Controleer op trage queries met database slow query log.
    • Optimaliseer database-indexen en querystructuur.
  2. Externe API aanroepen:

    • Monitor responstijden van externe services.
    • Implementeer timeouts voor API aanroepen om blokkering te voorkomen.
  3. Bestandssysteem bewerkingen:

    • Controleer op trage disk I/O met tools zoals iotop.
    • Overweeg over te stappen naar snellere opslagoplossingen indien nodig.
  4. Geheugengebruik:

    • Monitor PHP geheugengebruik met tools zoals New Relic of Blackfire.
    • Verhoog PHP geheugenlimiet als scripts de limiet bereiken.

Overweeg server opschaling of code optimalisatie wanneer:

  1. Bronnengebruik consistent hoge niveaus bereikt.
  2. Optimalisaties de prestaties niet verbeteren.
  3. Verkeersgroei de huidige servercapaciteit overtreft.

Voor code optimalisatie:

  • Gebruik profiling tools om knelpunten te identificeren.
  • Refactor code om efficiëntie te verbeteren.
  • Implementeer caching strategieën om verwerkingstijd te verminderen.

Voor server opschaling:

  • Overweeg verticale opschaling (verhogen van serverbronnen).
  • Verken horizontale opschaling (toevoegen van meer servers).
  • Bekijk load balancing oplossingen om verkeer te verdelen.

Example: Implementeren van Caching voor Prestatieverbetering

Om verwerkingstijd te verminderen en prestaties te verbeteren, implementeer je Redis caching:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$key = 'user_data_' . $user_id;
$cached_data = $redis->get($key);

if ($cached_data === false) {
    // Data niet in cache, ophalen uit database
    $data = fetchUserDataFromDatabase($user_id);

    // Opslaan in cache voor toekomstig gebruik
    $redis->set($key, serialize($data), 3600); // Cache voor 1 uur
} else {
    $data = unserialize($cached_data);
}

Dit voorbeeld laat zien hoe je Redis caching implementeert om gebruikersdata op te slaan en op te halen, waardoor database belasting wordt verminderd en responstijden worden verbeterd.