# PHP-FPM razložen: upravljalnik procesov, pooli in workerji

> PHP-FPM razložen: kako delujejo master, pooli in workerji, kaj pomenijo pm static, dynamic in ondemand ter katere nastavitve poola prinašajo varnost.

Vir: https://phpsos.de/sl/php/php-fpm-erklaert/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** PHP-FPM (FastCGI Process Manager) poganja PHP kot samostojno storitev ob spletnem strežniku. Glavni proces (master) upravlja poole, vsak pool zažene workerje, ki zahteve obdelujejo prek FastCGI. Pooli se lahko upravljajo za vsako spletno stran z lastnim uporabnikom, lastnimi omejitvami in zaklenjenimi nastavitvami PHP. Ker workerji zaporedoma obdelajo veliko zahtev, jih je treba po posodobitvi PHP vse znova zagnati.

## Kaj je PHP-FPM?

Priročnik PHP opisuje FPM kot primarno implementacijo FastCGI v PHP s funkcijami, ki so koristne predvsem za močno obremenjene spletne strani. FPM je bil v PHP 5.3.3 vključen kot samostojen SAPI, torej kot samostojen način delovanja. Njegovo ime SAPI je `fpm-fcgi`.

Razlika v primerjavi z mod_php: PHP ne teče v spletnem strežniku, ampak kot samostojna storitev. Nginx, Apache ali drug spletni strežnik zahteve PHP posreduje prek protokola FastCGI in prejme končni odgovor. Spletni strežnik in PHP je tako mogoče neodvisno drug od drugega znova zagnati, konfigurirati in zavarovati. Kako FastCGI deluje v osnovi, piše na strani [CGI in FastCGI](https://phpsos.de/sl/php/cgi-und-fastcgi/).

## Master, pooli in workerji: procesni model

PHP-FPM sestavljajo tri ravni:

1. **Glavni proces (master):** prebere konfiguracijo, odpre socket in zažene ali konča workerje. Sam ne izvaja kode aplikacije.
2. **Pooli:** vsak pool ima ime, lasten socket ali vrata, lastnega uporabnika Unix in lastne nastavitve PHP. Priročnik izrecno navaja različne uid, gid, chroot, okolje in php.ini za vsak pool.
3. **Workerji:** procesi poola, ki zahteve sprejemajo in izvajajo. Worker zaporedoma obdela veliko zahtev, preden ga zamenjajo.

Koliko workerjev teče, določa upravljalnik procesov z direktivo `pm`:

| Način | Vedenje | Pomembne direktive |
|---|---|---|
| `static` | stalno število workerjev | `pm.max_children` |
| `dynamic` | workerji med spodnjo in zgornjo mejo | `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers` |
| `ondemand` | workerji šele po potrebi, odstranitev po mirovanju | `pm.process_idle_timeout` (privzeto 10s) |

`pm.max_children` v vseh načinih omejuje število hkratnih zahtev. `pm.max_requests` zamenja workerja po določenem številu zahtev; privzeta vrednost 0 pomeni neomejeno.

Kateri način ustreza, je odvisno od obremenitve. `static` vedno pripravi enako število workerjev in je primeren za enakomerno močno uporabljane aplikacije z dovolj delovnega pomnilnika. `dynamic` je kompromis za večino spletnih strani. `ondemand` prihrani pomnilnik na strežnikih z veliko majhnimi spletnimi stranmi, ker pooli brez obiskovalcev ne zasedajo workerjev; zato pa prva zahteva po premoru traja nekoliko dlje. Previsoko nastavljen `pm.max_children` lahko strežnik ob konicah obremenitve požene v pomanjkanje pomnilnika, prenizek povzroči čakalne čase in sporočila o napakah spletnega strežnika.

## Pool z varnimi osnovnimi nastavitvami

Primer lastnega poola za vsako spletno stran z direktivami iz priročnika PHP. Poti in vrednosti so primeri:

```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
```

Po priročniku je vrednosti prek `php_value` in `php_flag` mogoče med izvajanjem spremeniti z `ini_set()`, vrednosti prek `php_admin_value` in `php_admin_flag` pa ne. `security.limit_extensions` je privzeto `.php .phar` in določa, katere končnice datotek FPM izvede kot glavno skripto. `clear_env = yes` je privzeto in izprazni okolje workerjev.

Za nadzor obstajata stran s stanjem prek `pm.status_path` in stran ping prek `ping.path`. Obe naj bosta dosegljivi samo interno. Počasne zahteve FPM beleži z backtraceom, če sta nastavljena `request_slowlog_timeout` in `slowlog`.

> **Pomembno:**
> Priročnik PHP opozarja: kdor lahko odpre povezavo FastCGI do PHP-FPM, nadzoruje konfiguracijo zahteve in lahko tako izvede poljubno kodo. PHP-FPM ne sme biti nikoli dosegljiv iz nezaupanja vrednega omrežja. Uporabite socket Unix ali `listen.allowed_clients`.

## Kakšno vlogo ima PHP-FPM pri PHP2Shell?

PHP-FPM sodi med prizadete načine delovanja. Procesni model je posebej očiten pri CVE-2026-109619: notranje stanje, ki pripada zahtevi, lahko po sprostitvi pomnilnika ostane, poznejša zahteva v istem workerju pa ga lahko uporabi, preden se ponastavi. To je mogoče samo zato, ker workerji zaporedoma obdelajo veliko zahtev.

Iz tega izhajajo tri obveznosti:

1. **Namestiti posodobitev:** PHP 8.5.12, 8.4.27, 8.3.36 ali 8.2.35 oziroma potrjen backport distribucije.
2. **Znova zagnati vse workerje:** nove datoteke na disku ne spremenijo ničesar, dokler tečejo stari workerji. To velja za vsako nameščeno različico FPM in vsak pool. Ukazi so na strani [Ponovni zagon PHP-FPM in vseh workerjev](https://phpsos.de/sl/php2shell/php-fpm-neustart/).
3. **Prehodne vrednosti nastaviti zaklenjeno:** ukrepi php.net, na primer `session.upload_progress.enabled=0`, sodijo prek `php_admin_value` ali `php_admin_flag` v pool, ne v `.user.ini`.

Ločevanje v poole posodobitve ne nadomešča, a omejuje škodo: če vsaka spletna stran teče pod lastnim uporabnikom, napadalec po vdoru samodejno ne doseže datotek drugih. Kako to izgleda konkretno, opisuje [Ločevanje poolov PHP-FPM za vsako spletno stran](https://phpsos.de/sl/blog/php-fpm-pools-isolieren/); vključitev v Nginx je na strani [Zavarovanje Nginxa s PHP-FPM](https://phpsos.de/sl/server/nginx-php-fpm/).

## Kako PHP SOS pomaga konkretno?

- **Zajem poolov:** naštejemo vse različice FPM, poole, uporabnike in socket na vašem strežniku.
- **Popravljanje in ponovni zagon:** posodobimo PHP in prek časov zagona dokažemo, da ne teče več noben star worker.
- **Ločevanje poolov:** v okviru [utrjevanja strežnika](https://phpsos.de/sl/leistungen/server-haertung/) vzpostavimo za vsako spletno stran pool z lastnim uporabnikom in zaklenjenimi nastavitvami.
- **Preverjanje dosegljivosti:** preverimo, da socket FastCGI in strani s stanjem od zunaj niso dosegljivi.


## Pogosta vprašanja

**Kaj pomeni FPM?**  
FPM pomeni FastCGI Process Manager. Priročnik PHP ga opisuje kot primarno implementacijo FastCGI v PHP s funkcijami, ki so koristne predvsem za močno obremenjene spletne strani. Vključen je bil v PHP 5.3.3.

**Kakšna je razlika med poolom in workerjem?**  
Pool je skupina procesov workerjev s skupno konfiguracijo: uporabnik, socket, omejitve in nastavitve PHP. Worker je posamezen proces, ki zaporedoma obdeluje zahteve. Strežnik ima lahko veliko poolov, na primer enega za vsako spletno stran.

**Ali naj bo PHP-FPM dosegljiv prek TCP ali prek socketa Unix?**  
Če spletni strežnik teče na istem gostitelju, priročnik PHP priporoča socket Unix. Pri TCP je treba nastaviti listen.allowed_clients, ker se sicer sme povezati vsak naslov. Odprto dosegljiva vrata FastCGI po priročniku omogočajo poljubno izvajanje kode.

**Ali pm.max_requests ščiti pred ranljivostmi, kot je PHP2Shell?**  
Ne. pm.max_requests zamenja workerja po določenem številu zahtev in pomaga predvsem proti uhajanju pomnilnika v razširitvah. Proti ranljivosti v interpreterju pomaga samo posodobitev z nadaljnjim ponovnim zagonom vseh workerjev.

## Viri

- [Priročnik PHP: FastCGI Process Manager](https://www.php.net/manual/en/install.fpm.php)
- [Priročnik PHP: konfiguracija FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
- [php.net: izdaja PHP 5.3.3](https://www.php.net/releases/5_3_3.php)
- [php.net: varnostna obvestila](https://www.php.net/)
