Slovník pojmů

PHP-FPM

PHP-FPM drží PHP procesy pro dynamické requesty za nginxem a jeho FastCGI požadavky.

Stručná definice

Správce PHP workerů mezi webovým serverem a aplikačním kódem.

PHP-FPM je hlavní implementace PHP pro FastCGI provoz. Webový server předá informace o skriptu, URI, metodě, hlavičkách a těle požadavku. Dostupný worker inicializuje PHP, zavolá aplikaci a vrátí výstup přes FastCGI. Po dokončení obslouží další request, případně jej správce po určeném počtu požadavků nahradí.

PHP-FPM není webový server ani fronta pro dlouhou práci. Na Linuxu spravuje PHP workery, ale neřeší TLS, veřejné porty ani load balancing HTTP klientů. Proto se obvykle kombinuje s nginxem, případně běží jako interní služba v Docker síti.

K čemu se používá

Spouštění PHP webů, API a administrací pod řízenými limity

FPM je určené pro PHP aplikace, které dostávají HTTP požadavky od samostatného webového serveru.

  • Symfony, Laravel nebo vlastní PHP aplikace obsluhované přes nginx a FastCGI
  • více poolů s odlišným uživatelem, php.ini, limity nebo socketem pro oddělené aplikace
  • omezení souběžných PHP requestů podle dostupné paměti a výkonu serveru
  • diagnostika pomalých requestů pomocí slowlogu, status stránky a standardních logů
  • opakovatelný PHP runtime v kontejneru, kde webový server komunikuje s aplikací přes interní síť

Praktický příklad

Symfony API za nginxem a odděleným FPM poolem

nginx přijímá HTTPS a posílá pouze front controller Symfony aplikace na interní FPM socket. Pool má omezený počet dynamických workerů, slowlog a pravidelnou obnovu po určitém počtu requestů. Databáze ani FPM socket nejsou přístupné z veřejné sítě. Endpoint exportu objednávek místo dlouhého requestu vytvoří úlohu pro worker.

Hodnoty jsou příklad, nikoli univerzální doporučení. max_children se určuje z paměti procesu, souběhu databáze a cílové doby odpovědi. Status cesta má být pouze v interní síti.

; www.conf
[www]
listen = /run/php/php-fpm.sock
pm = dynamic
pm.max_children = 12
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/www-slow.log

Jak funguje

Od HTTP requestu k PHP workeru a zpět

Každá část cesty má vlastní limit a log, takže lze určit zdroj problému.

  1. nginx přijme HTTP nginx ukončí TLS, vybere server a location a statické soubory může vrátit bez PHP. Jen dynamická cesta se předává přes fastcgi_pass.
  2. FastCGI parametry Webový server předá metodu, URI, query string, hlavičky a cestu ke skriptu. Špatně nastavený SCRIPT_FILENAME nebo příliš obecné PHP location může být funkční i bezpečnostní problém.
  3. Pool vybere worker Pool poslouchá na Unix socketu nebo TCP portu. Dostupný child process zpracuje požadavek; pokud všichni pracují, request čeká nebo narazí na limit podle okolní konfigurace.
  4. Aplikace vykoná práci PHP načte Composer autoloader, framework a aplikační službu. Pomalý SQL dotaz, vzdálené API nebo velký import drží worker po celou dobu obsazený.
  5. Odpověď a obnova procesu FPM vrátí odpověď nginxu a worker zůstane pro další request. pm.max_requests může worker pravidelně nahradit, aby se omezil dopad postupně rostoucí spotřeby paměti.

Hlavní části

Pool, procesní režim a limity musí odpovídat skutečnému zatížení.

Nastavení vychází z paměti, doby requestu a počtu souběžných služeb.

Pool

Pool je skupina workerů s vlastním listen socketem, uživatelem, prostředím a částí konfigurace. Umožní oddělit aplikace nebo citlivější administraci, ale příliš mnoho poolů zvyšuje režii a složitost.

static, dynamic a ondemand

Režim static drží pevný počet workerů. dynamic spravuje minimální a maximální počet podle zatížení. ondemand vytváří child procesy až při požadavku a po nečinnosti je ukončí; šetří paměť, ale může přidat startovní zpoždění.

pm.max_children

Maximální počet souběžných PHP requestů chrání server před nekontrolovaným vytvářením procesů. Jeho hodnota vychází z reálné paměti jednoho workeru, rezervy pro databázi a systém, ne z počtu CPU jako jednoduchého pravidla.

