====== 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: [[https://www.php.net/manual/en/install.fpm.php|PHP: FPM Installation]] * Nginx + PHP-FPM guide: [[https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/|Nginx Wiki]] * PHP-FPM config options: [[https://www.php.net/manual/en/install.fpm.configuration.php|PHP.net FPM Configuration]] ===== Viz také ===== * [[Nginx]] * [[PHP]] * [[FastCGI]] * [[Web server]] * [[Security best practices]] ---- *Poslední aktualizace: 2026-01-05*