Wat is PHP-FPM | PHP-FPM installeren en instellen
PHP-FPM is een FastCGI-procesmanager waarbij vooraf gestarte worker-processen de PHP-verzoeken ontvangen die een webserver doorgeeft en die afhandelen. Op een AlmaLinux 9-server waarop Apache draait, controleert deze gids of het is geïnstalleerd en hoe de pools en sockets per site zijn ingesteld, en loopt daarna door tot de configuratietest en de statuscontrole met echte uitvoer.
Apache kan PHP ook rechtstreeks uitvoeren met mod_php, maar als je het aan PHP-FPM overdraagt, zijn webserver en PHP gescheiden. Nginx kan PHP niet rechtstreeks uitvoeren en geeft verzoeken daarom door aan een FastCGI-proces zoals PHP-FPM. Daarom kan één PHP-FPM aan zowel Apache als Nginx worden gekoppeld. De poolinstellingen en de socketstructuur hieronder gelden ongewijzigd ook als je PHP-FPM met Nginx verbindt.
1️⃣ Wat PHP-FPM is: het verschil tussen CGI en FastCGI
CGI (Common Gateway Interface) is de standaardmanier waarop een webserver een extern programma uitvoert om dynamische inhoud te maken, en het programma wordt bij elk verzoek opnieuw gestart. De kosten van het aanmaken en weer verwijderen van een proces per verzoek lopen op, zodat de server trager antwoordt naarmate er meer bezoek komt.
FastCGI neemt die kosten weg door het programma vooraf te starten en verzoeken na elkaar af te handelen. Het is het verschil tussen een computer die je bij elk gebruik aan- en uitzet en een computer die al aanstaat en meteen bruikbaar is. PHP-FPM (FastCGI Process Manager) is de manager die PHP via FastCGI laat draaien, en het zit in PHP sinds versie 5.3.3.
PHP-FPM start per pool, een groep workers, vooraf een vast aantal workers; een vrije worker ontvangt een verzoek dat de webserver via de socket doorgeeft, handelt het af en wacht op het volgende. Statische bestanden zoals afbeeldingen en CSS beantwoordt de webserver zelf, en alleen PHP-bestanden gaan naar PHP-FPM. Alleen de manier waarop de webserver verzoeken aan de socket doorgeeft verschilt: Apache gebruikt de module mod_proxy_fcgi en Nginx gebruikt de instelling fastcgi_pass.
2️⃣ PHP-FPM installeren: het pakket controleren en installeren met dnf
Als je PHP met dnf hebt geïnstalleerd op een server uit de RHEL-familie, is het pakket php-fpm daarmee meegeïnstalleerd. Controleer eerst met rpm of het is geïnstalleerd. De installatie van PHP verloopt hetzelfde als bij APM installeren op Rocky Linux.
rpm -qa | grep php-fpmphp-fpm-8.3.36-1.module_php.8.3.el9.remi.x86_64Als de uitvoer leeg is, is het niet geïnstalleerd; installeer het dan met dnf.
dnf -y install php-fpmAls de installatie klaar is, controleer je met hetzelfde rpm-commando nog eens of de pakketnaam wordt weergegeven.
3️⃣ PHP-FPM instellen: de pool www.conf, de socket en de statische en dynamische modus
Er zijn twee configuratiebestanden: de algemene configuratie [/etc/php-fpm.conf] en de poolconfiguratie [/etc/php-fpm.d/www.conf]. De regels die je in de standaardpool www.conf het eerst bekijkt, zijn listen en pm, en de waarden direct na de installatie zijn als volgt.
grep -E '^(listen|pm) ' /etc/php-fpm.d/www.conflisten = /run/php-fpm/www.sock
pm = dynamiclisten is de plek waar de webserver verzoeken aan doorgeeft, en de standaardwaarde in versie 8.3 is de Unix-socket [/run/php-fpm/www.sock]. De standaardwaarde van oudere versies, [127.0.0.1:9000], ontvangt verzoeken via een TCP-poort. Binnen dezelfde server is een socket lichter omdat de verbindingsstap via een poort wegvalt, en met listen.owner en listen.group kun je de toegang beperken zoals bij bestandsrechten.
🔲 De statische en dynamische modus instellen
pm bepaalt hoe workers worden gestart, en je zet het op static, dynamic of ondemand. De statische modus houdt altijd het aantal aan dat in pm.max_children staat, en de instelling hieronder houdt 100 workers aan.
pm = static
pm.max_children = 100De dynamische modus is de standaard en verhoogt of verlaagt het aantal workers met het aantal verzoeken. De instelling hieronder start er bij het opstarten 12, houdt 6 tot 18 vrije workers aan en groeit tot maximaal 120.
pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18De modus ondemand start workers alleen als er een verzoek komt en beëindigt ze zodra pm.process_idle_timeout is verstreken; hij past dus bij sites met weinig bezoek en niet bij drukke sites.
De drie modi verschillen in wanneer ze workers starten en hoe het aantal oploopt of daalt.
| Modus | Hoe workers worden gestart | Geschikte sites |
|---|---|---|
| static (statisch) | Houdt altijd het aantal aan dat in pm.max_children staat | Sites met veel bezoek |
| dynamic (dynamisch) | Standaard · loopt op of daalt binnen pm.start_servers, pm.min_spare_servers en pm.max_spare_servers naargelang het aantal verzoeken | Sites waarvan het bezoek schommelt |
| ondemand | Start alleen als er een verzoek komt en eindigt zodra pm.process_idle_timeout is verstreken | Sites met weinig bezoek |
max_children bepaal je door het servergeheugen te delen door het geheugen dat één worker gebruikt. Ook als waarschuwingen over [max_children] zich opstapelen, verhoog je het niet meteen, maar zoek je in de logs eerst uit welke verzoeken de workers hebben gevuld.
Geheugen en uploadlimiet stel je in php.ini in, de algemene PHP-configuratie, en je past ze samen met het aantal workers aan op de site die je beheert.
memory_limit = 1024M
post_max_size = 128M
upload_max_filesize = 128MDe drie waarden zijn de geheugenlimiet voor één PHP-script en de bestandsgrootte die je in één keer kunt uploaden, en ze gelden pas nadat je PHP-FPM hebt herstart.
🔲 Een pool per siteaccount instellen
Bij meerdere sites deel je niet één www.conf, maar maak je per account een poolbestand aan en scheid je het uitvoeringsaccount en de socket. De PHP van de ene site kan dan de bestanden van een ander account niet lezen, en het aantal workers wordt per site bepaald.
vi /etc/php-fpm.d/siteuser.confIn het bestand zet je de poolnaam, het uitvoeringsaccount, het socketpad en het aantal workers.
[siteuser]
user = siteuser
group = nobody
listen = /run/php-fpm/siteuser.sock
listen.owner = siteuser
listen.group = nobody
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
chdir = /home/siteuser/wwwlisten.owner en listen.group zijn de eigenaar en de groep van het socketbestand, en PHP-FPM maakt de socket bij het opstarten met deze waarden aan. Draait de webserver onder het account nobody, vul dan nobody in bij listen.group; bij het account apache vul je apache in, zodat de webserver de socket kan openen.
listen.owner = siteuser
listen.group = nobody
listen.mode = 0660Deze drie regels staan in elk poolbestand, en na het wijzigen van de waarden moet je herstarten zodat de socket opnieuw met de nieuwe rechten wordt aangemaakt.
🔲 slowlog instellen
slowlog is een bestand dat vastlegt waar verzoeken die langer duurden dan request_slowlog_timeout bezig waren, en bij de waarde 0 wordt niets vastgelegd. Als je de oorzaak van trage verzoeken zoekt, zet je het aan door een tijd in seconden in te stellen, zoals 3s.
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 0In het vastgelegde bestand blijven het scriptpad van het trage verzoek en de functie die op dat moment draaide bewaard, zodat je kunt zien welke plugin of code de tijd kostte.
4️⃣ Koppeling met Apache: VirtualHost-instellingen en socketrechten
Apache geeft verzoeken voor PHP-bestanden met de module mod_proxy_fcgi door aan de socket van de pool. Je zet één SetHandler-regel in het FilesMatch in de VirtualHost en vult per site de socket van het bijbehorende account in.
# Eén VirtualHost per siteaccount · in SetHandler komt de socket van dat account (in plaats van SetHandler kan ook met ProxyPassMatch worden gekoppeld)
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/siteuser/www
<Directory /home/siteuser/www>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/siteuser.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>DocumentRoot en Directory zijn de webroot van dat account, en -Indexes bij Options voorkomt dat de maplijst in de browser zichtbaar wordt.
🔲 Socketrechten instellen
Bij het starten van de pool wordt de socket aangemaakt met de waarden van listen.owner, listen.group en listen.mode, en met ls controleer je of de rechten kloppen.
ls -l /run/php-fpm/totaal 4
srw-rw---- 1 siteuser_a nobody 0 okt 22 23:34 siteuser_a.sock
-rw-r--r-- 1 root root 7 okt 26 03:00 php-fpm.pid
srw-rw---- 1 siteuser_b nobody 0 okt 22 23:34 siteuser_b.sock
srw-rw----+ 1 root root 0 okt 22 23:34 www.sockKloppen de rechten niet en kan de webserver de socket niet openen, dan krijgen bezoekers een 503-fout; om het meteen zonder herstart te herstellen, stel je eigenaar en rechten in met chown en chmod.
Dit is de huidige syntaxis, waarbij gebruiker en groep door een dubbele punt worden gescheiden.
chown siteuser:nobody /run/php-fpm/siteuser.sockZet na het wijzigen van de eigenaar de rechten op 660.
chmod 660 /run/php-fpm/siteuser.sockDit is de oude syntaxis, waarbij gebruiker en groep door een punt worden gescheiden, en ze werkt in chown ook op AlmaLinux 9 nog gewoon.
chown siteuser.nobody /run/php-fpm/siteuser.sockZet na het wijzigen van de eigenaar de rechten op 660.
chmod 660 /run/php-fpm/siteuser.sockBeide syntaxissen geven hetzelfde resultaat: welke je ook gebruikt, de eigenaar van de socket wordt siteuser en de groep wordt nobody.
🔲 Koppeling met Nginx: de instelling fastcgi_pass
In Nginx geeft de location voor PHP-bestanden in het server-blok verzoeken met fastcgi_pass door aan de socket van dezelfde pool.
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php-fpm/siteuser.sock;
}Draait Nginx onder het account nginx, vul dan in het poolbestand nginx in bij listen.group, zodat het de socket kan openen.
5️⃣ Configuratie testen en herstarten: php-fpm -t en systemctl
Herstart na het wijzigen van de configuratie niet meteen, maar voer eerst een syntaxiscontrole uit met php-fpm -t. Staat er een typefout in een poolbestand, dan valt bij het herstarten heel PHP-FPM uit en krijgen alle sites een 503.
php-fpm -t[26-Oct-2026 17:33:45] NOTICE: configuration file /etc/php-fpm.conf test is successfulSlaagt de controle, dan verschijnt samen met het pad van het configuratiebestand de melding [test is successful], en daarna pas je de wijziging toe op PHP-FPM. Een wijziging waarbij de socket opnieuw moet worden aangemaakt, zoals het socketpad of listen.owner, pas je toe met restart. Heb je op een draaiende server alleen waarden zoals het aantal workers gewijzigd, pas die dan toe met reload.
systemctl restart php-fpmHeb je de VirtualHost aangepast, herstart dan ook Apache.
systemctl restart httpdRegistreer het met enable, zodat het automatisch start wanneer de server weer wordt aangezet.
systemctl enable php-fpmOf het geregistreerd is, controleer je met is-enabled.
systemctl is-enabled php-fpmenabledMet status controleer je of er per pool workers draaien.
systemctl status php-fpm● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; preset: disabled)
Active: active (running) since x
Process: 3934033 ExecReload=/bin/kill -USR2 $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 1333314 (php-fpm)
Status: "Processes active: 4, idle: 21, Requests: x, slow: 0, Traffic: x"
Tasks: x
Memory: x
CPU: x
CGroup: /system.slice/php-fpm.service
├─ 41920 "php-fpm: pool siteuser_a"
├─ 94143 "php-fpm: pool siteuser_b"
├─1333314 "php-fpm: master process (/etc/php-fpm.conf)"
├─3934078 "php-fpm: pool www"
└─4009016 "php-fpm: pool siteuser_a"
okt 26 03:00:01 server.example.com systemd[1]: Reloading The PHP FastCGI Process Manager...
okt 26 03:00:01 server.example.com systemd[1]: Reloaded The PHP FastCGI Process Manager.In de Status-regel zijn active en idle de workers die nu verzoeken afhandelen en de vrije workers, en CGroup somt de workers op per poolnaam. De hostnaam en de poolnamen in de uitvoer zijn vervangen door voorbeeldwaarden.
🔢 FAQ & aanbevolen content
Cache
Cache: definitie en alle toepassingsgebieden van caching
Legt per gebied uit hoe verzoeken die de cache raken nooit tot een PHP-FPM-worker doordringen.
Cacheserver
Varnish Cache installeren en instellen op Apache en Nginx
De installatiestappen om een cacheserver voor de webserver te plaatsen en zo de PHP-verzoeken zelf te verminderen.
Linux
15 categorieën Linux-commando's
Een tabel die commando's in 15 categorieën indeelt, waaronder rpm, grep en systemctl die in dit artikel zijn gebruikt.
ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.