当WordPress网站在高峰期变慢、后台保存长时间转圈,甚至出现502、504错误时,问题不一定是服务器配置太低,也可能是PHP-FPM进程没有合理设置。
PHP-FPM负责处理WordPress的PHP请求。进程太少,请求会排队;进程太多,又可能耗尽服务器内存。因此,调优前不要直接照搬网上的配置,应该先测量单个进程的内存占用,再计算合理的进程上限。
一、PHP-FPM三种进程模式
PHP-FPM主要有三种进程管理模式:
static
启动时固定创建指定数量的进程,性能比较稳定,但即使没有访问,也会持续占用内存。
适合内存充足、流量稳定的站点。
dynamic
根据访问量动态增加或回收进程,是多数WordPress网站比较常用的模式。
适合存在访问高峰、流量变化明显的中小型网站。
ondemand
只有收到请求时才创建进程,空闲后自动销毁,节省内存,但首次请求可能增加一定延迟。
适合访问量较低、希望尽量节省内存的站点。
简单来说:
- 内存充足、流量稳定,选择
static; - 流量有明显波动,选择
dynamic; - 流量较少、优先节省内存,选择
ondemand。
二、计算PHP-FPM进程上限
首先查看PHP-FPM进程的平均内存占用:
ps --no-headers -o rss -C php-fpm | awk '{sum+=$1; n++} END {printf "%d MB avg across %d procs\n", sum/n/1024, n}'
建议让网站先经过一次访问高峰,再执行命令,并额外预留约10%的安全空间。
然后查看服务器可用内存:
free -m
重点查看available数值,同时为系统和数据库预留约20%的内存。
进程上限可以按照以下公式计算:
pm.max_children =(PHP可用内存 × 0.8)÷ 单个PHP进程平均内存
例如:
- 可用内存:1200MB;
- 单个PHP进程:95MB;
那么:
1200 × 0.8 ÷ 95 ≈ 10
这时可以将pm.max_children设置为10。
如果计算结果低于5,说明服务器内存较紧张,建议升级配置或减少占用资源较大的插件。
三、PHP-FPM参数配置示例
PHP-FPM配置通常位于PHP-FPM池配置文件和php.ini中。
对于WordPress网站,可以重点关注以下参数:
memory_limit:单个PHP进程可使用的最大内存;max_execution_time:单个PHP请求允许运行的最长时间;max_input_vars:一次请求允许提交的变量数量。
基础WordPress站点通常可以使用128MB内存限制;如果安装了WooCommerce、Elementor或其他大型插件,建议从256MB开始。
max_execution_time可以设置为120至300秒。太短可能导致备份、导入和批量操作失败,太长则可能让异常请求长时间占用进程。
大型菜单保存时,如果出现内容丢失,可以将max_input_vars从默认的1000提高到3000左右。
dynamic模式配置示例
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.process_idle_timeout = 20s
修改完成后,先检查配置语法:
php-fpm -tt
确认无误后,再平滑加载配置:
systemctl reload php-fpm
建议每次只修改一个参数,并记录调整前后的效果,方便出现问题时回退。
四、如何验证调优效果?
可以先查看实时PHP-FPM进程数量:
watch -n 1 "ps aux | grep php-fpm | grep -v grep | wc -l"
如果进程数长期接近pm.max_children,说明并发上限可能设置过低,请求正在排队。
如果进程数明显低于上限,但网站仍然很慢,问题可能出在数据库、缓存或其他插件,而不一定是PHP-FPM。
还可以使用Apache Bench进行简单压力测试:
ab -n 500 -c 10 https://你的域名/
重点观察:
Requests per second:每秒处理请求数;Time per request:平均请求耗时;- 是否出现502或504错误。
建议在修改前后各测试一次。如果调整后吞吐量提高、响应时间下降,同时没有出现502和504,说明方向基本正确。
五、日常需要监控哪些信号?
建议重点关注以下三个指标:
- 内存使用率长期超过85%;
- swap开始频繁使用;
- PHP-FPM日志出现
server reached pm.max_children警告。
其中,第三项通常是站点过载的重要信号,可以设置定时监控或告警,提前发现并发不足问题。
总结
PHP-FPM调优可以按照以下顺序进行:
- 使用
ps查看单个PHP进程的平均内存; - 使用
free -m确认服务器可用内存; - 按公式计算
pm.max_children; - 根据网站流量选择
static、dynamic或ondemand; - 调整
memory_limit、max_execution_time和max_input_vars; - 使用
php-fpm -tt检查配置,再执行reload; - 通过压力测试和日志监控验证效果。
如果刚开始接触服务器运维,也可以先使用HostEase的WordPress主机托管方案。托管环境已经预设了基础PHP运行环境,适合先解决网站部署和日常维护问题,后续再根据实际瓶颈进行深度调优。
HostEase官网:点击直达
