Har du någonsin stött på den här situationen?Webbplatsåtkomsten blev plötsligt långsammare, eller till och med resulterade i ett 500-fel. Efter omstart av PHP-FPM återgick den till det normala., men problemet dyker upp igen efter ett tag? Det här är så frustrerande!
Varför händer det här?I själva verket är detta vanligtvisPHP-FPM-processpoolen är inte korrekt konfigurerad eller så är serverresurserna otillräckliga.orsakas av. Idag ska vi optimera grundligt HestiaCP PHP-FPM installerat gör webbplatsen stabil som en sten!
Kärnan till varför PHP-FPM är överbelastad
PHP-FPM är enProcessledare, som ansvarar för att hantera dynamiska förfrågningar. Om konfigurationen inte är rimlig kan det leda till:
- Serverresurserna är slut, vilket gör att PHP-FPM inte kan svara på nya förfrågningar i tid;
- För få processer, när trafiken plötsligt ökar kan den inte behandlas i tid;
- Processanvändningen är för hög, vilket gör att CPU-belastningen exploderar.

Hur vet man om PHP-FPM är överbelastad?
kan använda top eller htop Kommando för att se CPU och minnesanvändning:
top -c
Om du ser processinformation som liknar följande betyder det att PHP-FPM körs under hög belastning:
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
Ser du hur dessa processer tar upp över 70 % av processorn? Om detta händer ofta, din PHP-FPM Det måste finnas ett problem!
Så, hur kan vi optimera PHP-FPM-konfigurationen så att servern inte längre är överbelastad?
PHP-FPM processpool optimering (kärnparameterjustering)
Först, öppna php-fpm 配置文件:
sudo nano /etc/php/*/fpm/pool.d/www.conf- *Byt till din PHP-version, till exempel PHP8.3, och ändra den till detta:
/etc/php/8.3/fpm/pool.d/www.conf
Fråga efter PHP-versionen som ställts in av HestiaCP
v-list-web-domain user domain.com
T.ex:
v-list-web-domain abc chenweiliang.com
I utgången ser du något som:
PHP SUPPORT yes
PHP MODE php-fpm
PHP VERSION 8.3
Detta innebär att webbplatsen använder PHP 8.3.
Låt oss ta en titt på din PHP-FPM-konfiguration:
[chenweiliang.com]
listen = /run/php/php8.3-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
Du kan se att din pm Den som används är ondemand,Även om det kan minska resursanvändningen under inaktiv tid, när trafiken plötsligt ökar, kanske processen inte kan svara i tid., vilket resulterar i ett 500-fel.
www.conf: Systemets inbyggda "universella resurspool"
Efter installationen av PHP-FPM kommer systemet automatiskt att förse dig med en... www.conf fil.
DessPositioneringDet är väldigt enkelt – det är bara en standardprocesspool som fungerar direkt, vanligtvis kopplad till... www-data som Användarnedladdning.
Denna typ av pool är särskilt lämplig för miljöer med en enda plats: konfigurationen är lätt och parametrarna är alla generiska mallar, till exempel:
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm.max_children = 5
Om du bara är värd för en webbplats kan du använda den direkt och pålitligt utan extra krångel.
etUFO.org.conf: Anpassad pool
När du väl driver flera webbplatser kan du inte hålla alla inklämda i samma pool.
Vid det här laget skapar HestiaCP automatiskt en separat pool för varje webbplats, till exempel... etUFO.org.confSpecialiserad för domännamn etufo.org 服务.
Det vanliga sättet att spela är:
- Ändra användare och grupper:
user = etufo,group = etufo - Oberoende övervakning:
listen = /run/php/etufo.sock - Att justera antalet processer säkerställer bergfast stabilitet även under hög samtidighet.
- Separata loggfiler gör felsökningen tydligare.
Fördelarna är uppenbara:Säker isoleringÄven om en webbplats komprometteras, kommer de andra webbplatserna att förbli opåverkade.
dummy.conf: dummy-fil
dummy.conf Dessa är vanligtvis exempel eller mallar som tillhandahålls av systemet.
Den kommer faktiskt inte att köras om du inte manuellt ändrar och aktiverar den.
Dess betydelse är mer som en "bruksanvisning" som berättar hur man skriver en ny poolkonfiguration.
Varför dela upp poolen?
- 安全 性Använd olika användare för olika webbplatser för att undvika motstridiga behörigheter.
- 性能优化Antalet processer kan justeras individuellt för varje pool, vilket möjliggör flexibla justeringar baserat på trafikbehov.
- IsoleringLoggar, fel och lyssningsadresser är alla separerade, vilket gör felsökning enklare.
Till exempel: även om www.conf Den kollapsade.etufo.org.conf Den kommer fortfarande att fungera normalt och kommer inte att få hela servern att stängas av.
实际场景
- Server på en enda platswww.conf räcker.
- Multisite-serverVarje webbplats har sin egen oberoende .conf-fil, till exempel etufo.org.conf.
- dummy.confEndast för referens, rekommenderas ej.
Konfigurationsjämförelse
www.conf (standardpool)
[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm = dynamic
pm.max_children = 5
etufo.org.conf (Anpassad pool)
[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
Den största skillnaden är:Användaridentitet, lyssningsadress, antal processer.
1. Justera PHP-FPM processpool parametrar
Om konfigurationen använder dynamicDetta är en metod för att förstarta vissa arbetsprocesser och dynamiskt justera dem efter förfrågevolymen, vilket kan reagera snabbare när förfrågevolymen plötsligt ökar.
För webbplatser med en viss mängd trafik rekommenderas det att använda pm = dynamicEftersom den kan upprätthålla ett visst antal inaktiva processer och undvika 500 fel under hög samtidighet.
Det rekommenderas att endast använda den när åtkomstvolymen är extremt låg och minnesresurserna är begränsade. pm = ondemand För att spara resurser.
Föreslog att byta till dynamicoch optimera pm.max_children Och andra parametrar:
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 后自动退出
Varför vill du ändra det så här?
pm = dynamic: Allokera processer mer flexibelt för att undvika att vänta på begäran som kan orsakas av on-demand;pm.max_children = 16: Förhindra 500 fel orsakade av för få processer;pm.start_servers = 5: Undvik långsam processstart;pm.max_requests = 3000:Förhindra minnesläckor, återvinn processen regelbundet.
2. Begränsa exekveringstiden för PHP-skript för att förhindra långvarig beläggning
request_terminate_timeout = 30s ; 超过 30s 的 PHP 脚本自动终止
php_admin_value[memory_limit] = 128M ; 限制 PHP 进程最大内存占用
Detta kan förhindra vissaPHP-skript som använder för mycket CPU kan ta ner din server.
När du har sparat, starta om PHP-processen:
sudo systemctl restart php8.3-fpmAktivera PHP-FPM-statusövervakning för att hålla reda på framstegen när som helst
Aktivera PHP-FPM processövervakning och visa den när som helstAktuellt antal aktiva processer och status för begäran som väntar, för att undvika överbelastning av servern.
i php-fpm.conf Tillagd i:
pm.status_path = /status
Sedan, Nginx-konfiguration:
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;
}
På så sätt kan du http://yourdomain.com/status Kolla in PHP-FPM i aktion!
Optimera PHP-FPM-loggar för att snabbt felsöka problem
i php-fpm.conf Lägg till i:
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 的脚本记录到日志
På detta sätt, närhelst ett 500-fel inträffar, kan du direkt se loggen:
tail -f /var/log/php-fpm/error.log
Se om PHP rapporterar ett fel, som t.ex out of memory,script execution timeout 等.
Starta om PHP-FPM regelbundet för att förhindra minnesläckor
kunna klara cron Starta om PHP-FPM regelbundet för att förhindra att långvariga processer orsakarMinnesläckor.
crontab -e
Lägg till följande schemalagda uppgift för att automatiskt starta om PHP-FPM klockan 3 varje dag:
0 3 * * * /usr/sbin/service php8.3-fpm restart
Vad händer om problemet kvarstår? Ytterligare optimering!
Om du fortfarande följer ovanstående optimeringIbland uppstår 500 fel, kan du fortsätta med följande optimeringar:
1. Aktivera OPcache för att förbättra PHP-exekveringseffektiviteten
Om OPcache inte är aktiverat ännu kan du installera det så här (med Ubuntu som exempel):
sudo apt install php8.3-opcache -y
Redigera sedan php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.validate_timestamps=1
Effekt? PHP-sidans exekveringshastighet har förbättrats avsevärt!
2. Nginx-konfigurationsoptimering
Se till att Nginx-relaterade parametrar är rimliga, som t.ex fastcgi_read_timeout Justera det på lämpligt sätt för att undvika att PHP-skript avslutas av Nginx på grund av lång körningstid:
fastcgi_read_timeout 60s;
client_max_body_size 100M;
Sammanfattning: Optimera PHP-FPM och webbplatsen kommer inte längre att krascha!
Vilka justeringar har vi gjort efter denna optimering?
✅ Optimering av PHP-FPM-processpoolen,använda sig av ondemandOch optimera pm.max_children parameter;
✅ Begränsning av exekveringstiden för PHP-skript, för att förhindra långvarig CPU-ockupation;
✅ Aktivera PHP-FPM-övervakning, se processbelastningen i realtid;
✅ Optimera PHP-FPM-loggar, snabbt felsöka 500 fel;
✅ Starta om PHP-FPM regelbundet, förhindra minnesläckor;
✅ Aktivera OPcache, förbättra PHP-exekveringseffektiviteten;
✅ Optimera Nginx-konfiguration, för att undvika problem med timeout.
Efter denna optimering kommer PHP-FPM-belastningen att reduceras avsevärt och webbplatsdriften blir mer stabil! 🔥
Gå och prova nu! 💪🚀
Hope Chen Weiliang blogg ( https://www.chenweiliang.com/ ) delade "HestiaCP PHP-FPM-belastningen är för hög? Dynamisk webbsida 500-fel? Denna optimering träder i kraft omedelbart! ”, kan det vara till hjälp för dig.
Välkommen att dela länken till denna artikel:https://www.chenweiliang.com/cwl-32512.html
