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

PHP-FPM — konfiguracja i optymalizacja na VPS

Ostatnia aktualizacja: kwiecień 2026

TL;DR: Dla VPS 1 GB RAM z WordPressem: pm = dynamic, pm.max_children = 10, pm.start_servers = 3, OPcache 64 MB. Dla 2 GB: max_children = 20, OPcache 128 MB. Sprawdź rzeczywiste zużycie procesu: ps aux | grep php-fpm — dopasuj liczbę procesów do dostępnego RAM.

Czym jest PHP-FPM?

PHP-FPM (FastCGI Process Manager) to implementacja FastCGI dla PHP, domyślna w nowoczesnych konfiguracjach z Nginx. Zarządza pulą procesów PHP obsługujących żądania — w przeciwieństwie do mod_php (Apache) gdzie PHP jest wbudowane w serwer, PHP-FPM to osobny demon.

Klucz do wydajności: prawidłowy dobór liczby procesów (workers). Za mało — kolejkowanie żądań i wolne odpowiedzi. Za dużo — brak RAM, swap, crash.

Konfiguracja puli procesów — plik pool.d/www.conf

Główny plik konfiguracyjny puli: /etc/php/8.2/fpm/pool.d/www.conf

[www]
user = www-data
group = www-data

; Socket Unix — szybszy niż TCP dla lokalnego Nginx
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data

; === ZARZĄDZANIE PROCESAMI ===
; dynamic = procesy tworzone/niszczone wg ruchu (ZALECANE dla VPS)
pm = dynamic

; Maksymalna liczba procesów (workers)
; Wzór: (RAM dla PHP) / (pamięć 1 procesu)
; Przykład VPS 2GB: (1200MB / 60MB) = 20
pm.max_children = 20

; Procesy startujące przy uruchomieniu PHP-FPM
pm.start_servers = 5

; Minimum wolnych (oczekujących) procesów
pm.min_spare_servers = 3

; Maximum wolnych procesów (reszta jest niszczona)
pm.max_spare_servers = 8

; Restart procesu po N żądaniach (zapobiega wyciekowi pamięci)
pm.max_requests = 500

; === LIMITY ===
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 60
php_admin_value[upload_max_filesize] = 64M
php_admin_value[post_max_size] = 64M

; === LOGI ===
; Loguj wolne żądania (powyżej 5 sekund)
slowlog = /var/log/php8.2-fpm-slow.log
request_slowlog_timeout = 5s

Rekomendowane ustawienia wg rozmiaru VPS:

VPS RAM max_children start_servers OPcache
512 MB 5 2 32 MB
1 GB 10 3 64 MB
2 GB 20 5 128 MB
4 GB 40 8 256 MB

Konfiguracja OPcache

OPcache konfiguruj w /etc/php/8.2/fpm/conf.d/10-opcache.ini:

[opcache]
opcache.enable = 1
opcache.enable_cli = 0

; Pamięć dla skompilowanych skryptów (MB)
; WordPress + wtyczki: min 128MB zalecane
opcache.memory_consumption = 128

; Pamięć dla intern strings
opcache.interned_strings_buffer = 16

; Max liczba plików PHP w cache
opcache.max_accelerated_files = 10000

; Sprawdzaj zmiany co N sekund (0 = sprawdzaj zawsze; prod: 60-300)
opcache.revalidate_freq = 60

; Wyłącz w produkcji dla max wydajności (cache nie sprawdza zmian)
; Pamiętaj: po deployu wykonaj opcache_reset() lub restart php-fpm
; opcache.validate_timestamps = 0

; Zapisuj bajtkody na dysk (szybki zimny start po restarcie)
opcache.file_cache = /tmp/php-opcache
opcache.file_cache_only = 0

; Dobre dla stabilnych aplikacji
opcache.save_comments = 1
# Po każdej zmianie konfiguracji — restart PHP-FPM:
sudo systemctl restart php8.2-fpm

# Weryfikacja konfiguracji:
sudo php-fpm8.2 -t

# Status OPcache (przez PHP):
php -r "print_r(opcache_get_status());" | head -30

Wiele pul procesów — osobna konfiguracja per strona

Jeśli hostujesz wiele stron, warto użyć oddzielnych pul PHP-FPM — izolacja procesów, osobne limity pamięci, osobne użytkowniki systemowe:

# /etc/php/8.2/fpm/pool.d/site1.conf
[site1]
user = site1
group = site1
listen = /run/php/php8.2-site1.sock
pm = ondemand          ; oszczędny tryb dla małych stron
pm.max_children = 5
pm.process_idle_timeout = 10s
pm.max_requests = 200

# /etc/php/8.2/fpm/pool.d/site2.conf
[site2]
user = site2
group = site2
listen = /run/php/php8.2-site2.sock
pm = dynamic           ; aktywny tryb dla głównej strony
pm.max_children = 15
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 6

Najczęstsze pytania

Ile pamięci RAM zajmuje jeden proces PHP-FPM? +
Jeden proces PHP-FPM z WordPressem zajmuje zazwyczaj 32-80 MB RAM. Przy typowej instalacji WP (kilka wtyczek) możesz przyjąć ~50 MB jako punkt startowy. Sprawdź rzeczywiste zużycie: ps aux | grep php | awk '{sum += $6} END {print sum/1024 " MB}'. Na VPS 1 GB RAM zostaw 400 MB dla systemu, MySQL i Nginx — masz ~600 MB dla PHP-FPM = max 12 procesów po 50 MB.
Jaka jest różnica między pm=static, pm=dynamic i pm=ondemand? +
static: stała liczba procesów (pm.max_children). Przewidywalne zużycie RAM, szybka odpowiedź. Dobre dla serwerów ze stabilnym ruchem. dynamic: procesy tworzą się i niszczą w zależności od ruchu (parametry: start_servers, min/max_spare_servers, max_children). Balans między wydajnością a oszczędnością RAM. ondemand: procesy tworzone tylko na żądanie, niszczone po pm.process_idle_timeout. Najmniejsze zużycie RAM w spoczynku — dobre dla rzadko odwiedzanych stron na VPS z małą ilością pamięci.
Co to jest OPcache i jak go skonfigurować dla WordPressa? +
OPcache to wbudowane w PHP rozszerzenie cache'ujące skompilowane bajtkody skryptów. Zamiast parsować i kompilować PHP przy każdym żądaniu, OPcache przechowuje gotowe bajtkody w pamięci — skraca czas wykonania PHP o 30-70%. Minimalna konfiguracja dla WordPressa: opcache.enable=1, opcache.memory_consumption=128 (MB), opcache.max_accelerated_files=10000, opcache.revalidate_freq=60 (sekundy). Na produkcji ustaw opcache.validate_timestamps=0 dla maksymalnej wydajności (pamiętaj o opcache_reset() przy deployu).
Jak sprawdzić czy PHP-FPM działa i jakie ma obciążenie? +
Włącz status page w konfiguracji PHP-FPM: pm.status_path = /status. Następnie w Nginx dodaj location /fpm-status { fastcgi_pass unix:/var/run/php/phpX.X-fpm.sock; include fastcgi_params; } (ogranicz dostęp do 127.0.0.1). Sprawdź przez: curl http://127.0.0.1/fpm-status?full. Zobaczysz: active processes, idle processes, accepted connections, max children reached (jeśli > 0 — potrzebujesz więcej procesów). Użyj też: php-fpm8.2 -t (test konfiguracji).

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.