15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
09.10.2024

Cum să Reporniți PHP-FPM: Fiecare Metodă Explicată pentru Administratorii Linux

PHP-FPM (PHP FastCGI Process Manager) este un manager de procese de înaltă performanță care gestionează execuția PHP ca un serviciu separat, decuplat de serverul web. Repornirea PHP-FPM aplică modificările de configurare din `php.ini` sau `php-fpm.conf`, recuperează memoria scursă în pool-urile de lucru cu rulare îndelungată și recuperează procesele copil care nu răspund — toate fără a atinge Nginx, Apache sau orice altă componentă a stivei tale.

Acest ghid acoperă fiecare metodă practică de repornire disponibilă pe distribuțiile Linux moderne și vechi, inclusiv controlul bazat pe semnale, mediile cu mai multe versiuni și strategiile de reîncărcare gracioasă pentru implementări în producție fără timp de nefuncționare.

De ce trebuie să repornești PHP-FPM

Înțelegerea declanșatorului exact pentru o repornire previne timpii de nefuncționare inutili și te ajută să alegi metoda cea mai puțin perturbatoare:

  • Modificări de configurare: Modificările la `php.ini`, `php-fpm.conf` sau orice fișier de configurare a pool-ului din `/etc/php/<version>/fpm/pool.d/` necesită o repornire sau reîncărcare pentru a intra în vigoare. PHP-FPM citește aceste fișiere doar la pornire sau la un semnal `USR2`.
  • Recuperarea memoriei: Procesele worker PHP-FPM acumulează memorie în timp, în special pe serverele cu trafic intens care rulează aplicații intensive în memorie. O repornire controlată reciclează workerii și resetează amprenta lor de memorie.
  • Workeri care nu răspund: Dacă procesele copil intră într-o stare zombie sau încetează să accepte conexiuni, o repornire curăță tabelul de procese și generează un pool nou.
  • Rotația jurnalelor: După ce `logrotate` redenumește sau comprimă fișierul jurnal activ, PHP-FPM încă deține un descriptor de fișier pentru vechiul inode. O reîncărcare îl forțează să deschidă noul descriptor de fișier, asigurând continuitatea jurnalelor.
  • Invalidarea OPcache: La implementarea unui nou cod de aplicație, repornirea PHP-FPM golește complet OPcache, garantând că workerii execută bytecode-ul actualizat în loc de versiunile cache stale.
  • Modificări de extensii sau module: Adăugarea sau eliminarea extensiilor PHP în `php.ini` necesită o repornire completă — o simplă reîncărcare este insuficientă deoarece lista de extensii este evaluată la inițializarea procesului.

Cerințe preliminare

Înainte de a executa orice comandă de repornire, confirmă următoarele:

  • Ai acces `root` sau privilegii `sudo` pe server.
  • Cunoști numele exact al serviciului PHP-FPM pe sistemul tău (variază în funcție de distribuție și versiunea instalată).
  • Ai identificat calea fișierului PID dacă plănuiești să folosești controlul bazat pe semnale (de obicei `/run/php/php<version>-fpm.pid` pe Debian/Ubuntu sau `/run/php-fpm/php-fpm.pid` pe RHEL/CentOS).

Pentru a descoperi numele activ al serviciului PHP-FPM:

“`bash

systemctl list-units –type=service | grep fpm

“`

Pentru a localiza calea fișierului PID:

“`bash

grep -i pid /etc/php/*/fpm/php-fpm.conf

“`

Metoda 1: Repornirea PHP-FPM cu systemctl (Recomandat)

`systemctl` este managerul de servicii autorizat pe toate distribuțiile bazate pe systemd, inclusiv Ubuntu 16.04+, Debian 8+, CentOS 7+, AlmaLinux, Rocky Linux și Fedora. Este instrumentul corect pentru marea majoritate a serverelor de producție.

Repornire standard

“`bash

sudo systemctl restart php8.2-fpm

“`

Înlocuiește `php8.2-fpm` cu versiunea instalată pe sistemul tău (ex., `php7.4-fpm`, `php8.1-fpm`, `php-fpm`). Pe sistemele bazate pe RHEL, serviciul este de obicei numit `php-fpm` fără prefix de versiune.

Reîncărcare fără repornire completă

