# PHP-FPM förklarat: processhanterare, pooler och workers

> PHP-FPM förklarat: så arbetar master, pooler och workers, vad pm static, dynamic och ondemand betyder och vilka poolinställningar som ger säkerhet.

Källa: https://phpsos.de/sv/php/php-fpm-erklaert/  
Aktualitet: 2026-10-25  
Leverantör: PHP SOS, PHP-nödhjälp och serversäkerhet. Omedelbar hjälp via WhatsApp: https://wa.me/491736494914?text=Hej%20PHP%20SOS%2C%20vi%20beh%C3%B6ver%20hj%C3%A4lp%20med%20v%C3%A5r%20PHP-server.%20F%C3%B6retag%3A%20%E2%80%A6%20Webbplats%3A%20%E2%80%A6

**Kort sagt:** PHP-FPM (FastCGI Process Manager) kör PHP som egen tjänst vid sidan av webbservern. En masterprocess förvaltar pooler, och varje pool startar workers som bearbetar förfrågningar via FastCGI. Pooler kan köras per webbplats med egen användare, egna gränser och låsta PHP-inställningar. Eftersom workers bearbetar många förfrågningar efter varandra måste de alla startas om efter en PHP-uppdatering.

## Vad är PHP-FPM?

PHP-manualen beskriver FPM som PHP:s primära FastCGI-implementering med funktioner som framför allt är användbara för hårt belastade webbplatser. FPM togs med i PHP 5.3.3 som egen SAPI, alltså som eget driftläge. Dess SAPI-namn är `fpm-fcgi`.

