 Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Kwiecień 2026

1.  [HostGrade.pl](/)
2.  [Baza wiedzy](/baza-wiedzy)
3.  PHP-FPM pool — konfiguracja na VPS

# PHP-FPM pool — konfiguracja wielu stron na VPS

Kategoria: [PHP / VPS](/baza-wiedzy) · Aktualizacja: Kwiecień 2026

## 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](/baza-wiedzy/php-fpm-konfiguracja-optymalizacja), [Nginx vhost konfiguracja](/baza-wiedzy/nginx-vhost-konfiguracja), [Redis cache WordPress](/baza-wiedzy/redis-cache-wordpress) oraz [logi serwera](/baza-wiedzy/logi-serwera-apache-nginx). Porównaj serwery VPS na [stronie VPS](/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\]

## Powiązane strony

-   [PHP-FPM — ogólna optymalizacja](/baza-wiedzy/php-fpm-konfiguracja-optymalizacja)
-   [Nginx vhost — konfiguracja](/baza-wiedzy/nginx-vhost-konfiguracja)
-   [Redis cache dla WordPress](/baza-wiedzy/redis-cache-wordpress)
-   [Logi serwera — jak czytać](/baza-wiedzy/logi-serwera-apache-nginx)
-   [Porównanie serwerów VPS](/vps)