O reîncărcare trimite intern un semnal `USR2`, instruind procesul master să recitească configurația și să înlocuiască gracios procesele worker. Cererile în zbor existente sunt finalizate înainte ca workerii să fie reciclați:

“`bash

sudo systemctl reload php8.2-fpm

“`

Distincție critică: `reload` este non-perturbator și preferat pentru modificările de configurare în producție. `restart` termină imediat toți workerii, ceea ce poate abandona conexiunile active în condiții de concurență ridicată.

Oprire și pornire separat

“`bash

sudo systemctl stop php8.2-fpm

sudo systemctl start php8.2-fpm

“`

Folosește această abordare în doi pași când trebuie să confirmi că serviciul este complet oprit înainte de a-l reporni — de exemplu, după schimbarea căii socket-ului `listen` sau modificarea semnificativă a `pm.max_children`.

Verificarea stării serviciului

“`bash

sudo systemctl status php8.2-fpm

“`

O ieșire sănătoasă arată `Active: active (running)` și listează PID-ul master. Dacă serviciul nu a reușit să pornească, `systemctl status` afișează ultimele intrări din jurnal, ceea ce este mai rapid decât căutarea manuală prin fișierele jurnal.

Pentru a transmite jurnale live în timpul unei reporniri:

“`bash

sudo journalctl -u php8.2-fpm -f

“`

Metoda 2: Repornirea PHP-FPM cu comanda service moștenită

Comanda `service` este un wrapper de compatibilitate în jurul `systemctl` pe sistemele moderne și invocă direct scripturile SysVinit pe distribuțiile mai vechi (Ubuntu 14.04, CentOS 6, Debian 7). Rămâne relevantă la gestionarea serverelor care nu au fost migrate la systemd.

“`bash

sudo service php-fpm restart

“`

Pentru a opri și porni independent:

“`bash

sudo service php-fpm stop

sudo service php-fpm start

“`

Pe distribuțiile care încă folosesc SysVinit, scriptul de bază se află la `/etc/init.d/php-fpm`. Îl poți invoca direct dacă wrapper-ul `service` nu este disponibil:

“`bash

sudo /etc/init.d/php-fpm restart

“`

Metoda 3: Gestionarea mai multor versiuni PHP simultan

Serverele care rulează panouri de control precum cPanel, Plesk sau configurații personalizate multi-tenant au frecvent mai multe versiuni PHP instalate în paralel. Fiecare versiune rulează ca un serviciu PHP-FPM independent cu propriul arbore de configurare, socket și fișier PID.

Repornirea unei versiuni specifice

“`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

“`

Repornirea tuturor versiunilor PHP-FPM simultan

Când o modificare la nivel de sistem afectează toate versiunile (cum ar fi o actualizare a bibliotecii partajate), repornește toate instanțele cu o singură buclă:

“`bash

for ver in 7.4 8.1 8.2; do

sudo systemctl restart php${ver}-fpm && echo "php${ver}-fpm restarted"

done

“`

Identificarea versiunii care servește un site specific

Fiecare gazdă virtuală Nginx sau VirtualHost Apache se mapează la un socket PHP-FPM specific. Verifică configurația site-ului pentru a determina ce versiune este activă înainte de repornire:

“`bash

Nginx

grep fastcgi_pass /etc/nginx/sites-enabled/yourdomain.conf

Apache with mod_proxy_fcgi

grep SetHandler /etc/apache2/sites-enabled/yourdomain.conf

“`

Dacă îți gestionezi serverul printr-un panou de control, VPS cu cPanel oferă o interfață grafică pentru schimbarea versiunilor PHP per domeniu fără reporniri manuale ale serviciului.

Metoda 4: Trimiterea semnalelor POSIX direct la procesul master

Procesul master PHP-FPM răspunde la un set definit de semnale POSIX. Această metodă ocolește complet sistemul init și îți oferă control precis, la nivel scăzut — esențial în mediile containerizate, sistemele init personalizate sau când `systemctl` nu este disponibil.

Tabel de referință pentru semnale