Skillnaden mot mod_php: PHP körs inte i webbservern utan som egen tjänst. Nginx, Apache eller en annan webbserver för PHP-förfrågningar vidare via FastCGI-protokollet och får det färdiga svaret tillbaka. Webbserver och PHP kan därmed startas om, konfigureras och säkras oberoende av varandra. Hur FastCGI fungerar i grunden står under [CGI och FastCGI](https://phpsos.de/sv/php/cgi-und-fastcgi/).

## Master, pooler och workers: processmodellen

PHP-FPM består av tre nivåer:

1. **Masterprocess:** läser konfigurationen, öppnar sockets och startar eller avslutar workers. Den kör själv ingen applikationskod.
2. **Pooler:** Varje pool har ett namn, en egen socket eller port, en egen Unix-användare och egna PHP-inställningar. Manualen nämner uttryckligen olika uid, gid, chroot, miljö och php.ini per pool.
3. **Workers:** processer i en pool som tar emot och kör förfrågningar. En worker bearbetar många förfrågningar efter varandra innan den ersätts.

Hur många workers som körs avgör processhanteraren med direktivet `pm`:

| Läge | Beteende | Viktiga direktiv |
|---|---|---|
| `static` | fast antal workers | `pm.max_children` |
| `dynamic` | workers mellan under- och övre gräns | `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers` |
| `ondemand` | workers först vid behov, avveckling efter inaktivitet | `pm.process_idle_timeout` (standard 10s) |

`pm.max_children` begränsar i alla lägen antalet samtidiga förfrågningar. `pm.max_requests` ersätter en worker efter ett fast antal förfrågningar; standardvärdet 0 betyder obegränsat.

Vilket läge som passar beror på belastningen. `static` håller alltid lika många workers redo och passar jämnt och hårt använda applikationer med tillräckligt arbetsminne. `dynamic` är en kompromiss för de flesta webbplatser. `ondemand` sparar minne på servrar med många små webbplatser, eftersom pooler utan besökare inte upptar några workers; i gengäld tar den första förfrågan efter en paus lite längre tid. Ett för högt satt `pm.max_children` kan driva servern till minnesbrist vid belastningstoppar, ett för lågt leder till väntetider och felmeddelanden från webbservern.

## En pool med säkra grundinställningar

Ett exempel på en egen pool per webbplats, med direktiv från PHP-manualen. Sökvägar och värden är exempel:

```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
```

Enligt manualen kan värden som sätts med `php_value` och `php_flag` ändras vid körning med `ini_set()`, värden som sätts med `php_admin_value` och `php_admin_flag` däremot inte. `security.limit_extensions` står som standard på `.php .phar` och avgör vilka filändelser FPM kör som huvudskript. `clear_env = yes` är standard och tömmer workerns miljö.

För övervakning finns en statussida via `pm.status_path` och en ping-sida via `ping.path`. Båda bör bara vara nåbara internt. Långsamma förfrågningar loggar FPM med backtrace när `request_slowlog_timeout` och `slowlog` är satta.

> **Viktigt:**
> PHP-manualen varnar: Den som kan öppna en FastCGI-anslutning till PHP-FPM styr förfrågans konfiguration och kan därmed köra godtycklig kod. PHP-FPM får aldrig vara nåbart från ett nätverk som inte är betrott. Använd en Unix-socket eller `listen.allowed_clients`.

## Vilken roll spelar PHP-FPM vid PHP2Shell?

PHP-FPM hör till de berörda driftlägena. Processmodellen blir särskilt tydlig vid CVE-2026-109619: Internt tillstånd som hör till en förfrågan kan finnas kvar sedan minnet frigjorts, och en senare förfrågan i samma worker kan använda det innan det återställs. Det är bara möjligt eftersom workers bearbetar många förfrågningar efter varandra.

Därav följer tre skyldigheter:

1. **Installera uppdateringen:** PHP 8.5.12, 8.4.27, 8.3.36 eller 8.2.35 respektive en bekräftad backport från distributionen.
2. **Starta om alla workers:** Nya filer på disken ändrar ingenting så länge gamla workers körs. Det gäller varje installerad FPM-version och varje pool. Kommandona står under [Starta om PHP-FPM och alla workers](https://phpsos.de/sv/php2shell/php-fpm-neustart/).
3. **Sätta övergångsvärden låsta:** Åtgärderna från php.net, till exempel `session.upload_progress.enabled=0`, hör hemma i poolen via `php_admin_value` eller `php_admin_flag`, inte i `.user.ini`.

Uppdelningen i pooler ersätter ingen uppdatering men begränsar skadan: Om varje webbplats körs under egen användare når en angripare efter ett intrång inte automatiskt de andras filer. Hur det ser ut konkret beskrivs i [Isolera PHP-FPM-pooler per webbplats](https://phpsos.de/sv/blog/php-fpm-pools-isolieren/); integrationen i Nginx står under [Säkra Nginx med PHP-FPM](https://phpsos.de/sv/server/nginx-php-fpm/).

## Hur hjälper PHP SOS konkret?

- **Kartlägga pooler:** Vi listar alla FPM-versioner, pooler, användare och sockets på er server.
- **Patcha och starta om:** Vi uppdaterar PHP och styrker via starttider att ingen gammal worker längre körs.
- **Skilja poolerna åt:** Inom ramen för [serverhärdning](https://phpsos.de/sv/leistungen/server-haertung/) inrättar vi per webbplats en pool med egen användare och låsta inställningar.
- **Kontrollera nåbarheten:** Vi kontrollerar att FastCGI-sockets och statussidor inte kan nås utifrån.


## Vanliga frågor

**Vad står FPM för?**  
FPM står för FastCGI Process Manager. PHP-manualen beskriver den som PHP:s primära FastCGI-implementering med funktioner som framför allt är användbara för hårt belastade webbplatser. Den togs med i PHP 5.3.3.

**Vad är skillnaden mellan pool och worker?**  
En pool är en grupp worker-processer med gemensam konfiguration: användare, socket, gränser och PHP-inställningar. En worker är en enskild process som bearbetar förfrågningar efter varandra. En server kan ha många pooler, till exempel en per webbplats.

**Bör PHP-FPM nås via TCP eller via en Unix-socket?**  
Körs webbservern på samma värd rekommenderar PHP-manualen en Unix-socket. Med TCP måste listen.allowed_clients sättas, eftersom annars vilken adress som helst får ansluta. En öppet nåbar FastCGI-port tillåter enligt manualen godtycklig kodkörning.

**Skyddar pm.max_requests mot sårbarheter som PHP2Shell?**  
Nej. pm.max_requests ersätter en worker efter ett fast antal förfrågningar och hjälper framför allt mot minnesläckor i tillägg. Mot en sårbarhet i tolken hjälper bara uppdateringen med efterföljande omstart av alla workers.

## Källor

- [PHP-manualen: FastCGI Process Manager](https://www.php.net/manual/en/install.fpm.php)
- [PHP-manualen: FPM-konfiguration](https://www.php.net/manual/en/install.fpm.configuration.php)
- [php.net: PHP 5.3.3-releasen](https://www.php.net/releases/5_3_3.php)
- [php.net: säkerhetsmeddelanden](https://www.php.net/)
