Obsah
PHP-FPM
PHP-FPM (FastCGI Process Manager) je alternativní implementace FastCGI rozhraní pro PHP, určená pro vysoce vytížené weby. Poskytuje lepší výkon, flexibilitu a správu procesů než tradiční mod_php (používaný s Apache) nebo základní FastCGI.
Je široce používán spolu s webovými servery jako Nginx, který sám o sobě neprocesuje PHP skripty, ale předává je externímu procesu – právě PHP-FPM.
Proč používat PHP-FPM?
- Vysoký výkon a škálovatelnost – efektivně spravuje fondy pracovních procesů.
- Izolace mezi virtuálními hosty – lze spouštět různé pooly pod různými uživateli a s různými nastaveními.
- Pokročilé možnosti konfigurace – ladění počtu procesů, časových limitů, restartů apod.
- Podpora událostního zpracování (event-driven) – ideální pro spolupráci s Nginx.
Instalace
Na většině Linuxových distribucí je PHP-FPM součástí balíčkovacího systému.
# Ubuntu/Debian (pro PHP 8.3 – verze se může lišit) sudo apt install php8.3-fpm # CentOS/RHEL/Fedora (s EPEL nebo Remi repozitářem) sudo dnf install php-fpm
Po instalaci je služba php8.3-fpm (nebo php-fpm) k dispozici a lze ji spravovat standardním způsobem:
sudo systemctl start php8.3-fpm sudo systemctl enable php8.3-fpm
Základní konfigurace
Hlavní konfigurační soubory se nacházejí v:
- Hlavní konfigurace: `/etc/php/8.3/fpm/php-fpm.conf` (cesta se liší dle verze a distribuce)
- Pool konfigurace: `/etc/php/8.3/fpm/pool.d/`
Každý „pool“ (fond) představuje skupinu PHP procesů, které mohou běžet pod určitým uživatelem, poslouchat na určitém socketu nebo portu a mít vlastní limity.
Příklad konfigurace poolu
Soubor: `/etc/php/8.3/fpm/pool.d/www.conf` (výchozí pool)
[www] user = www-data group = www-data ; Poslouchá buď přes Unix socket (doporučeno) nebo TCP port listen = /run/php/php8.3-fpm.sock ; listen = 127.0.0.1:9000 ; Oprávnění pro socket (důležité pro Nginx) listen.owner = www-data listen.group = www-data listen.mode = 0660 ; Typ správy procesů: static, dynamic, ondemand pm = dynamic pm.max_children = 20 pm.start_servers = 4 pm.min_spare_servers = 2 pm.max_spare_servers = 6 pm.max_requests = 500 ; Logování slowlog = /var/log/php8.3-fpm-slow.log request_slowlog_timeout = 5s
Integrace s Nginx
Nginx potřebuje předávat PHP požadavky do PHP-FPM. To se děje pomocí bloku location ~ \.php$.
server { listen 80; server_name example.com; root /var/www/example.com; index index.php index.html; location / { try_files $url $url/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; # nebo: fastcgi_pass 127.0.0.1:9000; } }
Důležité: Ujisti se, že uživatel, pod kterým běží Nginx (např. `www-data` nebo `nginx`), má přístup k PHP-FPM socketu.
Správa poolů pro více webů
PHP-FPM umožňuje vytvořit samostatný pool pro každý web, což zvyšuje bezpečnost a izolaci.
Příklad: `/etc/php/8.3/fpm/pool.d/site1.conf`
[site1] user = site1 group = site1 listen = /run/php/site1.sock listen.owner = nginx listen.group = nginx listen.mode = 0660 pm = dynamic pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[upload_max_filesize] = 10M php_admin_value[post_max_size] = 12M
Tímto způsobem můžeš mít různá nastavení `php.ini` pro různé domény – včetně omezení paměti, časových limitů nebo zakázání funkcí.
Běžné problémy a řešení
| Problém | Možné řešení |
|---|---|
| 502 Bad Gateway | Zkontroluj, že PHP-FPM běží a Nginx má přístup k socketu. |
| Permission denied na socket | Ověř `listen.owner`/`listen.group` v poolu; ujisti se, že odpovídají uživateli Nginx. |
| PHP skripty se nestahují | Chybí blok `location ~ \.php$` nebo špatně nastaven `fastcgi_pass`. |
| Pomalé skripty | Zkontroluj `request_slowlog_timeout` a nastav slowlog pro ladění. |
Užitečné příkazy
sudo systemctl reload php8.3-fpm # Načte novou konfiguraci sudo nginx -t && sudo systemctl reload nginx # Otestuje a načte Nginx sudo systemctl status php8.3-fpm # Stav služby sudo tail -f /var/log/php8.3-fpm.log # Hlavní log
Výhody oproti mod_php
- Nižší paměťová náročnost – procesy lze dynamicky přidávat/odebírat.
- Lepší izolace – každý web může běžet pod jiným uživatelem.
- Vhodné pro Nginx – který nemá modul pro vnitřní spouštění PHP.
- Pokročilé logování – např. pomalé požadavky.
Externí zdroje
- Oficiální dokumentace: PHP: FPM Installation
- Nginx + PHP-FPM guide: Nginx Wiki
- PHP-FPM config options: PHP.net FPM Configuration