Socket nebo TCP

Unix socket je běžný při společném hostiteli; TCP se používá při oddělených kontejnerech nebo serverech. V obou případech musí být endpoint neveřejný a přístup omezený na webový server.

Status, slowlog a restart

FPM umí poskytovat stav poolu, logovat neobvykle dlouhé skripty a graceful restartovat workery. Tyto údaje jsou diagnostika; nenahrazují aplikační metriky, tracing ani opravu pomalého kódu.

Výhody a omezení

Připravené workery snižují startovní režii, ale každý zabírá paměť.

Přínosy

  • samostatný procesní model PHP oddělený od HTTP a statických souborů
  • pooly umožní nastavit limity a oprávnění pro různé aplikace
  • řízení child procesů, graceful restart, slowlog a status usnadňují provozní diagnostiku
  • spolupráce s nginxem dovolí obsloužit mnoho běžných webových requestů bez vytváření nového PHP procesu

Rizika a chyby

  • příliš vysoké pm.max_children může vyčerpat paměť a způsobit OOM místo vyššího výkonu
  • pomalé externí volání nebo export obsadí worker a sníží kapacitu celého webu
  • veřejně otevřený FPM TCP port dovoluje nechtěný přístup k runtime
  • špatný FastCGI parametr může spustit nesprávný skript nebo rozbít routování
  • zvýšení počtu workerů nevyřeší chybějící databázový index, zámek ani pomalou integraci

Hranice použití

Webový pool chránit před dlouhou a dávkovou prací.

PHP-FPM je přiměřená volba pro HTTP requesty s jasným timeoutem a omezenou pamětí. Kapacita vychází z reálné velikosti workeru a rezervy pro systém, databázi i cache. Krátký endpoint může potřebovat jinou politiku než administrativní export.

Dlouhé importy, přepočty katalogu, generování souborů a retry externích API nemají držet webový FPM worker. Fronta nebo CLI worker dá úloze vlastní limit, retry a monitoring. fastcgi_finish_request může ukončit odpověď klientovi dříve, ale neudělá z dlouhé práce nezávislý worker.

Na co myslet

Limity nastavovat podle měření, ne podle univerzálního čísla z návodu.

Provoz sleduje čekající requesty, délku skriptů, paměť a chyby nginxu, FPM i aplikace.

  • počítat pm.max_children z reálné paměti workerů a ponechat rezervu pro celý hostitel či kontejner
  • oddělit veřejný HTTP server od neveřejného FPM socketu nebo TCP portu
  • nastavit fastcgi parametry tak, aby aplikace dostala správnou cestu, schéma a očekávané hlavičky
  • použít slowlog a status endpoint chráněný před veřejným přístupem pro hledání blokujících requestů
  • synchronizovat timeouty nginxu, FPM a aplikace podle typu endpointu místo bezdůvodného zvyšování všech limitů
  • po deployi provést graceful reload a ověřit health check, chyby a spotřebu paměti nových workerů

Časté otázky

Jak PHP-FPM ovlivňuje běh webu

Je PHP-FPM webový server?

Ne. Zpracovává PHP přes FastCGI. HTTP, TLS, statické soubory a veřejnou síťovou hranici obvykle řeší nginx nebo jiný webový server před ním.

Zvýší více workerů vždy výkon?

Ne. Více workerů zvyšuje souběh, ale spotřebuje paměť a může zvýšit tlak na databázi či externí API. Po překročení kapacity server začne latence růst nebo procesy skončí nedostatkem paměti.

Má dlouhý import běžet přes PHP-FPM?

Běžně ne. Dlouhá práce blokuje webový worker a zhorší dostupnost běžných requestů. Vhodnější je fronta nebo samostatný CLI worker s vlastním timeoutem, retry a monitoringem.

Je lepší Unix socket, nebo TCP port?

Záleží na topologii. Socket je běžný, když nginx a FPM sdílejí hostitele; TCP je praktické pro oddělené kontejnery. V obou případech je důležité, aby endpoint nebyl veřejně dostupný.

Jak přemýšlím o běhu backendu

Webový request, worker a provozní limit mají mít jasně oddělenou roli.

U PHP aplikací propojuji architekturu, integrační práci a provozní zázemí tak, aby dlouhé úlohy neohrožovaly běžné API a administraci.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.