Īsi: PHP-FPM (FastCGI Process Manager) darbina PHP kā atsevišķu pakalpojumu līdzās tīmekļa serverim. Master process pārvalda pūlus, un katrs pūls startē darbprocesus, kas apstrādā pieprasījumus caur FastCGI. Pūlus var darbināt katrai vietnei ar savu lietotāju, savām robežām un bloķētiem PHP iestatījumiem. Tā kā darbprocesi pēc kārtas apstrādā daudzus pieprasījumus, pēc PHP atjauninājuma tie visi jāpārstartē.
Kas ir PHP-FPM?
PHP rokasgrāmata FPM raksturo kā PHP primāro FastCGI implementāciju ar funkcijām, kas noder galvenokārt ļoti noslogotām vietnēm. FPM tika iekļauts ar PHP 5.3.3 kā atsevišķa SAPI, tas ir, atsevišķs darbības režīms. Tā SAPI nosaukums ir fpm-fcgi.
Atšķirība no mod_php: PHP nedarbojas tīmekļa serverī, bet kā atsevišķs pakalpojums. Nginx, Apache vai cits tīmekļa serveris PHP pieprasījumus nodod caur FastCGI protokolu un saņem gatavo atbildi. Tīmekļa serveri un PHP tādējādi var pārstartēt, konfigurēt un nodrošināt neatkarīgi cits no cita. Kā FastCGI darbojas principā, skatiet sadaļā CGI un FastCGI.
Master, pūli un darbprocesi: procesu modelis
PHP-FPM sastāv no trim līmeņiem:
- Master process: nolasa konfigurāciju, atver sockets un startē vai beidz darbprocesus. Pats lietojumprogrammas kodu tas neizpilda.
- Pūli: Katram pūlam ir nosaukums, savs socket vai ports, savs Unix lietotājs un savi PHP iestatījumi. Rokasgrāmata skaidri min atšķirīgus uid, gid, chroot, vidi un php.ini katram pūlam.
- Darbprocesi: pūla procesi, kas pieņem un izpilda pieprasījumus. Darbprocess pēc kārtas apstrādā daudzus pieprasījumus, pirms tiek nomainīts.
Cik darbprocesu darbojas, nosaka procesu pārvaldnieks ar direktīvu pm:
| Režīms | Uzvedība | Svarīgas direktīvas |
|---|---|---|
static |
fiksēts darbprocesu skaits | pm.max_children |
dynamic |
darbprocesi starp apakšējo un augšējo robežu | pm.start_servers, pm.min_spare_servers, pm.max_spare_servers |
ondemand |
darbprocesi tikai pēc vajadzības, beidzas pēc dīkstāves | pm.process_idle_timeout (noklusējums 10s) |
pm.max_children visos režīmos ierobežo vienlaicīgo pieprasījumu skaitu. pm.max_requests nomaina darbprocesu pēc noteikta pieprasījumu skaita; noklusējums 0 nozīmē neierobežoti.
Kurš režīms der, atkarīgs no slodzes. static vienmēr uztur vienādu skaitu darbprocesu un der vienmērīgi intensīvi lietotām lietojumprogrammām ar pietiekamu operatīvo atmiņu. dynamic ir kompromiss lielākajai daļai vietņu. ondemand ietaupa atmiņu serveros ar daudzām mazām vietnēm, jo pūli bez apmeklētājiem darbprocesus neaizņem; toties pirmais pieprasījums pēc pārtraukuma ilgst mazliet ilgāk. Pārāk augsti iestatīts pm.max_children slodzes maksimumos serveri var novest līdz atmiņas trūkumam, pārāk zems rada gaidīšanas laikus un tīmekļa servera kļūdu ziņojumus.
Pūls ar drošiem pamatiestatījumiem
Piemērs atsevišķam pūlam katrai vietnei ar direktīvām no PHP rokasgrāmatas. Ceļi un vērtības ir piemēri:
; /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
Saskaņā ar rokasgrāmatu vērtības, kas iestatītas ar php_value un php_flag, izpildes laikā var mainīt ar ini_set(), bet vērtības, kas iestatītas ar php_admin_value un php_admin_flag, nevar. security.limit_extensions pēc noklusējuma ir .php .phar un nosaka, kurus failu paplašinājumus FPM izpilda kā galveno skriptu. clear_env = yes ir noklusējums un iztīra darbprocesu vidi.
Uzraudzībai ir statusa lapa caur pm.status_path un ping lapa caur ping.path. Abām jābūt sasniedzamām tikai iekšēji. Lēnus pieprasījumus FPM reģistrē ar backtrace, ja ir iestatīti request_slowlog_timeout un slowlog.
PHP rokasgrāmata brīdina: kas var atvērt FastCGI savienojumu ar PHP-FPM, kontrolē pieprasījuma konfigurāciju un tādējādi var izpildīt jebkuru kodu. PHP-FPM nekad nedrīkst būt sasniedzams no neuzticama tīkla. Izmantojiet Unix socket vai listen.allowed_clients.
Kāda loma PHP-FPM ir PHP2Shell gadījumā?
PHP-FPM ir viens no skartajiem darbības režīmiem. Procesu modelis īpaši skaidri parādās CVE-2026-109619 gadījumā: pieprasījumam piederošs iekšējais stāvoklis pēc atmiņas atbrīvošanas var saglabāties, un vēlāks pieprasījums tajā pašā darbprocesā to var izmantot, pirms tas ir atiestatīts. Tas iespējams tikai tāpēc, ka darbprocesi pēc kārtas apstrādā daudzus pieprasījumus.
No tā izriet trīs pienākumi:
- Ieviest atjauninājumu: PHP 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 vai apstiprināts distributīva backport.
- Pārstartēt visus darbprocesus: Jauni faili diskā neko nemaina, kamēr darbojas veci darbprocesi. Tas attiecas uz katru instalēto FPM versiju un katru pūlu. Komandas skatiet sadaļā PHP-FPM un visu darbprocesu pārstartēšana.
- Pagaidu vērtības iestatīt bloķētas: php.net pasākumi, piemēram,
session.upload_progress.enabled=0, pūlā jāiestata arphp_admin_valuevaiphp_admin_flag, nevis.user.ini.
Dalījums pūlos neaizstāj atjauninājumu, bet ierobežo kaitējumu: ja katra vietne darbojas ar savu lietotāju, uzbrucējs pēc ielaušanās automātiski nesasniedz pārējo vietņu failus. Kā tas izskatās konkrēti, apraksta PHP-FPM pūlu nošķiršana katrai vietnei; integrāciju Nginx skatiet sadaļā Nginx ar PHP-FPM aizsardzība.
Kā PHP SOS palīdz konkrēti?
- Apzināt pūlus: Mēs uzskaitām visas jūsu servera FPM versijas, pūlus, lietotājus un sockets.
- Ielāpot un pārstartēt: Mēs atjaunināmies PHP un pēc startēšanas laikiem pierādām, ka vairs nedarbojas neviens vecs darbprocess.
- Nošķirt pūlus: Servera nostiprināšanas ietvaros mēs katrai vietnei izveidojam pūlu ar savu lietotāju un bloķētiem iestatījumiem.
- Pārbaudīt sasniedzamību: Mēs kontrolējam, ka FastCGI sockets un statusa lapas nav sasniedzamas no ārpuses.
Biežāk uzdotie jautājumi
Ko apzīmē FPM?
FPM nozīmē FastCGI Process Manager. PHP rokasgrāmata to raksta kā PHP primāro FastCGI implementāciju ar funkcijām, kas noder galvenokārt ļoti noslogotām vietnēm. Tas tika iekļauts ar PHP 5.3.3.
Kāda ir atšķirība starp pūlu un darbprocesu?
Pūls ir darbprocesu grupa ar kopīgu konfigurāciju: lietotāju, sockets, robežām un PHP iestatījumiem. Darbprocess ir atsevišķs process, kas pēc kārtas apstrādā pieprasījumus. Serverī var būt daudz pūlu, piemēram, pa vienam katrai vietnei.
Vai PHP-FPM jābūt sasniedzamam caur TCP vai Unix socket?
Ja tīmekļa serveris darbojas tajā pašā resursdatorā, PHP rokasgrāmata iesaka Unix socket. TCP gadījumā jāiestata listen.allowed_clients, jo citādi savienoties drīkst jebkura adrese. Atklāti sasniedzams FastCGI ports saskaņā ar rokasgrāmatu ļauj izpildīt jebkuru kodu.
Vai pm.max_requests aizsargā pret ievainojamībām, piemēram, PHP2Shell?
Nē. pm.max_requests nomaina darbprocesu pēc noteikta pieprasījumu skaita un palīdz galvenokārt pret atmiņas noplūdēm paplašinājumos. Pret ievainojamību interpretatorā palīdz tikai atjauninājums ar sekojošu visu darbprocesu pārstartēšanu.