SemnalEfectCaz de utilizare
`SIGTERM` (15)Oprire gracioasăOprire ordonată, așteaptă finalizarea workerilor
`SIGINT` (2)Oprire imediatăOprire forțată când oprirea gracioasă se blochează
`SIGQUIT` (3)Oprire gracioasăEchivalent cu SIGTERM pentru PHP-FPM
`SIGUSR1` (10)Redeschidere fișiere jurnalReîmprospătarea descriptorului de fișier jurnal după logrotate
`SIGUSR2` (12)Reîncărcare gracioasăReîncarcă configurația, reciclează workerii fără a abandona conexiunile
`SIGKILL` (9)Terminare forțatăUltimă soluție — fără curățare, fără gestionare gracioasă

Reîncărcarea configurației (fără timp de nefuncționare)

“`bash

sudo kill -USR2 $(cat /run/php/php8.2-fpm.pid)

“`

Aceasta este echivalentă funcțional cu `systemctl reload` și este cea mai sigură modalitate de a aplica modificările de configurare `php-fpm.conf` sau ale pool-ului pe un server live.

Redeschiderea fișierelor jurnal după rotație

“`bash

sudo kill -USR1 $(cat /run/php/php8.2-fpm.pid)

“`

Rulează aceasta imediat după ce `logrotate` se execută pentru a preveni ca PHP-FPM să continue să scrie în fișierul jurnal redenumit.

Oprire gracioasă

“`bash

sudo kill -QUIT $(cat /run/php/php8.2-fpm.pid)

“`

Procesul master încetează să accepte conexiuni noi și așteaptă ca toți workerii activi să finalizeze cererile curente înainte de ieșire. Urmează aceasta cu `sudo systemctl start php8.2-fpm` pentru a readuce serviciul online.

Important: Verifică întotdeauna calea fișierului PID înainte de a folosi aceste comenzi. O cale incorectă duce la trimiterea unui semnal unui proces fără legătură. Confirmă cu:

“`bash

cat /run/php/php8.2-fpm.pid

ps aux | grep php-fpm

“`

Metoda 5: Terminarea forțată a proceselor PHP-FPM cu pkill sau killall

Aceasta este o metodă de ultimă soluție pentru situațiile în care PHP-FPM a devenit complet iresponsiv și nici `systemctl` nici controlul bazat pe semnale nu produc rezultate. Termină toate procesele PHP-FPM necondiționat, ceea ce va întrerupe orice cereri în zbor.

“`bash

sudo pkill -9 php-fpm

“`

Sau folosind `killall`:

“`bash

sudo killall -9 php-fpm

“`

După terminarea forțată, serviciul nu va reporni automat dacă nu este gestionat de un supervizor de procese. Pornește-l explicit:

“`bash

sudo systemctl start php8.2-fpm

“`

Când să folosești aceasta: Acumularea de procese zombie, procese copil scăpate de sub control care consumă 100% CPU sau situații în care procesul master este activ dar nu mai gestionează pool-ul. Înainte de a apela la `pkill -9`, încearcă `kill -QUIT` pe PID-ul master mai întâi — este mult mai puțin perturbator.

Metoda 6: Repornirea serverului web pentru a afecta indirect PHP-FPM

Repornirea Nginx sau Apache nu repornește PHP-FPM. Deoarece PHP-FPM rulează ca un serviciu complet independent care comunică printr-un socket Unix sau port TCP, repornirea serverului web afectează doar stratul HTTP. Aceasta este o concepție greșită comună.

“`bash

Nginx

sudo systemctl restart nginx

Apache

sudo systemctl restart apache2

“`

Singurul scenariu în care o repornire a serverului web este relevantă pentru PHP-FPM este când ai modificat directiva `fastcgi_pass` în Nginx sau regula `ProxyPassMatch` în Apache pentru a indica un socket PHP-FPM diferit. În acel caz, Nginx trebuie să-și reîncarce configurația pentru a se conecta la noua cale a socket-ului — dar PHP-FPM însuși are nevoie în continuare de propria sa repornire separată.

Pentru întreținerea întregii stive, repornește ambele servicii în ordinea corectă: PHP-FPM primul, apoi serverul web.

Comparație: Metodele de repornire PHP-FPM dintr-o privire

