PHP-FPM pool — konfiguracja wielu stron na VPS
Czym jest PHP-FPM pool?
PHP-FPM (FastCGI Process Manager) zarządza procesami PHP jako osobny daemon. Pool to zbiór procesów roboczych powiązany z konkretną konfiguracją — osobnym użytkownikiem, socketem, limitami pamięci. Każda strona powinna mieć własną pulę, co zapewnia:
- Izolację bezpieczeństwa — strona A nie może czytać plików strony B
- Kontrolę zasobów — limit pamięci i procesów per strona
- Monitoring — osobne logi per strona, osobne statystyki
- Niezawodność — awaria jednej puli nie zabija pozostałych
Powiązane tematy: PHP-FPM optymalizacja, Nginx vhost konfiguracja, Redis cache WordPress oraz logi serwera. Porównaj serwery VPS na stronie VPS.
Struktura katalogów PHP-FPM
/etc/php/8.2/fpm/
├── php-fpm.conf # Główna konfiguracja daemona
├── php.ini # Ustawienia PHP dla FPM
└── pool.d/
├── www.conf # Domyślna pula (WYŁĄCZ lub zmodyfikuj)
├── strona1.conf # Pula dla strona1.pl
└── strona2.conf # Pula dla strona2.pl Przykładowa konfiguracja puli — strona1.conf
; /etc/php/8.2/fpm/pool.d/strona1.conf
[strona1]
; Użytkownik i grupa (izolacja)
user = strona1
group = strona1
; Unix socket (szybszy niż TCP dla Nginx na tym samym serwerze)
listen = /run/php/php8.2-fpm-strona1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; Zarządzanie procesami
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
; Logi
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/strona1-error.log
php_admin_flag[log_errors] = on
; Limity PHP dla tej puli
php_admin_value[memory_limit] = 256M
php_admin_value[upload_max_filesize] = 64M
php_admin_value[post_max_size] = 64M
php_admin_value[max_execution_time] = 30
; Bezpieczeństwo — ogranicz ścieżki PHP
php_admin_value[open_basedir] = /var/www/strona1:/tmp
php_admin_value[session.save_path] = /var/lib/php/sessions/strona1 Tryby zarządzania procesami (pm)
| Tryb | Opis | Użyj gdy |
|---|---|---|
static | Stała liczba procesów (pm.max_children) | Stabilny, przewidywalny ruch; dużo RAM |
dynamic | Liczba procesów między min a max | Zmienny ruch; najczęściej używany |
ondemand | Procesy tworzone na żądanie, kasowane po idle | Mało RAM, wiele stron z niskim ruchem |
Ile procesów pm.max_children?
Prosty wzór: (dostępna pamięć RAM dla PHP) / (średnie zużycie PHP na żądanie)
# Sprawdź średnie zużycie pamięci przez procesy PHP
ps --no-headers -o "rss,cmd" -C php-fpm8.2 | awk '{sum+=$1} END {print sum/NR/1024 "MB avg"}'
# Sprawdź dostępną pamięć
free -m
# Przykład: 1 GB RAM, 512 MB dla OS, 512 MB dla PHP, 50 MB per proces = max 10
# pm.max_children = 512 / 50 = ~10 Tworzenie użytkownika systemowego per strona
# Stwórz użytkownika bez logowania (dla bezpieczeństwa)
sudo useradd -r -s /usr/sbin/nologin strona1
# Stwórz katalog strony z odpowiednimi uprawnieniami
sudo mkdir -p /var/www/strona1
sudo chown -R strona1:strona1 /var/www/strona1
sudo chmod 750 /var/www/strona1
# Katalog sesji PHP
sudo mkdir -p /var/lib/php/sessions/strona1
sudo chown strona1:strona1 /var/lib/php/sessions/strona1
sudo chmod 700 /var/lib/php/sessions/strona1 Konfiguracja Nginx z Unix socket
server {
listen 443 ssl http2;
server_name strona1.pl www.strona1.pl;
root /var/www/strona1/public;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm-strona1.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
} Monitorowanie i status puli
; Włącz status page w pool.conf
pm.status_path = /fpm-status
ping.path = /fpm-ping # Nginx — udostępnij status tylko lokalnie
location ~ ^/(fpm-status|fpm-ping)$ {
fastcgi_pass unix:/run/php/php8.2-fpm-strona1.sock;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
allow 127.0.0.1;
deny all;
} # Sprawdź status puli
curl http://127.0.0.1/fpm-status?full
# Przykładowy wynik:
# pool: strona1
# process manager: dynamic
# start time: 01/Jan/2024:12:00:00 +0000
# accepted conn: 15432
# active processes: 3
# idle processes: 2
# max active processes: 8 Restart i przeładowanie konfiguracji
# Przeładuj konfigurację bez restartu (graceful reload)
sudo systemctl reload php8.2-fpm
# Pełny restart (zabija aktywne połączenia)
sudo systemctl restart php8.2-fpm
# Sprawdź poprawność konfiguracji przed reload
sudo php-fpm8.2 -t
# Status
sudo systemctl status php8.2-fpm Typowe problemy
| Problem | Objaw | Rozwiązanie |
|---|---|---|
| 502 Bad Gateway | Nginx nie może połączyć z FPM | Sprawdź czy socket istnieje: ls /run/php/*.sock |
| Wszystkie procesy zajęte | Timeout po obciążeniu | Zwiększ pm.max_children lub optymalizuj kod |
| Permission denied na socket | Nginx zwraca 502 | Sprawdź listen.owner/group i chmod 0660 |
| Memory limit exceeded | PHP Fatal error | Zwiększ php_admin_value[memory_limit] |