Lühidalt: PHP-FPM (FastCGI Process Manager) käitab PHP-d veebiserveri kõrval eraldi teenusena. Master-protsess haldab poole ja iga pool käivitab workereid, mis töötlevad päringuid FastCGI kaudu. Poole saab käitada iga veebisaidi jaoks oma kasutaja, oma piiride ja lukustatud PHP sätetega. Kuna workerid töötlevad palju päringuid järjest, tuleb need kõik pärast PHP uuendust uuesti käivitada.
Mis on PHP-FPM?
PHP käsiraamat kirjeldab FPM-i kui PHP peamist FastCGI teostust, mille funktsioonid on kasulikud eelkõige tugevalt koormatud veebisaitidele. FPM võeti vastu PHP 5.3.3-ga eraldi SAPI-na ehk eraldi töörežiimina. Selle SAPI nimi on fpm-fcgi.
Erinevus mod_php-st: PHP ei tööta veebiserveri sees, vaid eraldi teenusena. Nginx, Apache või mõni muu veebiserver annab PHP päringud FastCGI protokolli kaudu edasi ja saab valmis vastuse tagasi. Veebiserverit ja PHP-d saab seeläbi üksteisest sõltumatult uuesti käivitada, seadistada ja kaitsta. Kuidas FastCGI põhimõtteliselt töötab, leiate lehelt CGI ja FastCGI.
Master, poolid ja workerid: protsessimudel
PHP-FPM koosneb kolmest tasandist:
- Master-protsess: loeb seadistuse, avab sokklid ning käivitab või lõpetab workereid. Rakenduse koodi ta ise ei käivita.
- Poolid: Igal poolil on nimi, oma sokkel või port, oma Unixi kasutaja ja omad PHP sätted. Käsiraamat nimetab selgesõnaliselt erinevat uid-d, gid-d, chrooti, keskkonda ja php.ini-d iga pooli kohta.
- Workerid: pooli protsessid, mis võtavad päringuid vastu ja täidavad neid. Worker töötleb järjest palju päringuid, enne kui see asendatakse.
Mitu workerit töötab, määrab protsessihaldur direktiiviga pm:
| Režiim | Käitumine | Olulised direktiivid |
|---|---|---|
static |
kindel arv workereid | pm.max_children |
dynamic |
workerid alumise ja ülemise piiri vahel | pm.start_servers, pm.min_spare_servers, pm.max_spare_servers |
ondemand |
workerid alles vajadusel, vabakäigu järel lammutamine | pm.process_idle_timeout (vaikeväärtus 10s) |
pm.max_children piirab kõigis režiimides samaaegsete päringute arvu. pm.max_requests asendab workeri pärast kindlat arvu päringuid; vaikeväärtus 0 tähendab piiramatut.
Milline režiim sobib, sõltub koormusest. static hoiab alati valmis ühepalju workereid ja sobib ühtlaselt tugevalt kasutatavatele rakendustele, kui mälu on piisavalt. dynamic on kompromiss enamiku veebisaitide jaoks. ondemand säästab mälu serverites, kus on palju väikesi veebisaite, sest külastajateta poolid ei hõiva ühtegi workerit; see-eest võtab esimene päring pärast pausi veidi kauem aega. Liiga kõrgele seatud pm.max_children võib ajada serveri koormuspiikidel mälupuuduse olukorda, liiga madal toob kaasa ooteaegu ja veebiserveri veateateid.
Pool turvaliste põhisätetega
Näide iga veebisaidi oma poolist, PHP käsiraamatu direktiividega. Teed ja väärtused on näited:
; /etc/php/8.3/fpm/pool.d/kunde-a.conf
[kunde-a]
user = kunde-a
group = kunde-a
listen = /run/php/kunde-a.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s
request_terminate_timeout = 60s
security.limit_extensions = .php
clear_env = yes
php_admin_value[open_basedir] = /var/www/kunde-a:/tmp
php_admin_flag[session.upload_progress.enabled] = off
php_admin_value[error_log] = /var/log/php/kunde-a.error.log
Käsiraamatu järgi saab väärtusi php_value ja php_flag kaudu käitusajal ini_set() abil muuta, väärtusi php_admin_value ja php_admin_flag kaudu aga mitte. security.limit_extensions on vaikimisi .php .phar ja määrab, milliseid faililaiendeid FPM põhiskriptina käivitab. clear_env = yes on vaikeväärtus ja tühjendab workerite keskkonna.
Jälgimiseks on olemas olekuleht pm.status_path kaudu ja ping-leht ping.path kaudu. Mõlemad peaksid olema kättesaadavad ainult seespidiselt. Aeglasi päringuid logib FPM koos backtrace'iga, kui request_slowlog_timeout ja slowlog on seatud.
PHP käsiraamat hoiatab: kes saab avada FastCGI ühenduse PHP-FPM-iga, kontrollib päringu seadistust ja saab seega käivitada suvalist koodi. PHP-FPM ei tohi olla kunagi kättesaadav mitteusaldusväärsest võrgust. Kasutage Unixi sokklit või listen.allowed_clients.
Mis rolli mängib PHP-FPM PHP2Shelli puhul?
PHP-FPM kuulub mõjutatud töörežiimide hulka. Eriti selgelt tuleb protsessimudel esile CVE-2026-109619 puhul: päringuga seotud sisemine olek võib pärast mälu vabastamist alles jääda ja hilisem päring samas workeris võib seda kasutada enne, kui see lähtestatakse. See on võimalik ainult seetõttu, et workerid töötlevad palju päringuid järjest.
Sellest tulenevad kolm kohustust:
- Uuenduse paigaldamine: PHP 8.5.12, 8.4.27, 8.3.36 või 8.2.35 või distributsiooni kinnitatud backport.
- Kõigi workerite taaskäivitamine: Uued failid kettal ei muuda midagi, kuni vanad workerid töötavad. See kehtib iga paigaldatud FPM versiooni ja iga pooli kohta. Käsud leiate lehelt PHP-FPM ja kõigi workerite taaskäivitamine.
- Üleminekuväärtuste lukustamine: php.net-i meetmed, näiteks
session.upload_progress.enabled=0, kuuluvadphp_admin_valuevõiphp_admin_flagkaudu pooli, mitte faili.user.ini.
Poolideks jaotamine ei asenda uuendust, kuid piirab kahju: kui iga veebisait töötab oma kasutaja all, ei pääse ründaja pärast sissemurdmist automaatselt teiste failidele. Kuidas see konkreetselt välja näeb, kirjeldab PHP-FPM poolide eraldamine veebisaitide kaupa; sidumine Nginxiga on lehel Nginx koos PHP-FPM-iga kaitsmine.
Kuidas PHP SOS konkreetselt aitab?
- Poolide kaardistamine: Loetleme teie serveri kõik FPM versioonid, poolid, kasutajad ja sokklid.
- Paikamine ja taaskäivitamine: Uuendame PHP-d ja tõendame käivitusaegade põhjal, et ükski vana worker enam ei tööta.
- Poolide eraldamine: Serveri karastamise raames seame iga veebisaidi jaoks sisse oma kasutajaga ja lukustatud sätetega pooli.
- Kättesaadavuse kontroll: Kontrollime, et FastCGI sokklid ja olekulehed ei ole väljastpoolt kättesaadavad.
Korduma kippuvad küsimused
Mida FPM tähendab?
FPM tähendab FastCGI Process Manager. PHP käsiraamat kirjeldab seda kui PHP peamist FastCGI teostust, mille funktsioonid on kasulikud eelkõige tugevalt koormatud veebisaitidele. Vastu võeti see PHP 5.3.3-ga.
Mis vahe on poolil ja workeril?
Pool on rühm worker-protsesse ühise seadistusega: kasutaja, sokkel, piirid ja PHP sätted. Worker on üksik protsess, mis töötleb päringuid ükshaaval. Serveril võib olla palju poole, näiteks üks iga veebisaidi kohta.
Kas PHP-FPM peaks olema kättesaadav TCP või Unixi sokli kaudu?
Kui veebiserver töötab samal hostil, soovitab PHP käsiraamat Unixi sokklit. TCP puhul tuleb seada listen.allowed_clients, sest muidu tohib ühenduda iga aadress. Avalikult kättesaadav FastCGI port võimaldab käsiraamatu järgi suvalise koodi käivitamist.
Kas pm.max_requests kaitseb PHP2Shelli-laadsete aukude eest?
Ei. pm.max_requests asendab workeri pärast kindlat arvu päringuid ja aitab eelkõige laienduste mälulekete vastu. Interpretaatoris oleva augu vastu aitab ainult uuendus koos kõigi workerite järgneva taaskäivitusega.