MetodăExemplu de comandăNivel de perturbareCaz de utilizare
`systemctl restart``systemctl restart php8.2-fpm`Mediu — abandonează conexiunile activeModificări standard de configurare, dev/staging
`systemctl reload``systemctl reload php8.2-fpm`Niciunul — reciclare gracioasă a workerilorModificări de configurare în producție
`kill -USR2``kill -USR2 $(cat /run/php/php-fpm.pid)`Niciunul — reîncărcare gracioasăProducție, medii containerizate
`kill -QUIT``kill -QUIT $(cat /run/php/php-fpm.pid)`Scăzut — așteaptă finalizarea cererilorOprire controlată înainte de întreținere
`kill -USR1``kill -USR1 $(cat /run/php/php-fpm.pid)`Niciunul — doar reîmprospătare FD jurnalPost-logrotate
`service restart``service php-fpm restart`MediuSisteme SysVinit moștenite
`pkill -9``pkill -9 php-fpm`Ridicat — terminare imediatăProcese iresponsive, ultimă soluție
Repornire server web`systemctl restart nginx`Doar stratul webActualizarea căii socket-ului fastcgi în configurația serverului web

Configurarea pool-ului PHP-FPM: Ce necesită repornire față de reîncărcare

Nu toate modificările de configurare au aceeași greutate. Știind ce modificări necesită o repornire completă față de o simplă reîncărcare reduce timpii de nefuncționare inutili:

Reîncărcarea (`USR2` / `systemctl reload`) este suficientă pentru:

  • `pm.max_children`, `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers`
  • `request_terminate_timeout`, `request_slowlog_timeout`
  • Modificări ale căii `slowlog`
  • Directivele `php_admin_value` și `php_flag` din fișierele pool
  • Modificări ale căii `access.log`

Repornire completă necesară pentru:

  • Modificări ale directivei `listen` (cale socket sau port TCP)
  • Adăugarea sau eliminarea extensiilor PHP în `php.ini`
  • Schimbarea directivelor `user` sau `group` din pool
  • Modificarea căilor `include` în `php-fpm.conf`
  • Actualizarea binarului PHP însuși (actualizări de versiune)

Bune practici pentru repornirile PHP-FPM în producție

  • Preferă întotdeauna `reload` față de `restart` pe serverele live. O reîncărcare reciclează workerii gracios, finalizând cererile în zbor înainte de a genera înlocuitori. O repornire dură abandonează imediat toate conexiunile active.
  • Validează configurația înainte de reîncărcare. PHP-FPM oferă o verificare de sintaxă încorporată care previne încărcarea unei configurații defecte:

“`bash

sudo php-fpm8.2 -t

Expected output: NOTICE: configuration file … test is successful

“`

  • Verifică jurnalele înainte și după. Revizuiește `/var/log/php8.2-fpm.log` (sau calea definită în `php-fpm.conf`) pentru intrări `WARNING` sau `ERROR` care indică eșecuri la pornirea pool-ului.
  • Monitorizează metricile pool-ului de workeri după repornire. Folosește pagina de stare PHP-FPM (activată prin `pm.status_path` în configurația pool-ului) pentru a verifica că numărul așteptat de workeri sunt activi și inactivi după repornire.
  • Automatizează cu pipeline-uri de implementare. În fluxurile CI/CD, declanșează `systemctl reload php-fpm` ca un hook post-deploy în loc de o repornire completă. Aceasta asigură implementări fără timp de nefuncționare la fiecare push de cod.
  • Setează `pm.max_requests` pentru reciclarea automată a workerilor. În loc să programezi reporniri periodice pentru a combate scurgerile de memorie, configurează `pm.max_requests = 500` (sau o valoare adecvată) pentru a reporni automat fiecare worker după servirea unui număr fix de cereri.

PHP-FPM pe medii VPS și server dedicat

Metoda de repornire pe care o folosești este influențată și de mediul tău de hosting. Pe un plan de VPS Hosting cu acces root complet, toate metodele descrise în acest ghid sunt disponibile fără restricții. Ai acces direct la `systemctl`, fișierul PID și tabelul de procese.

Pe Servere Dedicate, unde controlezi întreaga stivă hardware, poți configura suplimentar PHP-FPM cu `pm = ondemand` sau `pm = dynamic` pentru a ajusta precis comportamentul de generare a workerilor și poți folosi fișierele drop-in `systemd` pentru a personaliza politicile de repornire (ex., `Restart=on-failure`, `RestartSec=5s`).

