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

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.