Jak zrestartować PHP-FPM: Każda metoda wyjaśniona dla administratorów Linux
PHP-FPM (PHP FastCGI Process Manager) to wysokowydajny menedżer procesów obsługujący wykonywanie PHP jako oddzielną usługę, niezależną od serwera WWW. Ponowne uruchomienie PHP-FPM stosuje zmiany konfiguracji z `php.ini` lub `php-fpm.conf`, odzyskuje wyciekającą pamięć w długo działających pulach procesów roboczych i przywraca działanie nieresponsywnych procesów potomnych — bez dotykania Nginx, Apache ani żadnego innego komponentu stosu.
Ten przewodnik obejmuje wszystkie praktyczne metody ponownego uruchamiania dostępne w nowoczesnych i starszych dystrybucjach Linux, w tym sterowanie oparte na sygnałach, środowiska z wieloma wersjami oraz strategie płynnego przeładowania dla wdrożeń produkcyjnych bez przestojów.
Dlaczego musisz ponownie uruchomić PHP-FPM
Zrozumienie dokładnej przyczyny ponownego uruchomienia zapobiega niepotrzebnym przestojom i pomaga wybrać najmniej destrukcyjną metodę:
- Zmiany konfiguracji: Modyfikacje `php.ini`, `php-fpm.conf` lub dowolnego pliku konfiguracji puli w `/etc/php/<version>/fpm/pool.d/` wymagają ponownego uruchomienia lub przeładowania, aby wejść w życie. PHP-FPM odczytuje te pliki tylko przy uruchomieniu lub po sygnale `USR2`.
- Odzyskiwanie pamięci: Procesy robocze PHP-FPM gromadzą pamięć z czasem, szczególnie na serwerach o dużym ruchu uruchamiających aplikacje intensywnie korzystające z pamięci. Kontrolowane ponowne uruchomienie recykluje procesy robocze i resetuje ich zużycie pamięci.
- Nieresponsywne procesy robocze: Jeśli procesy potomne przejdą w stan zombie lub przestaną akceptować połączenia, ponowne uruchomienie czyści tablicę procesów i tworzy nową pulę.
- Rotacja logów: Po tym, jak `logrotate` zmieni nazwę lub skompresuje aktywny plik logu, PHP-FPM nadal przechowuje deskryptor pliku do starego i-węzła. Przeładowanie wymusza otwarcie nowego deskryptora pliku, zapewniając ciągłość logowania.
- Unieważnienie OPcache: Podczas wdrażania nowego kodu aplikacji ponowne uruchomienie PHP-FPM całkowicie opróżnia OPcache, gwarantując, że procesy robocze wykonują zaktualizowany kod bajtowy, a nie przestarzałe wersje z pamięci podręcznej.
- Zmiany rozszerzeń lub modułów: Dodawanie lub usuwanie rozszerzeń PHP w `php.ini` wymaga pełnego ponownego uruchomienia — samo przeładowanie jest niewystarczające, ponieważ lista rozszerzeń jest oceniana podczas inicjalizacji procesu.
Wymagania wstępne
Przed wykonaniem jakiegokolwiek polecenia ponownego uruchomienia potwierdź następujące kwestie:
- Masz dostęp `root` lub uprawnienia `sudo` na serwerze.
- Znasz dokładną nazwę usługi PHP-FPM w swoim systemie (różni się w zależności od dystrybucji i zainstalowanej wersji).
- Zidentyfikowałeś ścieżkę do pliku PID, jeśli planujesz używać sterowania opartego na sygnałach (zazwyczaj `/run/php/php<version>-fpm.pid` w Debian/Ubuntu lub `/run/php-fpm/php-fpm.pid` w RHEL/CentOS).
Aby odkryć aktywną nazwę usługi PHP-FPM:
“`bash
systemctl list-units –type=service | grep fpm
“`
Aby zlokalizować ścieżkę do pliku PID:
“`bash
grep -i pid /etc/php/*/fpm/php-fpm.conf
“`
Metoda 1: Ponowne uruchomienie PHP-FPM za pomocą systemctl (zalecane)
`systemctl` to autorytatywny menedżer usług we wszystkich dystrybucjach opartych na systemd, w tym Ubuntu 16.04+, Debian 8+, CentOS 7+, AlmaLinux, Rocky Linux i Fedora. Jest to właściwe narzędzie dla zdecydowanej większości serwerów produkcyjnych.
Standardowe ponowne uruchomienie
“`bash
sudo systemctl restart php8.2-fpm
“`
Zastąp `php8.2-fpm` wersją zainstalowaną w swoim systemie (np. `php7.4-fpm`, `php8.1-fpm`, `php-fpm`). W systemach opartych na RHEL usługa jest zazwyczaj nazwana `php-fpm` bez prefiksu wersji.
Przeładowanie bez pełnego ponownego uruchomienia
Przeładowanie wysyła wewnętrznie sygnał `USR2`, instruując proces główny, aby ponownie odczytał konfigurację i płynnie zastąpił procesy robocze. Istniejące żądania w trakcie realizacji są kończone przed recyklingiem procesów roboczych:
“`bash
sudo systemctl reload php8.2-fpm
“`
Kluczowa różnica: `reload` jest niezakłócające i preferowane przy zmianach konfiguracji w środowisku produkcyjnym. `restart` natychmiast kończy wszystkie procesy robocze, co może przerywać aktywne połączenia przy dużej współbieżności.
Zatrzymanie i uruchomienie osobno
“`bash
sudo systemctl stop php8.2-fpm
sudo systemctl start php8.2-fpm
“`
Użyj tego dwuetapowego podejścia, gdy musisz potwierdzić, że usługa jest całkowicie zatrzymana przed jej ponownym uruchomieniem — na przykład po zmianie ścieżki gniazda `listen` lub znaczącej modyfikacji `pm.max_children`.
Weryfikacja stanu usługi
“`bash
sudo systemctl status php8.2-fpm
“`
Prawidłowe wyjście pokazuje `Active: active (running)` i wyświetla PID procesu głównego. Jeśli usługa nie uruchomiła się, `systemctl status` wyświetla ostatnie wpisy dziennika, co jest szybsze niż ręczne przeszukiwanie plików logów.
Aby strumieniować logi na żywo podczas ponownego uruchomienia:
“`bash
sudo journalctl -u php8.2-fpm -f
“`
Metoda 2: Ponowne uruchomienie PHP-FPM za pomocą starszego polecenia service
Polecenie `service` jest opakowaniem kompatybilności dla `systemctl` w nowoczesnych systemach i bezpośrednio wywołuje skrypty SysVinit w starszych dystrybucjach (Ubuntu 14.04, CentOS 6, Debian 7). Pozostaje istotne przy zarządzaniu serwerami, które nie zostały zmigrowane do systemd.
“`bash
sudo service php-fpm restart
“`
Aby zatrzymać i uruchomić niezależnie:
“`bash
sudo service php-fpm stop
sudo service php-fpm start
“`
W dystrybucjach nadal używających SysVinit, podstawowy skrypt znajduje się w `/etc/init.d/php-fpm`. Możesz wywołać go bezpośrednio, jeśli opakowanie `service` jest niedostępne:
“`bash
sudo /etc/init.d/php-fpm restart
“`
Metoda 3: Zarządzanie wieloma wersjami PHP jednocześnie
Serwery z panelami sterowania takimi jak cPanel, Plesk lub niestandardowymi konfiguracjami wielodostępnymi często mają kilka wersji PHP zainstalowanych równolegle. Każda wersja działa jako niezależna usługa PHP-FPM z własnym drzewem konfiguracji, gniazdem i plikiem PID.
Ponowne uruchomienie konkretnej wersji
“`bash
Debian/Ubuntu (packages from ondrej/php PPA or distribution repos)
sudo systemctl restart php7.4-fpm
sudo systemctl restart php8.1-fpm
sudo systemctl restart php8.2-fpm
RHEL/CentOS with Remi repository
sudo systemctl restart php74-php-fpm
sudo systemctl restart php81-php-fpm
“`
Ponowne uruchomienie wszystkich wersji PHP-FPM jednocześnie
Gdy zmiana systemowa dotyczy wszystkich wersji (np. aktualizacja biblioteki współdzielonej), uruchom ponownie wszystkie instancje za pomocą jednej pętli:
“`bash
for ver in 7.4 8.1 8.2; do
sudo systemctl restart php${ver}-fpm && echo "php${ver}-fpm restarted"
done
“`
Identyfikacja wersji obsługującej konkretną witrynę
Każdy wirtualny host Nginx lub VirtualHost Apache jest mapowany na konkretne gniazdo PHP-FPM. Sprawdź konfigurację witryny, aby określić, która wersja jest aktywna przed ponownym uruchomieniem:
“`bash
Nginx
grep fastcgi_pass /etc/nginx/sites-enabled/yourdomain.conf
Apache with mod_proxy_fcgi
grep SetHandler /etc/apache2/sites-enabled/yourdomain.conf
“`
Jeśli zarządzasz serwerem przez panel sterowania, VPS z cPanel zapewnia graficzny interfejs do przełączania wersji PHP dla każdej domeny bez ręcznego ponownego uruchamiania usług.
Metoda 4: Wysyłanie sygnałów POSIX bezpośrednio do procesu głównego
Proces główny PHP-FPM reaguje na zdefiniowany zestaw sygnałów POSIX. Ta metoda całkowicie omija system init i daje precyzyjną, niskopoziomową kontrolę — niezbędną w środowiskach kontenerowych, niestandardowych systemach init lub gdy `systemctl` jest niedostępny.
Tabela referencyjna sygnałów
| Sygnał | Efekt | Przypadek użycia |
|---|
| — | — | — |
|---|
| `SIGTERM` (15) | Płynne zamknięcie | Uporządkowane zatrzymanie, czeka na zakończenie procesów roboczych |
|---|
| `SIGINT` (2) | Natychmiastowe zamknięcie | Wymuszone zatrzymanie, gdy płynne zamknięcie się zawiesza |
|---|
| `SIGQUIT` (3) | Płynne zatrzymanie | Odpowiednik SIGTERM dla PHP-FPM |
|---|
| `SIGUSR1` (10) | Ponowne otwarcie plików logów | Odświeżenie deskryptora pliku logu po logrotate |
|---|
| `SIGUSR2` (12) | Płynne przeładowanie | Przeładowanie konfiguracji, recykling procesów roboczych bez przerywania połączeń |
|---|
| `SIGKILL` (9) | Wymuszone zabicie | Ostateczność — brak czyszczenia, brak płynnej obsługi |
|---|
Przeładowanie konfiguracji (zero przestojów)
“`bash
sudo kill -USR2 $(cat /run/php/php8.2-fpm.pid)
“`
Jest to funkcjonalnie równoważne `systemctl reload` i jest najbezpieczniejszym sposobem stosowania zmian `php-fpm.conf` lub konfiguracji puli na działającym serwerze.
Ponowne otwarcie plików logów po rotacji
“`bash
sudo kill -USR1 $(cat /run/php/php8.2-fpm.pid)
“`
Uruchom to natychmiast po wykonaniu `logrotate`, aby zapobiec dalszemu zapisywaniu przez PHP-FPM do przemianowanego pliku logu.
Płynne zamknięcie
“`bash
sudo kill -QUIT $(cat /run/php/php8.2-fpm.pid)
“`
Proces główny przestaje akceptować nowe połączenia i czeka, aż wszystkie aktywne procesy robocze zakończą swoje bieżące żądania przed wyjściem. Następnie użyj `sudo systemctl start php8.2-fpm`, aby przywrócić usługę.
Ważne: Zawsze weryfikuj ścieżkę do pliku PID przed użyciem tych poleceń. Nieprawidłowa ścieżka skutkuje wysłaniem sygnału do niezwiązanego procesu. Potwierdź za pomocą:
“`bash
cat /run/php/php8.2-fpm.pid
ps aux | grep php-fpm
“`
Metoda 5: Wymuszone zabijanie procesów PHP-FPM za pomocą pkill lub killall
Jest to metoda ostateczna w sytuacjach, gdy PHP-FPM stał się całkowicie nieresponsywny, a ani `systemctl`, ani sterowanie oparte na sygnałach nie przynosi rezultatów. Bezwarunkowo kończy wszystkie procesy PHP-FPM, co przerwie wszelkie żądania w trakcie realizacji.
“`bash
sudo pkill -9 php-fpm
“`
Lub używając `killall`:
“`bash
sudo killall -9 php-fpm
“`
Po wymuszonym zabicu usługa nie uruchomi się automatycznie, chyba że jest zarządzana przez nadzorcę procesów. Uruchom ją jawnie:
“`bash
sudo systemctl start php8.2-fpm
“`
Kiedy używać tej metody: Nagromadzenie procesów zombie, niekontrolowane procesy potomne zużywające 100% CPU lub sytuacje, gdy proces główny żyje, ale nie zarządza już swoją pulą. Przed sięgnięciem po `pkill -9`, najpierw spróbuj `kill -QUIT` na PID procesu głównego — jest to znacznie mniej destrukcyjne.
Metoda 6: Ponowne uruchomienie serwera WWW w celu pośredniego wpływu na PHP-FPM
Ponowne uruchomienie Nginx lub Apache nie uruchamia ponownie PHP-FPM. Ponieważ PHP-FPM działa jako całkowicie niezależna usługa komunikująca się przez gniazdo Unix lub port TCP, ponowne uruchomienie serwera WWW wpływa tylko na warstwę HTTP. Jest to powszechne nieporozumienie.
“`bash
Nginx
sudo systemctl restart nginx
Apache
sudo systemctl restart apache2
“`
Jedynym scenariuszem, w którym ponowne uruchomienie serwera WWW jest istotne dla PHP-FPM, jest sytuacja, gdy zmodyfikowałeś dyrektywę `fastcgi_pass` w Nginx lub regułę `ProxyPassMatch` w Apache, aby wskazywała na inne gniazdo PHP-FPM. W takim przypadku Nginx musi przeładować swoją konfigurację, aby połączyć się z nową ścieżką gniazda — ale sam PHP-FPM nadal wymaga własnego oddzielnego ponownego uruchomienia.
W przypadku pełnej konserwacji stosu uruchom ponownie obie usługi w odpowiedniej kolejności: najpierw PHP-FPM, a następnie serwer WWW.
Porównanie: Metody ponownego uruchamiania PHP-FPM w skrócie
| Metoda | Przykład polecenia | Poziom zakłócenia | Przypadek użycia |
|---|
| — | — | — | — |
|---|
| `systemctl restart` | `systemctl restart php8.2-fpm` | Średni — przerywa aktywne połączenia | Standardowe zmiany konfiguracji, dev/staging |
|---|
| `systemctl reload` | `systemctl reload php8.2-fpm` | Brak — płynny recykling procesów roboczych | Zmiany konfiguracji produkcyjnej |
|---|
| `kill -USR2` | `kill -USR2 $(cat /run/php/php-fpm.pid)` | Brak — płynne przeładowanie | Środowiska produkcyjne, kontenerowe |
|---|
| `kill -QUIT` | `kill -QUIT $(cat /run/php/php-fpm.pid)` | Niski — czeka na zakończenie żądań | Kontrolowane zamknięcie przed konserwacją |
|---|
| `kill -USR1` | `kill -USR1 $(cat /run/php/php-fpm.pid)` | Brak — tylko odświeżenie deskryptora pliku logu | Po logrotate |
|---|
| `service restart` | `service php-fpm restart` | Średni | Starsze systemy SysVinit |
|---|
| `pkill -9` | `pkill -9 php-fpm` | Wysoki — natychmiastowe zakończenie | Nieresponsywne procesy, ostateczność |
|---|
| Ponowne uruchomienie serwera WWW | `systemctl restart nginx` | Tylko warstwa WWW | Aktualizacja ścieżki gniazda fastcgi w konfiguracji serwera WWW |
|---|
Konfiguracja puli PHP-FPM: Co wymaga ponownego uruchomienia, a co przeładowania
Nie wszystkie zmiany konfiguracji mają takie samo znaczenie. Wiedza o tym, które zmiany wymagają pełnego ponownego uruchomienia, a które prostego przeładowania, zmniejsza niepotrzebne przestoje:
Przeładowanie (`USR2` / `systemctl reload`) jest wystarczające dla:
- `pm.max_children`, `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers`
- `request_terminate_timeout`, `request_slowlog_timeout`
- Zmiany ścieżki `slowlog`
- Dyrektywy `php_admin_value` i `php_flag` w plikach puli
- Zmiany ścieżki `access.log`
Pełne ponowne uruchomienie wymagane dla:
- Zmian dyrektywy `listen` (ścieżka gniazda lub port TCP)
- Dodawania lub usuwania rozszerzeń PHP w `php.ini`
- Zmiany dyrektyw `user` lub `group` w puli
- Modyfikacji ścieżek `include` w `php-fpm.conf`
- Aktualizacji samego pliku binarnego PHP (aktualizacje wersji)
Najlepsze praktyki dla produkcyjnych ponownych uruchomień PHP-FPM
- Zawsze preferuj `reload` zamiast `restart` na działających serwerach. Przeładowanie recykluje procesy robocze płynnie, kończąc żądania w trakcie realizacji przed tworzeniem zamienników. Twarde ponowne uruchomienie natychmiast przerywa wszystkie aktywne połączenia.
- Weryfikuj konfigurację przed przeładowaniem. PHP-FPM zapewnia wbudowane sprawdzanie składni, które zapobiega ładowaniu uszkodzonej konfiguracji:
“`bash
sudo php-fpm8.2 -t
Expected output: NOTICE: configuration file … test is successful
“`
- Sprawdzaj logi przed i po. Przejrzyj `/var/log/php8.2-fpm.log` (lub ścieżkę zdefiniowaną w `php-fpm.conf`) pod kątem wpisów `WARNING` lub `ERROR` wskazujących na błędy uruchamiania puli.
- Monitoruj metryki puli procesów roboczych po ponownym uruchomieniu. Użyj strony statusu PHP-FPM (włączonej przez `pm.status_path` w konfiguracji puli), aby zweryfikować, że oczekiwana liczba procesów roboczych jest aktywna i bezczynna po ponownym uruchomieniu.
- Automatyzuj za pomocą potoków wdrożeniowych. W przepływach pracy CI/CD wyzwalaj `systemctl reload php-fpm` jako hook po wdrożeniu, a nie pełne ponowne uruchomienie. Zapewnia to wdrożenia bez przestojów przy każdym wypchnięciu kodu.
- Ustaw `pm.max_requests` do automatycznego recyklingu procesów roboczych. Zamiast planować okresowe ponowne uruchomienia w celu zwalczania wycieków pamięci, skonfiguruj `pm.max_requests = 500` (lub odpowiednią wartość), aby automatycznie restartować każdy proces roboczy po obsłużeniu określonej liczby żądań.
PHP-FPM w środowiskach VPS i serwerów dedykowanych
Metoda ponownego uruchomienia, której używasz, zależy również od środowiska hostingowego. W planie Hosting VPS z pełnym dostępem root wszystkie metody opisane w tym przewodniku są dostępne bez ograniczeń. Masz bezpośredni dostęp do `systemctl`, pliku PID i tablicy procesów.
Na Serwerach Dedykowanych, gdzie kontrolujesz cały stos sprzętowy, możesz dodatkowo skonfigurować PHP-FPM z `pm = ondemand` lub `pm = dynamic` w celu precyzyjnego dostrojenia zachowania tworzenia procesów roboczych oraz używać plików drop-in `systemd` do dostosowywania polityk ponownego uruchamiania (np. `Restart=on-failure`, `RestartSec=5s`).
Jeśli zarządzasz wieloma witrynami klientów przez rozwiązanie Paneli Sterowania VPS, operacje ponownego uruchamiania PHP-FPM są często abstrakcyjnie przedstawione w interfejsie panelu, ale zrozumienie podstawowych poleceń pozostaje niezbędne w scenariuszach rozwiązywania problemów, gdy sam panel jest nieresponsywny.
W przypadku aplikacji wymagających wysokiej współbieżności PHP — takich jak Laravel, WordPress multisite lub sklepy WooCommerce — połączenie PHP-FPM z odpowiednio dostrojoną konfiguracją puli na Serwerze Dedykowanym eliminuje rywalizację o zasoby, którą wprowadzają środowiska współdzielone.
Macierz decyzyjna: Wybór właściwej metody ponownego uruchomienia
Użyj tej macierzy, aby wybrać właściwe podejście na podstawie swojej konkretnej sytuacji:
| Sytuacja | Zalecana metoda |
|---|
| — | — |
|---|
| Zastosowano zmiany w `php.ini` lub plikach puli `.conf` | `systemctl reload php<ver>-fpm` |
|---|
| Dodano nowe rozszerzenie PHP | `systemctl restart php<ver>-fpm` |
|---|
| PHP-FPM jest nieresponsywny, proces główny żyje | `kill -QUIT <master_pid>`, następnie `systemctl start` |
|---|
| PHP-FPM jest całkowicie zamrożony, brak odpowiedzi na sygnały | `pkill -9 php-fpm`, następnie `systemctl start` |
|---|
| Odświeżenie pliku logu po logrotate | `kill -USR1 <master_pid>` |
|---|
| Wdrażanie nowego kodu aplikacji (opróżnienie OPcache) | `systemctl reload php<ver>-fpm` lub `kill -USR2` |
|---|
| Zmieniono ścieżkę gniazda `listen` | `systemctl restart php<ver>-fpm` |
|---|
| Wiele wersji PHP, jedna wymaga aktualizacji | Tylko `systemctl restart php<specific-ver>-fpm` |
|---|
| Środowisko kontenerowe bez systemd | `kill -USR2 <master_pid>` przez skrypt entrypoint |
|---|
| Sprawdzanie składni konfiguracji przed zastosowaniem | Najpierw `php-fpm<ver> -t`, następnie przeładowanie/ponowne uruchomienie |
|---|
FAQ
Jaka jest różnica między `systemctl restart` a `systemctl reload` dla PHP-FPM?
`restart` natychmiast kończy wszystkie procesy główne i robocze i uruchamia od nowa, przerywając wszelkie żądania w trakcie realizacji. `reload` wysyła sygnał `USR2` do procesu głównego, który tworzy nowe procesy robocze ze zaktualizowaną konfiguracją, podczas gdy istniejące procesy robocze kończą swoje bieżące żądania przed wyjściem. Zawsze używaj `reload` w środowisku produkcyjnym.
Jak znaleźć właściwą nazwę usługi PHP-FPM na moim serwerze?
Uruchom `systemctl list-units –type=service | grep fpm`. W systemach Debian/Ubuntu z wieloma wersjami z PPA `ondrej/php` zobaczysz wpisy takie jak `php7.4-fpm.service` i `php8.2-fpm.service`. W RHEL/CentOS z repozytorium Remi konwencja nazewnictwa to `php74-php-fpm.service`.
Czy ponowne uruchomienie PHP-FPM wpływa na aktywne połączenia z bazą danych lub sesje użytkowników?
Twarde ponowne uruchomienie (`systemctl restart`) natychmiast kończy wszystkie procesy robocze, co zamyka wszelkie trwałe połączenia z bazą danych przechowywane przez te procesy. Sesje użytkowników przechowywane w plikach lub bazie danych nie są dotknięte, ponieważ utrzymują się niezależnie od procesów roboczych PHP-FPM. Płynne przeładowanie (`systemctl reload`) pozwala procesom roboczym zakończyć bieżące żądania, więc trwałe połączenia są zamykane czysto.
Dlaczego PHP-FPM nie uruchamia się po ponownym uruchomieniu?
Najczęstsze przyczyny to błąd składni w `php.ini` lub pliku konfiguracji puli, konflikt portu lub ścieżki gniazda (inny proces już nasłuchuje na skonfigurowanym adresie `listen`) lub niewystarczające uprawnienia do katalogu gniazda. Uruchom `php-fpm<ver> -t`, aby zweryfikować składnię konfiguracji, i sprawdź `journalctl -u php<ver>-fpm` w celu uzyskania dokładnego komunikatu o błędzie.
Czy mogę ponownie uruchomić PHP-FPM bez uprawnień root lub sudo?
Nie w standardowej instalacji Linux. Proces główny PHP-FPM działa jako root (obniża uprawnienia do skonfigurowanego `user`/`group` dla procesów roboczych), a zarządzanie usługami systemowymi wymaga podwyższonych uprawnień. W środowiskach hostingu współdzielonego dostawca hostingu obsługuje ponowne uruchomienia PHP-FPM przez swój panel sterowania. Dla pełnej kontroli nad PHP-FPM, plan Hosting VPS z dostępem root jest odpowiednim rozwiązaniem.
