Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

PHP-FPM vysvetlené: správca procesov, pooly a workery

PHP-FPM prevádzkuje PHP ako samostatnú službu s poolmi a workermi. Ako funguje procesný model, ktoré direktívy sú dôležité a prečo sa workery po aktualizáciách musia reštartovať.

Stav 4 min čítaniaZnalosti o PHP

Stručne: PHP-FPM (FastCGI Process Manager) prevádzkuje PHP ako samostatnú službu popri webovom serveri. Hlavný proces (master) spravuje pooly a každý pool spúšťa workery, ktoré spracúvajú požiadavky cez FastCGI. Pooly sa dajú prevádzkovať pre každý web s vlastným používateľom, vlastnými limitmi a zamknutými nastaveniami PHP. Keďže workery spracúvajú postupne mnoho požiadaviek, musia sa po aktualizácii PHP všetky reštartovať.

Čo je PHP-FPM?

Príručka PHP opisuje FPM ako primárnu implementáciu FastCGI pre PHP s funkciami užitočnými predovšetkým pre silno zaťažené weby. FPM bolo prijaté s PHP 5.3.3 ako samostatná SAPI, teda ako samostatný režim prevádzky. Jeho názov SAPI je fpm-fcgi.

Rozdiel oproti mod_php: PHP nebeží vo webovom serveri, ale ako samostatná služba. Nginx, Apache alebo iný webový server odovzdáva požiadavky na PHP cez protokol FastCGI a dostáva späť hotovú odpoveď. Webový server a PHP sa tak dajú navzájom nezávisle reštartovať, konfigurovať a zabezpečovať. Ako FastCGI v zásade funguje, je v časti CGI a FastCGI.

Master, pooly a workery: procesný model

PHP-FPM sa skladá z troch úrovní:

  1. Hlavný proces (master): číta konfiguráciu, otvára sockety a spúšťa alebo ukončuje workery. Sám nevykonáva kód aplikácie.
  2. Pooly: Každý pool má názov, vlastný socket alebo port, vlastného používateľa Unix a vlastné nastavenia PHP. Príručka výslovne uvádza rozdielne uid, gid, chroot, prostredie a php.ini pre každý pool.
  3. Workery: procesy poolu, ktoré prijímajú a vykonávajú požiadavky. Worker spracuje postupne mnoho požiadaviek, kým sa nahradí.

Koľko workerov beží, určuje správca procesov direktívou pm:

Režim Správanie Dôležité direktívy
static pevný počet workerov pm.max_children
dynamic workery medzi dolnou a hornou hranicou pm.start_servers, pm.min_spare_servers, pm.max_spare_servers
ondemand workery až pri potrebe, zánik po nečinnosti pm.process_idle_timeout (štandard 10s)

pm.max_children obmedzuje vo všetkých režimoch počet súbežných požiadaviek. pm.max_requests nahradí workera po pevnom počte požiadaviek; štandard 0 znamená neobmedzene.

Ktorý režim sa hodí, závisí od zaťaženia. static drží vždy rovnaký počet workerov pripravených a hodí sa pre rovnomerne silno využívané aplikácie s dostatkom pamäte. dynamic je kompromis pre väčšinu webov. ondemand šetrí pamäť na serveroch s mnohými malými webmi, pretože pooly bez návštevníkov nezaberajú žiadnych workerov; prvá požiadavka po prestávke však trvá o niečo dlhšie. Príliš vysoko nastavené pm.max_children môže pri špičkách zaťaženia priviesť server k nedostatku pamäte, príliš nízke vedie k čakacím dobám a chybovým hláseniam webového servera.

Pool so zabezpečeným základným nastavením

Príklad samostatného poolu pre každý web s direktívami z príručky PHP. Cesty a hodnoty sú len príklady:

; /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

Podľa príručky sa dajú hodnoty cez php_value a php_flag meniť počas behu pomocou ini_set(), hodnoty cez php_admin_value a php_admin_flag však nie. security.limit_extensions je štandardne .php .phar a určuje, ktoré prípony súborov FPM vykoná ako hlavný skript. clear_env = yes je štandard a vyprázdňuje prostredie workerov.

