PHP-FPM optimaliseren voor betere performance
PHP-FPM (FastCGI Process Manager) is de standaard manier om PHP te draaien op moderne webservers. Een goed geconfigureerde PHP-FPM setup kan het verschil maken tussen een trage en een snelle website. Bij Theory7 zien we regelmatig dat standaard configuraties niet optimaal zijn voor de specifieke workload. In deze handleiding leer je PHP-FPM correct te configureren en optimaliseren voor maximale performance.
Wat is PHP-FPM?
PHP-FPM beheert een pool van PHP worker processen. Wanneer een PHP pagina wordt opgevraagd, handelt een van deze workers het request af. De manier waarop workers worden beheerd bepaalt grotendeels de performance van je website. Dit is cruciaal, vooral voor websites met hoge bezoekersaantallen of intensieve applicaties.
Voordelen van PHP-FPM:
- Betere resource management dan mod_php, waardoor je server efficiƫnter gebruikmaakt van beschikbare middelen.
- Process isolation per website mogelijk, wat de veiligheid en stabiliteit verhoogt.
- Graceful restarts zonder downtime, wat essentieel is voor websites die continu beschikbaar moeten zijn.
- Geavanceerde logging opties, waarmee je beter inzicht krijgt in de prestaties en eventuele problemen.
Pool configuratie
De pool configuratie bepaalt hoeveel PHP processen draaien. Dit bestand vind je meestal op:
/etc/php/8.2/fpm/pool.d/www.conf
Vervang 8.2 door je PHP versie. Het is belangrijk om deze configuratie aan te passen aan de specifieke behoeften van jouw applicatie.
Process Manager modi
PHP-FPM kent drie modi:
- static - Vast aantal workers
pm = static
pm.max_children = 20
Beste voor dedicated servers met voorspelbare load. - dynamic - Schaalt automatisch
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
Beste voor de meeste situaties, vooral bij wisselende bezoekersaantallen. - ondemand - Workers alleen bij requests
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 10s
Beste voor servers met weinig verkeer of beperkt geheugen.
Berekening max_children
De max_children waarde hangt af van je beschikbare geheugen. Het is cruciaal om deze waarde goed te berekenen om overbelasting van je server te voorkomen:
max_children = (Beschikbaar RAM - Overig gebruik) / Gem. PHP proces grootte
Voorbeeld berekening:
- 4 GB RAM server
- 1 GB voor OS en database
- Gem. PHP proces: 50 MB
max_children = 3000 MB / 50 MB = 60
Check het gemiddelde geheugengebruik per PHP proces met het volgende commando:
ps --no-headers -o "rss" -C php-fpm | awk '{ sum+=$1 } END { print sum/NR/1024 " MB" }'
Request limits
Voorkom memory leaks door processen periodiek te verversen. Dit kan je instellen met:
pm.max_requests = 500
Na 500 requests wordt een worker herstart. Dit voorkomt geheugengroei door slecht geschreven code, wat cruciaal is voor de stabiliteit van je applicatie.
php.ini optimalisatie
Naast de pool configuratie is de php.ini ook belangrijk voor de performance van je PHP applicaties.
Memory en execution limits
Stel de memory en execution limits in op basis van de behoeften van je applicatie:
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
Pas deze aan op je applicatie. Bijvoorbeeld, WordPress heeft vaak 256M nodig, terwijl grote imports meer geheugen vereisen.
Upload limits
Stel de upload limieten in om ervoor te zorgen dat je applicatie grote bestanden kan verwerken:
upload_max_filesize = 64M
post_max_size = 64M
max_file_uploads = 20
Let op: post_max_size moet gelijk of groter zijn dan upload_max_filesize.
OPcache configuratie
OPcache slaat gecompileerde PHP code in geheugen op, wat de laadtijd van je applicatie aanzienlijk kan versnellen:
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.validate_timestamps = 1
opcache.fast_shutdown = 1
Voor productie kun je validate_timestamps op 0 zetten voor extra snelheid, maar dan moet je bij code wijzigingen OPcache handmatig legen.
Realpath cache
Om filesystem calls voor include/require statements te verminderen, kun je de realpath cache configureren:
realpath_cache_size = 4M
realpath_cache_ttl = 600
Configuratie toepassen
Na wijzigingen moet je PHP-FPM herstarten om de nieuwe instellingen toe te passen:
# Systemd
sudo systemctl restart php8.2-fpm
# Of voor andere versies
sudo systemctl restart php7.4-fpm
Test of de configuratie geldig is met:
sudo php-fpm8.2 -t
Meerdere pools voor meerdere sites
Voor betere isolatie kun je per website een aparte pool maken. Dit is vooral nuttig voor hostingproviders of ontwikkelaars die meerdere projecten beheren:
sudo cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/mijnsite.conf
Pas aan in mijnsite.conf:
[mijnsite]
user = mijnuser
group = mijnuser
listen = /run/php/php8.2-fpm-mijnsite.sock
Configureer je webserver om de juiste socket te gebruiken per site, zodat elke site zijn eigen resources heeft en beter presteert.
PHP-FPM status monitoren
Activeer de status pagina voor monitoring van je PHP-FPM processen:
pm.status_path = /fpm-status
Configureer je webserver om deze te serveren (alleen lokaal):
location /fpm-status {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
allow 127.0.0.1;
deny all;
}
Troubleshooting
502 Bad Gateway
Dit kan betekenen dat PHP-FPM niet draait of dat de socket verkeerd geconfigureerd is. Controleer de status met:
sudo systemctl status php8.2-fpm
Trage performance
Als je merkt dat de performance traag is, controleer dan of max_children te laag is ingesteld. Dit kun je doen door de logs te bekijken:
sudo tail -f /var/log/php8.2-fpm.log
Zoek naar berichten zoals "server reached max_children" om te zien of je meer workers moet toevoegen.
Memory errors
Als je memory errors tegenkomt, overweeg dan om memory_limit te verhogen of je code te optimaliseren om minder geheugen te verbruiken.
Gerelateerde artikelen
- Server backup strategie
- SSH verbinden vanuit Mac/Linux
- Basis Linux commandos voor hosting
- Server resources monitoren
Hulp nodig?
We staan voor je klaar! Loop je ergens tegenaan of heb je vragen? Ons supportteam helpt je graag persoonlijk verder. Stuur ons een berichtje via het ticketsysteem - we reageren meestal binnen een paar uur en denken graag met je mee.
0 van 0 vonden dit nuttig