Praegune olukord: PHP2Shell. Kaks kriitilist PHP turvaauku (CVSS 9,2) lubavad kahjulikku koodi ilma sisselogimata. Paigad alates 21.10.2026.Mida nüüd teha →

PHP-FPM selgitus: protsessihaldur, poolid ja workerid

PHP-FPM käitab PHP-d eraldi teenusena poolide ja workeritega. Nii töötab protsessimudel, millised direktiivid loevad ja miks workerid tuleb pärast uuendusi uuesti käivitada.

Seis Lugemisaeg 4 minPHP teadmised

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:

  1. Master-protsess: loeb seadistuse, avab sokklid ning käivitab või lõpetab workereid. Rakenduse koodi ta ise ei käivita.
  2. 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.
  3. 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.

Oluline

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:

  1. Uuenduse paigaldamine: PHP 8.5.12, 8.4.27, 8.3.36 või 8.2.35 või distributsiooni kinnitatud backport.
  2. 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.
  3. Üleminekuväärtuste lukustamine: php.net-i meetmed, näiteks session.upload_progress.enabled=0, kuuluvad php_admin_value või php_admin_flag kaudu 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.

Allikad

Kohene kontakt

Iga tund loeb. Kirjutage meile kohe.

Kirjeldage lühidalt süsteemi, PHP versiooni ja tähelepanekut. Võtame teiega ühendust, selgitame olukorra välja ja töötame kaugtööna, kuni intsident on lõpetatud ja dokumenteeritud.

Kohene abi