Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

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]