Na monitorovanie slúži stavová stránka cez pm.status_path a stránka ping cez ping.path. Obe by mali byť dostupné iba interne. Pomalé požiadavky FPM zaznamenáva s backtrace, ak sú nastavené request_slowlog_timeout a slowlog.

Dôležité

Príručka PHP varuje: kto môže otvoriť spojenie FastCGI s PHP-FPM, kontroluje konfiguráciu požiadavky a môže tak vykonať ľubovoľný kód. PHP-FPM nesmie byť nikdy dostupné z nedôveryhodnej siete. Použite socket Unix alebo listen.allowed_clients.

Akú úlohu zohráva PHP-FPM pri PHP2Shell?

PHP-FPM patrí medzi dotknuté režimy prevádzky. Procesný model je obzvlášť zreteľný pri CVE-2026-109619: vnútorný stav patriaci k požiadavke môže po uvoľnení pamäte zostať zachovaný a neskoršia požiadavka v tom istom workeri ho môže použiť skôr, než sa obnoví. To je možné len preto, že workery spracúvajú postupne mnoho požiadaviek.

Z toho vyplývajú tri povinnosti:

  1. Nasadiť aktualizáciu: PHP 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35, resp. potvrdený backport distribúcie.
  2. Reštartovať všetky workery: Nové súbory na disku nič nemenia, kým bežia starí workery. Platí to pre každú nainštalovanú verziu FPM a každý pool. Príkazy sú na stránke Reštart PHP-FPM a všetkých workerov.
  3. Zamknúť prechodné hodnoty: Opatrenia z php.net, napríklad session.upload_progress.enabled=0, patria cez php_admin_value alebo php_admin_flag do poolu, nie do .user.ini.

Oddelenie na pooly aktualizáciu nenahrádza, ale obmedzuje škodu: ak každý web beží pod vlastným používateľom, útočník po prieniku automaticky nedosiahne súbory ostatných. Ako to konkrétne vyzerá, opisuje Izolácia poolov PHP-FPM pre každý web; začlenenie do Nginx je v časti Zabezpečenie Nginx s PHP-FPM.

Ako konkrétne pomáha PHP SOS?

  • Zmapovať pooly: Vypisujeme všetky verzie FPM, pooly, používateľov a sockety vášho servera.
  • Záplatovať a reštartovať: Aktualizujeme PHP a podľa časov spustenia dokladáme, že už nebeží žiadny starý worker.
  • Oddeliť pooly: V rámci zabezpečenia servera (hardening) zriaďujeme pre každý web pool s vlastným používateľom a zamknutými nastaveniami.
  • Overiť dostupnosť: Kontrolujeme, že sockety FastCGI a stavové stránky nie sú dostupné zvonka.

Časté otázky

Čo znamená FPM?

FPM znamená FastCGI Process Manager. Príručka PHP ho opisuje ako primárnu implementáciu FastCGI pre PHP s funkciami užitočnými predovšetkým pre silno zaťažené weby. Bol prijatý s PHP 5.3.3.

Aký je rozdiel medzi poolom a workerom?

Pool je skupina procesov workerov so spoločnou konfiguráciou: používateľ, socket, limity a nastavenia PHP. Worker je jednotlivý proces, ktorý postupne spracúva požiadavky. Server môže mať veľa poolov, napríklad jeden pre každý web.

Má byť PHP-FPM dostupné cez TCP, alebo cez socket Unix?

Ak webový server beží na tom istom hostiteľovi, príručka PHP odporúča socket Unix. Pri TCP sa musí nastaviť listen.allowed_clients, inak sa môže pripojiť ľubovoľná adresa. Voľne dostupný port FastCGI umožňuje podľa príručky vykonanie ľubovoľného kódu.

Chráni pm.max_requests pred zraniteľnosťami ako PHP2Shell?

Nie. pm.max_requests nahradí workera po pevnom počte požiadaviek a pomáha predovšetkým proti únikom pamäte v rozšíreniach. Proti zraniteľnosti v interpretere pomôže iba aktualizácia s následným reštartom všetkých workerov.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc