Artikel Directory
Har du nogensinde stødt på denne situation?Hjemmesideadgang blev pludselig langsommere eller resulterede endda i en 500-fejl Efter genstart af PHP-FPM vendte den tilbage til normal., men problemet dukker op igen efter et stykke tid? Det er så frustrerende!
Hvorfor sker dette?Faktisk er dette normaltPHP-FPM-procespuljen er ikke konfigureret korrekt, eller serverressourcerne er utilstrækkelige.forårsaget af. I dag vil vi optimere grundigt HestiaCP PHP-FPM installeret gør hjemmesiden så stabil som en sten!
Kerneårsagen til, at PHP-FPM er overbelastet
PHP-FPM er enProcesleder, som er ansvarlig for at håndtere dynamiske anmodninger. Hvis konfigurationen ikke er rimelig, kan det føre til:
- Serverressourcer er opbrugt, hvilket får PHP-FPM til ikke at være i stand til at svare på nye anmodninger rettidigt;
- For få processer, når trafikken pludselig stiger, kan den ikke behandles i tide;
- Procesforbruget er for højt, hvilket får CPU-belastningen til at eksplodere.

Hvordan kan man se, om PHP-FPM er overbelastet?
kan bruge top 或 htop Kommando til at se CPU og hukommelsesforbrug:
top -c
Hvis du ser procesoplysninger, der ligner følgende, betyder det, at PHP-FPM kører under høj 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
Se, hvordan disse processer fylder mere end 70 % af CPU'en? Hvis dette sker ofte, vil din PHP-FPM Der må være et problem!
Så hvordan kan vi optimere PHP-FPM-konfigurationen, så serveren ikke længere er overbelastet?
PHP-FPM procespuljeoptimering (justering af kerneparameter)
Først, åben php-fpm Konfigurationsfiler:
sudo nano /etc/php/*/fpm/pool.d/www.conf- *Skift til din PHP-version, f.eks. PHP8.5, og ændr den til denne:
/etc/php/8.3/fpm/pool.d/www.conf
Forespørg PHP-versionen angivet af HestiaCP
v-list-web-domain user domain.com
For eksempel:
v-list-web-domain abc chenweiliang.com
I outputtet vil du se noget som:
PHP SUPPORT yes
PHP MODE php-fpm
PHP VERSION 8.5 Det betyder, at siden bruger PHP 8.5.
Lad os se 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, at din pm Den brugte er ondemand,Selvom det kan reducere ressourceforbruget i inaktiv tid, når trafikken pludselig stiger, kan processen muligvis ikke reagere i tide., hvilket resulterer i en 500 fejl.
www.conf: Systemets indbyggede "universelle ressourcepulje"
Efter installation af PHP-FPM vil systemet automatisk give dig en... www.conf fil.
densPositioneringDet er meget simpelt – det er bare en standard procespulje, der fungerer lige fra starten, normalt knyttet til... www-data Brugerdownload.
Denne type pool er særligt velegnet til miljøer med kun én lokation: konfigurationen er let, og parametrene er alle generiske skabeloner, såsom:
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm.max_children = 5
Hvis du kun hoster én hjemmeside, kan du bruge den direkte og pålideligt uden ekstra besvær.
etufo.org.conf: Brugerdefineret pulje
Når du kører flere websteder, kan du ikke holde alle stuvet sammen i den samme pulje.
På dette tidspunkt vil HestiaCP automatisk oprette en separat pulje for hvert websted, for eksempel... etufo.org.confSpecialiseret til domænenavne etufo.org 服务.
Den almindelige måde at spille på er:
- Skift brugere og grupper:
user = etufo,group = etufo - Uafhængig overvågning:
listen = /run/php/etufo.sock - Justering af antallet af processer sikrer bundsolid stabilitet, selv under høj samtidighed.
- Separate logfiler gør fejlfinding mere tydelig.
Fordelene er åbenlyse:Sikker isolationSelv hvis ét websted kompromitteres, vil de andre websteder forblive upåvirkede.
dummy.conf: dummy-fil
dummy.conf Disse er normalt eksempler eller skabeloner, som systemet leverer.
Den kører faktisk ikke, medmindre du manuelt ændrer og aktiverer den.
Dens betydning er mere som en "betjeningsmanual", der fortæller dig, hvordan du skriver en ny poolkonfiguration.
Hvorfor opdele poolen?
- 安全 性Brug forskellige brugere til forskellige websteder for at undgå modstridende tilladelser.
- 性能优化Antallet af processer kan justeres individuelt for hver pulje, hvilket giver mulighed for fleksible justeringer baseret på trafikbehov.
- IsolationLogfiler, fejl og lytteadresser er alle adskilt, hvilket gør fejlfinding nemmere.
For eksempel: selvom www.conf Det kollapsede.etufo.org.conf Den vil stadig køre normalt og vil ikke få hele serveren ned.
实际场景
- Server med én lokationwww.conf er nok.
- Multisite-serverHvert websted har sin egen uafhængige .conf-fil, f.eks. etufo.org.conf.
- dummy.confKun til reference, anbefales ikke.
Konfigurationssammenligning
www.conf (standardpulje)
[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm = dynamic
pm.max_children = 5
etufo.org.conf (Brugerdefineret pulje)
[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
Hovedforskellen er:Brugeridentitet, lytteadresse, antal processer.
1. Juster PHP-FPM-procespuljeparametre
Hvis konfigurationen bruger dynamicDette er en metode til at forudstarte nogle arbejdsprocesser og dynamisk justere dem i henhold til anmodningsmængden, hvilket kan reagere hurtigere, når anmodningsmængden pludselig stiger.
For hjemmesider med en vis mængde trafik anbefales det at bruge pm = dynamicFordi den kan opretholde en vis mængde inaktive processer og undgå 500 fejl under høj samtidighed.
Det anbefales kun at bruge det, når adgangsvolumen er ekstremt lav, og hukommelsesressourcerne er knappe. pm = ondemand For at spare ressourcer.
Foreslog at dynamic, og optimer pm.max_children Og andre parametre:
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 后自动退出
Hvorfor vil du ændre det sådan?
pm = dynamic: Tildel processer mere fleksibelt for at undgå ventetid, der kan være forårsaget af ondemand;pm.max_children = 16: Undgå 500 fejl forårsaget af for få processer;pm.start_servers = 5: Undgå langsom processtart;pm.max_requests = 3000:Forebyggelse af hukommelseslækager, genbrug processen regelmæssigt.
2. Begræns udførelsestiden for PHP-scripts for at forhindre langsigtet belægning
request_terminate_timeout = 30s ; 超过 30s 的 PHP 脚本自动终止
php_admin_value[memory_limit] = 128M ; 限制 PHP 进程最大内存占用
Dette kan forhindre noglePHP-scripts, der bruger for meget CPU, kan ødelægge din server.
Efter at have gemt, genstart PHP-processen:
sudo systemctl restart php8.3-fpmOptimer PHP-FPM baseret på VPS-konfiguration
Eksempel på VPS-konfiguration:
- Beskrivelse: VPS 3 NVMe
- Diskplads: 300 GB
- CPU-kerner: 8
- RAM: 24 GB
Afhængigt af din VPS-konfiguration (8-kernet CPU, 24 GB RAMDine serverressourcer er mere end tilstrækkelige. For PHP-FPM giver 24 GB hukommelse dig mulighed for at konfigurere et meget stort antal samtidige processer.
I et produktionsmiljø leverer vi typisk selve systemet, Apache-databasen (såsom...) MySQL/MariaDB) og cache (såsom Omfor/memcachedSørg for nok hukommelse (lad os sige 8 GB-12 GB), resten... 12 GB-16 GB RAMDen kan fuldstændigt tildeles PHP-FPM.
Baseret på den gennemsnitlige brug pr. PHP-proces 40 MB – 60 MB Med hensyn til hukommelsesforbrug kan 1 GB hukommelse køre cirka 16-25 processer.
Følgende er skræddersyet til dig.Høj samtidighed og højtydende FPM-konfigurationDet kan forbedres betydeligt hood.discount Den har kapacitet til at håndtere tung trafik og kan forhindre pludselige stigninger i trafik i at forårsage systemnedbrud.
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.4-fpm.log.slow
request_slowlog_timeout = 5s
💡 Hvorfor denne konfiguration?
pm.max_children = 300Dette er en kerneoptimering. Din tidligere konfiguration på 50 processer var for konservativ til 24 GB hukommelse. Når der opstod pludselige stigninger i trafikken (eller bots, der oversvømmer baggrunden), ville 50 processer blive overbelastet med det samme, hvilket forårsagede timeouts for forbindelsen. Hvis du øger det til 300, kan du forbedre din servers kapacitet til samtidig behandling flere gange.pm.start_servers/ `min_reserve_servereFordi du har 8 CPU-kerner, kan du i starten og normalt beholde flere inaktive processer, hvilket giver dig mulighed for at udnytte multi-core-fordelen, så nye anmodninger kan åbnes øjeblikkeligt uden at vente på procesoprettelse.pm.max_requests = 1000Øg fra 500 til 1000. Din hukommelse er stor, og processer behøver ikke at blive genstartet ofte. En stigning til 1000 kan reducere CPU-forbruget forårsaget af hyppig procesødelæggelse og -oprettelse.
Når du har foretaget ændringerne, skal du huske at genstarte PHP-FPM-tjenesten for at ændringerne kan træde i kraft.
systemctl restart php8.5-fpmAktiver PHP-FPM-statusovervågning for at holde styr på fremskridtene til enhver tid
Aktiver PHP-FPM-procesovervågning og se den til enhver tidAktuelt antal aktive processer og anmodning om ventestatus, for at undgå overbelastning af serveren.
在 php-fpm.conf Tilføjet i:
pm.status_path = /status
Derefter, 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å denne måde kan du http://yourdomain.com/status Se PHP-FPM i aktion!
Optimer PHP-FPM-logfiler for hurtigt at fejlfinde problemer
在 php-fpm.conf 添加:
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å denne måde, når der opstår en 500-fejl, kan du direkte se loggen:
tail -f /var/log/php-fpm/error.log
Se om PHP rapporterer en fejl, som f.eks out of memory,script execution timeout 等.
Genstart PHP-FPM regelmæssigt for at forhindre hukommelseslækager
kunne bestå cron Genstart PHP-FPM regelmæssigt for at forhindre langvarige processer i at forårsageHukommelseslækager.
crontab -e
Tilføj følgende planlagte opgave for automatisk at genstarte PHP-FPM kl. 3 hver dag:
0 3 * * * /usr/sbin/service php8.5-fpm restart
Hvad hvis problemet fortsætter? Yderligere optimering!
Hvis du stadig følger ovenstående optimeringLejlighedsvis opstår der 500 fejl, kan du fortsætte med følgende optimeringer:
1. Aktiver OPcache for at forbedre PHP-udførelseseffektiviteten
Hvis OPcache ikke er aktiveret endnu, kan du installere det på denne måde (ved at bruge Ubuntu som eksempel):
sudo apt install php8.5-opcache -y
Rediger derefter php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.validate_timestamps=0
- opcache.validate_timestamps=0
- Deaktiver realtidsdetektionReducer filsystemets I/O og forbedr ydeevnen.
Det betyder dog, at du manuelt skal rydde cachen (genstarte PHP-tjenesten) efter at have ændret PHP-filer.
Efter du har ændret konfigurationen, skal du genstarte PHP-tjenesten for at ændringerne kan træde i kraft.
sudo systemctl restart php<版本>-fpmEffekt? PHP side eksekveringshastighed er blevet væsentligt forbedret!
2. Nginx-konfigurationsoptimering
Sørg for, at Nginx-relaterede parametre er rimelige, som f.eks fastcgi_read_timeout Juster det passende for at undgå, at PHP-scripts bliver afsluttet af Nginx på grund af lang eksekveringstid:
fastcgi_read_timeout 60s;
client_max_body_size 100M;
Resumé: Optimer PHP-FPM, og hjemmesiden vil ikke længere gå ned!
Hvilke justeringer har vi foretaget efter denne optimering?
✅ Optimering af PHP-FPM-procespuljen,brug ondemandOg optimer pm.max_children parameter;
✅ Begrænsning af eksekveringstiden for PHP-scripts, for at forhindre langsigtet CPU-besættelse;
✅ Aktiver PHP-FPM-overvågning, se procesbelastningen i realtid;
✅ Optimering af PHP-FPM-logfiler, hurtigt fejlfinde 500 fejl;
✅ Genstart PHP-FPM regelmæssigt, forhindre hukommelseslækager;
✅ Aktiver OPcache, forbedre PHP-udførelseseffektiviteten;
✅ Optimering af Nginx-konfiguration, for at undgå problemer med timeout.
Efter denne optimering vil PHP-FPM-belastningen blive kraftigt reduceret, og hjemmesidens drift vil være mere stabil! 🔥
Prøv det nu! 💪🚀
Hope Chen Weiliang Blog ( https://www.chenweiliang.com/ ) delt "HestiaCP PHP-FPM belastning er for høj? Dynamisk webside 500 fejl? Denne optimering træder i kraft med det samme! ”, kan det være nyttigt for dig.
Velkommen til at dele linket til denne artikel:https://www.chenweiliang.com/cwl-32512.html
