====== 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*