Dacă gestionezi mai multe site-uri de clienți printr-o soluție de Panouri de Control VPS, operațiunile de repornire PHP-FPM sunt adesea abstractizate în interfața UI a panoului, dar înțelegerea comenzilor de bază rămâne esențială pentru scenariile de depanare în care panoul însuși nu răspunde.

Pentru aplicațiile care necesită concurență PHP ridicată — cum ar fi Laravel, WordPress multisite sau magazinele WooCommerce — asocierea PHP-FPM cu o configurație de pool bine ajustată pe un Server Dedicat elimină contenciunea de resurse pe care o introduc mediile partajate.

Matricea de decizie tehnică: Alegerea metodei corecte de repornire

Folosește această matrice pentru a selecta abordarea corectă în funcție de situația ta specifică:

SituațieMetodă recomandată
Modificări aplicate la `php.ini` sau fișierele pool `.conf``systemctl reload php<ver>-fpm`
Adăugat o nouă extensie PHP`systemctl restart php<ver>-fpm`
PHP-FPM nu răspunde, procesul master activ`kill -QUIT <master_pid>`, apoi `systemctl start`
PHP-FPM este complet înghețat, fără răspuns la semnale`pkill -9 php-fpm`, apoi `systemctl start`
Reîmprospătare fișier jurnal post-logrotate`kill -USR1 <master_pid>`
Implementarea unui nou cod de aplicație (golire OPcache)`systemctl reload php<ver>-fpm` sau `kill -USR2`
Schimbată calea socket-ului `listen``systemctl restart php<ver>-fpm`
Mai multe versiuni PHP, una necesită actualizareDoar `systemctl restart php<specific-ver>-fpm`
Mediu containerizat fără systemd`kill -USR2 <master_pid>` prin scriptul entrypoint
Verificarea sintaxei configurației înainte de aplicare`php-fpm<ver> -t` mai întâi, apoi reîncărcare/repornire

Întrebări frecvente

Care este diferența dintre `systemctl restart` și `systemctl reload` pentru PHP-FPM?

`restart` termină imediat toate procesele master și worker și pornește din nou, abandonând orice cereri în zbor. `reload` trimite un semnal `USR2` procesului master, care generează workeri noi cu configurația actualizată în timp ce workerii existenți își finalizează cererile curente înainte de ieșire. Folosește întotdeauna `reload` în producție.

Cum găsesc numele corect al serviciului PHP-FPM pe serverul meu?

Rulează `systemctl list-units –type=service | grep fpm`. Pe sistemele Debian/Ubuntu cu mai multe versiuni din PPA-ul `ondrej/php`, vei vedea intrări precum `php7.4-fpm.service` și `php8.2-fpm.service`. Pe RHEL/CentOS cu repository-ul Remi, convenția de denumire este `php74-php-fpm.service`.

Repornirea PHP-FPM afectează conexiunile active la baza de date sau sesiunile utilizatorilor?

O repornire dură (`systemctl restart`) termină imediat toate procesele worker, ceea ce închide orice conexiuni persistente la baza de date deținute de acei workeri. Sesiunile utilizatorilor stocate în fișiere sau o bază de date nu sunt afectate deoarece persistă independent de workerii PHP-FPM. O reîncărcare gracioasă (`systemctl reload`) permite workerilor să finalizeze cererile curente, astfel conexiunile persistente sunt închise curat.

De ce PHP-FPM nu reușește să pornească după o repornire?

Cele mai comune cauze sunt o eroare de sintaxă în `php.ini` sau un fișier de configurare a pool-ului, un conflict de port sau cale socket (un alt proces ascultă deja pe adresa `listen` configurată) sau permisiuni insuficiente pe directorul socket-ului. Rulează `php-fpm<ver> -t` pentru a valida sintaxa configurației și verifică `journalctl -u php<ver>-fpm` pentru mesajul exact de eroare.

Pot reporni PHP-FPM fără privilegii root sau sudo?

Nu pe o instalare Linux standard. Procesul master PHP-FPM rulează ca root (renunță la privilegii la `user`/`group` configurat pentru procesele worker) și gestionarea serviciilor de sistem necesită privilegii ridicate. Pe mediile de hosting partajat, furnizorul de hosting gestionează repornirile PHP-FPM prin panoul lor de control. Pentru control complet asupra PHP-FPM, un plan de VPS Hosting cu acces root este soluția adecvată.

15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți