HestiaCP PHP-FPM è sottoposto a un carico elevato? Errore 500 nella pagina web dinamica? Questa ottimizzazione avrà effetto immediato!

Vi è mai capitato? Il vostro sito web improvvisamente rallenta o addirittura restituisce un errore 500. Riavviando PHP-FPM torna alla normalità , ma il problema si ripresenta dopo un po'? È incredibilmente frustrante!

Perché succede questo? In realtà, di solito è causato da una configurazione errata del pool di processi PHP-FPM o da risorse del server insufficienti . Oggi ottimizzeremo a fondo PHP-FPM su HestiaCP per garantire la massima stabilità al tuo sito web!

Il motivo principale per cui PHP-FPM è sovraccarico

PHP-FPM è il gestore dei processi per PHP , responsabile della gestione delle richieste dinamiche. Una configurazione errata può causare:

  • Le risorse del server sono esaurite, impedendo a PHP-FPM di rispondere tempestivamente alle nuove richieste;
  • Troppo pochi processi, quando il traffico aumenta improvvisamente, non è possibile elaborarlo in tempo;
  • L'utilizzo del processo è troppo elevato, causando un'esplosione del carico della CPU.

HestiaCP PHP-FPM è sottoposto a un carico elevato? Errore 500 nella pagina web dinamica? Questa ottimizzazione avrà effetto immediato!

Come capire se PHP-FPM è sovraccarico?

poter usare tophtop Comando per visualizzare l'utilizzo della CPU e della memoria:

top -c

Se vedi informazioni sul processo simili alle seguenti, significa che PHP-FPM è in esecuzione con un carico elevato:

1669293 abc     20   0  790284 227880 185568 R  73.1   0.9   1:30.09 php-fpm: pool chenweiliang.com                                                    
1669522 abc     20   0  801924 224224 170236 R  69.9   0.9   0:59.01 php-fpm: pool chenweiliang.com

Noti che questi processi utilizzano più del 70% della CPU? Se ciò accade frequentemente, allora c'è sicuramente qualcosa che non va con il tuo PHP-FPM!

Come possiamo quindi ottimizzare la configurazione PHP-FPM in modo che il server non sia più sovraccarico?

Ottimizzazione del pool di processi PHP-FPM (adeguamento dei parametri principali)

Per prima cosa, apri php-fpm 配置文件:

sudo nano /etc/php/*/fpm/pool.d/www.conf
  • *Passa alla tua versione di PHP, ad esempio PHP8.5, e modificala come segue:/etc/php/8.3/fpm/pool.d/www.conf

Interroga la versione PHP impostata da HestiaCP

v-list-web-domain user domain.com

例如:

v-list-web-domain abc chenweiliang.com

Nell'output vedrai qualcosa del tipo:

PHP SUPPORT      yes
PHP MODE        php-fpm
PHP VERSION     8.5 

Ciò indica che il sito web utilizza PHP 8.5.

Diamo un'occhiata alla configurazione PHP-FPM:

[chenweiliang.com]
listen = /run/php/php8.5-fpm-chenweiliang.com.sock
listen.owner = abc
listen.group = www-data
listen.mode = 0660

user = abc
group = abc

pm = ondemand
pm.max_children = 8
pm.max_requests = 4000
pm.process_idle_timeout = 10s

Puoi vedere che il tuo pm Quello usato è ondemand,Sebbene possa ridurre l'utilizzo delle risorse durante i tempi di inattività, quando il traffico aumenta improvvisamente, il processo potrebbe non essere in grado di rispondere in tempo., con conseguente errore 500.

www.conf: Il "pool di risorse universale" integrato nel sistema

Dopo l'installazione di PHP-FPM, il sistema ti fornirà automaticamente un... www.conf file.
suoPosizionamentoÈ molto semplice: si tratta di un pool di processi predefinito che funziona immediatamente, solitamente collegato a... www-data Download da parte dell'utente.

Questo tipo di pool è particolarmente adatto ad ambienti a sito singolo: la configurazione è leggera e i parametri sono tutti modelli generici, come ad esempio:

user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm.max_children = 5

Se gestisci un solo sito, puoi utilizzarlo direttamente e in modo affidabile senza alcuna complicazione.

etufo.org.conf: Pool personalizzato

Quando si gestiscono più siti, non è possibile tenere tutti ammassati nello stesso pool.
A questo punto, HestiaCP creerà automaticamente un pool separato per ogni sito, ad esempio... etufo.org.confSpecializzato in nomi di dominio etufo.org 服务.

Il modo più comune di giocare è:

  • Modifica utenti e gruppi:user = etufo,group = etufo
  • Monitoraggio indipendente:listen = /run/php/etufo.sock
  • Regolando il numero di processi, si garantisce una stabilità a prova di bomba anche in presenza di un elevato numero di processi concorrenti.
  • File di registro separati rendono più chiara la risoluzione dei problemi.

I vantaggi sono evidenti: isolamento sicuro . Anche se un sito viene compromesso, gli altri rimangono inalterati.

dummy.conf: file di prova

dummy.conf Si tratta in genere di esempi o modelli forniti dal sistema.
Non funzionerà a meno che non lo modifichi e lo abiliti manualmente.
La sua importanza è più simile a quella di un "manuale operativo", che spiega come scrivere una nuova configurazione del pool.

Perché dividere il pool?

  • 安全 性Utilizza utenti diversi per siti diversi per evitare conflitti di autorizzazioni.
  • 性能优化Il numero di processi può essere regolato individualmente per ciascun pool, consentendo aggiustamenti flessibili in base alla domanda di traffico.
  • IsolamentoI registri, gli errori e gli indirizzi di ascolto sono tutti separati, semplificando la risoluzione dei problemi.

Ad esempio, anche se www.conf si blocca, etufo.org.conf continuerà a funzionare normalmente e non manderà in crash l'intero server.

实际场景

  • Server a sito singolo: www.conf è sufficiente.
  • Server multisitoOgni sito ha il proprio file .conf indipendente, come ad esempio etufo.org.conf.
  • dummy.confSolo a scopo informativo, non raccomandato.

Confronto delle configurazioni

www.conf (pool predefinito)

[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm = dynamic
pm.max_children = 5

etufo.org.conf (Pool personalizzato)

[etufo.org]
user = etufo
group = etufo
listen = /run/php/etufo.sock
pm = dynamic
pm.max_children = 20
access.log = /var/log/php-fpm/etufo.access.log

Le principali differenze sono: identità dell'utente, indirizzo di ascolto e numero di processi.

1. Regolare i parametri del pool di processi PHP-FPM

Se la configurazione utilizza dynamicSi tratta di un metodo per pre-avviare alcuni processi di lavoro e adattarli dinamicamente in base al volume delle richieste, in modo da poter rispondere più rapidamente quando il volume delle richieste aumenta improvvisamente.

Per i siti web con una certa quantità di traffico, si consiglia di utilizzare pm = dynamicPerché può mantenere un certo numero di processi inattivi ed evitare errori 500 durante un'elevata concorrenza.

Si consiglia di utilizzarlo solo quando il volume di accesso è estremamente basso e le risorse di memoria sono limitate. pm = ondemand Per risparmiare risorse.

Suggerito a dynamice ottimizzare pm.max_children E altri parametri:

pm = dynamic
pm.max_children = 16  ; 根据服务器资源调整,建议值:CPU 核心数 × 2
pm.start_servers = 4   ; 初始进程数,建议设为 max_children × 25%
pm.min_spare_servers = 2  ; 最小空闲进程数
pm.max_spare_servers = 7  ; 最大空闲进程数
pm.max_requests = 3000    ; 每个子进程处理完 3000 个请求后自动重启
pm.process_idle_timeout = 10s  ; 空闲进程 10s 后自动退出

Perché vuoi cambiarlo in questo modo?

  • pm = dynamic: Assegnare i processi in modo più flessibile per evitare attese di richiesta che potrebbero essere causate da ondemand;
  • pm.max_children = 16: Previeni 500 errori causati da un numero insufficiente di processi;
  • pm.start_servers = 5: Evita l'avvio lento dei processi;
  • pm.max_requests = 3000:Prevenire le perdite di memoria, riciclare il processo regolarmente.

2. Limitare il tempo di esecuzione degli script PHP per evitare l'occupazione a lungo termine

request_terminate_timeout = 30s  ; 超过 30s 的 PHP 脚本自动终止
php_admin_value[memory_limit] = 128M  ; 限制 PHP 进程最大内存占用

Ciò impedisce che alcuni script PHP che consumano troppa CPU causino il blocco del server.

Dopo aver salvato, riavviare il processo PHP:

sudo systemctl restart php8.3-fpm

Ottimizza PHP-FPM in base alla configurazione del VPS

Esempio di configurazione di un VPS:

  • Descrizione: VPS 3 NVMe
  • Spazio su disco: 300 GB
  • Core della CPU: 8
  • RAM: 24 GB

In base alla configurazione del tuo VPS ( 8 core CPU, 24 GB di RAM ), le risorse del server sono più che sufficienti. Per PHP-FPM, 24 GB di RAM consentono di configurare un numero molto elevato di processi simultanei.

In un ambiente di produzione, in genere si alloca una quantità di memoria sufficiente (ad esempio 8-12 GB) per il sistema stesso, i database Apache (come MySQL /MariaDB) e le cache (come Redis / Memcached ), lasciando i restanti 12-16 GB di memoria interamente dedicati a PHP-FPM.

Considerando un utilizzo medio di memoria di 40-60 MB per processo PHP , 1 GB di memoria può eseguire circa 16-25 processi.

Di seguito è riportata una configurazione FPM ad alte prestazioni e ad alta concorrenza, pensata appositamente per te , in grado di migliorare notevolmente la capacità di WordPress e di prevenire blocchi dovuti a improvvisi picchi di traffico:

pm = dynamic

; 允许的最大 PHP 进程数(12GB 内存 / 40MB ≈ 300)
; 8核CPU搭配300个进程,可以轻松应对极高并发,且不至于让内存溢出
pm.max_children = 300

; 启动时创建的初始进程数(CPU核心数 * 4)
pm.start_servers = 32

; 维持的最小空闲进程数(服务器空闲时保留的进程,保证随时响应)
pm.min_spare_servers = 16

; 维持的最大空闲进程数(超过这个数量的空闲进程会被释放)
pm.max_spare_servers = 64

; 每个进程处理1000个请求后自动重启,高配置服务器可适当调大,有效防止WP插件内存泄露
pm.max_requests = 1000

; 单个请求最大执行时间,超时60秒强杀,防止死锁卡死
request_terminate_timeout = 60s

; 慢日志路径及触发阈值(请求超过5秒则记录,用于排查性能瓶颈)
slowlog = /var/log/php8.5-fpm.log.slow
request_slowlog_timeout = 5s

💡 Perché questa configurazione?

  1. pm.max_children = 300Si tratta di un'ottimizzazione fondamentale. La configurazione precedente, con 50 processi, era troppo conservativa per 24 GB di memoria. In caso di improvvisi picchi di traffico (o di bot che sovraccaricavano il sistema in background), 50 processi venivano immediatamente sovraccaricati, causando timeout di connessione. Aumentando il numero di processi a 300, la capacità di elaborazione simultanea del server può migliorare notevolmente.
  2. pm.start_servers / `min_sparse_serversGrazie agli 8 core della CPU, inizialmente e normalmente, è possibile mantenere un numero maggiore di processi inattivi, il che consente di sfruttare i vantaggi del multi-core in modo che le nuove richieste possano essere aperte istantaneamente senza attendere la creazione dei processi.
  3. pm.max_requests = 1000Aumenta da 500 a 1000. La tua memoria è ampia e i processi non necessitano di essere riavviati frequentemente. Aumentare a 1000 può ridurre il consumo di CPU causato dalla frequente distruzione e creazione dei processi.

Visualizza il registro delle operazioni lente:

tail -f /var/log/php8.5-fpm.log.slow
tail -f /var/log/php8.4-fpm.log.slow

Dopo aver apportato le modifiche, ricordati di riavviare il servizio PHP-FPM affinché le modifiche abbiano effetto.

systemctl restart php8.5-fpm

Abilita il monitoraggio dello stato PHP-FPM per tenere traccia dei progressi in qualsiasi momento

L'attivazione del monitoraggio dei processi PHP-FPM consente di visualizzare in qualsiasi momento il numero di processi attivi e lo stato di attesa delle richieste , prevenendo il sovraccarico del server.

php-fpm.conf Aggiunto in:

pm.status_path = /status

Quindi, configurazione Nginx:

location /status {
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    allow 127.0.0.1;
    deny all;
}

In questo modo puoi http://yourdomain.com/status Guarda PHP-FPM in azione!

Ottimizza i log PHP-FPM per risolvere rapidamente i problemi

php-fpm.conf Rispondi:

php_admin_value[error_log] = /var/log/php-fpm/error.log
php_admin_value[log_errors] = On
php_admin_value[error_reporting] = E_ALL
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s  ; 执行超过 5s 的脚本记录到日志

In questo modo, ogni volta che si verifica un errore 500, è possibile visualizzare direttamente il log:

tail -f /var/log/php-fpm/error.log

Controlla se PHP segnala un errore, come ad esempio out of memory,script execution timeout 等.

Riavviare PHP-FPM regolarmente per evitare perdite di memoria

可以 通过 cron Riavviare regolarmente PHP-FPM per evitare che i processi di lunga durata causinoPerdite di memoria.

crontab -e

Aggiungere la seguente attività pianificata per riavviare automaticamente PHP-FPM alle 3 del mattino ogni giorno:

0 3 * * * /usr/sbin/service php8.5-fpm restart

Cosa succede se il problema persiste? Ulteriore ottimizzazione!

Se, dopo aver seguito le ottimizzazioni sopra descritte, riscontri ancora occasionalmente un errore 500 , puoi procedere con le seguenti ottimizzazioni:

1. Abilitare OPcache per migliorare l'efficienza di esecuzione di PHP

Se OPcache non è ancora abilitato, puoi installarlo in questo modo (usando Ubuntu come esempio):

sudo apt install php8.5-opcache -y

Quindi modifica php.ini:

opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.validate_timestamps=0
  • opcache.validate_timestamps=0
  • Disabilita il rilevamento in tempo realeRiduci le operazioni di I/O del file system e migliora le prestazioni.
  • Tuttavia, ciò significa che è necessario svuotare manualmente la cache (riavviare il servizio PHP) dopo aver modificato i file PHP.

Dopo aver modificato la configurazione, è necessario riavviare il servizio PHP affinché le modifiche abbiano effetto.

sudo systemctl restart php<版本>-fpm

Effetto? La velocità di esecuzione delle pagine PHP è stata notevolmente migliorata!

2. Ottimizzazione della configurazione Nginx

Assicurati che i parametri correlati a Nginx siano ragionevoli, come fastcgi_read_timeout Adattarlo in modo appropriato per evitare che gli script PHP vengano terminati da Nginx a causa del lungo tempo di esecuzione:

fastcgi_read_timeout 60s;
client_max_body_size 100M;

Riepilogo: ottimizza PHP-FPM e il sito web non si bloccherà più!

Quali modifiche abbiamo apportato dopo questa ottimizzazione?

✅ Ottimizzazione del pool di processi PHP-FPM,uso ondemandE ottimizzare pm.max_children parametro;
Limitazione del tempo di esecuzione degli script PHP, per prevenire l'occupazione a lungo termine della CPU;
Abilita il monitoraggio PHP-FPM, visualizzare il carico del processo in tempo reale;
Ottimizzazione dei log PHP-FPM, risolvere rapidamente gli errori 500;
Riavviare PHP-FPM regolarmente, prevenire perdite di memoria;
Abilita OPcache, migliorare l'efficienza di esecuzione di PHP;
Ottimizzazione della configurazione Nginx, per evitare problemi di timeout.

Dopo questa ottimizzazione, il carico PHP-FPM sarà notevolmente ridotto e il funzionamento del sito web sarà più stabile! 🔥

Provatelo subito! 💪🚀

Se desideri ancora approfondire l'argomento della personalizzazione dei template PHP-FPM con HestiaCP, questo articolo ti fornirà una comprensione più completa:

👉 HestiaCP Template PHP-FPM personalizzato: segreti per l'ottimizzazione delle prestazioni di PHP 8.5 ▼

In questo contenuto, vedrai:

  • Tecniche di ottimizzazione ad alta concorrenza: come migliorare la velocità di risposta attraverso una configurazione di processo razionale.
  • Soluzione di isolamento di sicurezza: evita i rischi di accesso tra siti diversi e garantisci la stabilità dell'account.
  • Log e monitoraggio: Utilizza i log delle attività lente per individuare i colli di bottiglia e ottimizzare continuamente le prestazioni del sito web.

发表 评论

您的邮箱地址不会被公开.必填项已用*标注

Scorrere fino a Top