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.
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
Hlavní konfigurační soubory se nacházejí v:
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.
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
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.
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í.
| 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í. |
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