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:
- Open het PHP-FPM configuratiebestand met een teksteditor.
- Vind de
request_terminate_timeoutregel. - Stel de waarde in seconden in (bijv.,
request_terminate_timeout = 300voor een 5-minuten timeout). - 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:
- Open het pool configuratiebestand (vaak genaamd
www.conf). - Vind de
request_terminate_timeoutparameter. - Stel de waarde in seconden in voor die specifieke pool.
- 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:
- Open je Nginx configuratiebestand (vaak op
/etc/nginx/nginx.confof in de/etc/nginx/sites-available/map). - Vind het server of location blok.
- Voeg de
fastcgi_read_timeoutrichtlijn 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:
- Vind het server blok voor je website. Het bevindt zich meestal in een bestand in
/etc/nginx/sites-available/. - 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; } - 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:
-
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_timeoutparameter toe of wijzig deze:request_terminate_timeout = 300 - Sla het bestand op.
- Open het PHP-FPM pool configuratiebestand (
-
Wijzig Nginx instellingen:
- Open je Nginx configuratiebestand (
/etc/nginx/nginx.confof/etc/nginx/sites-available/). - Vind het server blok voor je website.
- Voeg de
fastcgi_read_timeoutrichtlijn 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.
- Open je Nginx configuratiebestand (
-
Herstart services om wijzigingen toe te passen:
- Herstart PHP-FPM:
sudo systemctl restart php7.4-fpm - Herstart Nginx:
sudo systemctl restart nginx
- Herstart PHP-FPM:
-
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:
-
Controleer PHP-FPM configuratie:
- Voer
php-fpm -ttuit om het configuratiebestand te testen op syntaxfouten. - Gebruik
php -i | grep max_execution_timeom de max execution time instelling te verifiëren.
- Voer
-
Verifieer Nginx configuratie:
- Voer
nginx -tuit om de Nginx configuratie te testen op syntaxfouten. - Gebruik
curl -Icommando om response headers te controleren en te zien of nieuwe timeout instellingen zichtbaar zijn.
- Voer
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:
-
PHP-FPM logs:
- Controleer
/var/log/php-fpm/error.logvoor PHP-FPM gerelateerde problemen. - Schakel slow log in PHP-FPM configuratie in om trage scripts te volgen.
- Controleer
-
Nginx logs:
- Bekijk
/var/log/nginx/error.logvoor Nginx-specifieke fouten. - Gebruik
nginx-debugvoor meer gedetailleerde logging.
- Bekijk
-
Systeemmonitoring:
- Gebruik
topofhtopom systeembronnen en PHP-FPM processen te monitoren. - Probeer
straceom systeemaanroepen en signalen te traceren.
- Gebruik
Omgaan met Aanhoudende Timeout Problemen
Als timeout problemen aanhouden, onderzoek dan deze gebieden:
-
Database queries:
- Controleer op trage queries met database slow query log.
- Optimaliseer database-indexen en querystructuur.
-
Externe API aanroepen:
- Monitor responstijden van externe services.
- Implementeer timeouts voor API aanroepen om blokkering te voorkomen.
-
Bestandssysteem bewerkingen:
- Controleer op trage disk I/O met tools zoals
iotop. - Overweeg over te stappen naar snellere opslagoplossingen indien nodig.
- Controleer op trage disk I/O met tools zoals
-
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:
- Bronnengebruik consistent hoge niveaus bereikt.
- Optimalisaties de prestaties niet verbeteren.
- 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.





