Wat is PHP-FPM | PHP-FPM installeren en instellen

Testomgeving RHEL-familieAlmaLinux 9.8Apache 2.4 + PHP-FPM 8.3root-accountGecontroleerd op 2026-10-26

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.

🧩 Hoe CGI en PHP-FPM verzoeken afhandelen
Uitlegdiagram
⚙️ PHP-uitvoering
🌐 Webserver
🌐 ApacheNginx
📨 Verzoek 1 · index.php📨 Verzoek 2 · wp-login.php📨 Verzoek 3 · index.php
Statische bestanden (afbeeldingen, CSS) beantwoordt de webserver zelf
Draait bij elk verzoekFastCGI · socket→
🧱 CGI-processen
Verzoek 1Nieuw proces → afhandelen → afsluiten
Verzoek 2Nieuw proces → afhandelen → afsluiten
Verzoek 3Nieuw proces → afhandelen → afsluiten
Als het afhandelen klaar is, verdwijnt ook het proces · het volgende verzoek begint opnieuw
🧰 PHP-FPM-pool [siteuser]
Worker 1Verzoek 1
Worker 2Verzoek 2
Worker 3Verzoek 3
Worker 4wachten
Worker 5wachten
Vooraf gestarte workers nemen verzoeken aan en wachten daarna op het volgende
Als Apache PHP via CGI uitvoert, start het bij elk verzoek een nieuw PHP-proces en sluit het af zodra het afhandelen klaar is, zodat de kosten van het aanmaken van processen oplopen naarmate er meer verzoeken komen.
Nginx heeft geen module die CGI-programma's rechtstreeks uitvoert, dus deze combinatie wordt niet gebruikt; PHP wordt via FastCGI aan PHP-FPM doorgegeven.
Apache geeft PHP-verzoeken met mod_proxy_fcgi door aan de socket, en een vooraf gestarte PHP-FPM-worker neemt ze aan, handelt ze af en wacht op het volgende.
Nginx geeft verzoeken met fastcgi_pass door aan dezelfde socket, dus ook met een andere webserver blijft de PHP-FPM-pool dezelfde.

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-fpm
php-fpm-8.3.36-1.module_php.8.3.el9.remi.x86_64

Als de uitvoer leeg is, is het niet geïnstalleerd; installeer het dan met dnf.

dnf -y install php-fpm

Als 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.conf
listen = /run/php-fpm/www.sock
pm = dynamic

listen 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 = 100

De 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 = 18

De 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.

ModusHoe workers worden gestartGeschikte sites
static (statisch)Houdt altijd het aantal aan dat in pm.max_children staatSites 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 verzoekenSites waarvan het bezoek schommelt
ondemandStart alleen als er een verzoek komt en eindigt zodra pm.process_idle_timeout is verstrekenSites 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 = 128M

De 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.conf

In 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/www

listen.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 = 0660

Deze 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 = 0

In 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.sock

Kloppen 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.sock

Zet na het wijzigen van de eigenaar de rechten op 660.

chmod 660 /run/php-fpm/siteuser.sock

Dit 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.sock

Zet na het wijzigen van de eigenaar de rechten op 660.

chmod 660 /run/php-fpm/siteuser.sock

Beide 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 successful

Slaagt 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-fpm

Heb je de VirtualHost aangepast, herstart dan ook Apache.

systemctl restart httpd

Registreer het met enable, zodat het automatisch start wanneer de server weer wordt aangezet.

systemctl enable php-fpm

Of het geregistreerd is, controleer je met is-enabled.

systemctl is-enabled php-fpm
enabled

Met 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

mod_php voert PHP uit binnen het Apache-proces, dus de installatie is eenvoudig, maar PHP wordt in elke Apache-worker geladen, wat veel geheugen kost en het moeilijk maakt om het uitvoeringsaccount per site te scheiden. PHP-FPM scheidt PHP in eigen processen, zodat elke site een eigen account en een eigen aantal workers kan hebben; op een server met meerdere sites of met Nginx gebruik je daarom PHP-FPM.

systemctl reload php-fpm stuurt een USR2-signaal naar het hoofdproces, dat de instellingen opnieuw inleest en de workers vervangt. Als je process_control_timeout instelt, worden eerst de workers vervangen die het verzoek waar ze mee bezig zijn hebben afgerond (volgens de officiële documentatie). restart haalt alle workers in één keer omlaag en weer omhoog, zodat verzoeken op dat moment kunnen worden afgebroken; gebruik op een draaiende server daarom eerst reload.

Op systemen uit de RHEL-familie is het standaardlogboek [/var/log/php-fpm/error.log], en daar blijven waarschuwingen over een tekort aan workers (seems busy · max_children) en de registraties van het starten en stoppen van pools bewaard. In het bestand dat je per pool met php_admin_value[error_log] instelt, worden de fouten van de PHP-code van die site apart vastgelegd. De standaardpool schrijft naar [/var/log/php-fpm/www-error.log].

ℹ️ 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.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Laat zien dat je geen machine bent: 9   +   1   =