# PHP-FPM vysvetlené: správca procesov, pooly a workery

> PHP-FPM vysvetlené: ako pracujú master, pooly a workery, čo znamenajú pm static, dynamic a ondemand a ktoré nastavenia poolu prinášajú bezpečnosť.

Zdroj: https://phpsos.de/sk/php/php-fpm-erklaert/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**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](https://phpsos.de/sk/php/cgi-und-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:

```ini
; /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](https://phpsos.de/sk/php2shell/php-fpm-neustart/).
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](https://phpsos.de/sk/blog/php-fpm-pools-isolieren/); začlenenie do Nginx je v časti [Zabezpečenie Nginx s PHP-FPM](https://phpsos.de/sk/server/nginx-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)](https://phpsos.de/sk/leistungen/server-haertung/) 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

- [Príručka PHP: FastCGI Process Manager](https://www.php.net/manual/en/install.fpm.php)
- [Príručka PHP: Konfigurácia FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
- [php.net: Vydanie PHP 5.3.3](https://www.php.net/releases/5_3_3.php)
- [php.net: Bezpečnostné hlásenia](https://www.php.net/)
