✅ 你可以立即检查的地方
1. 查看 PHP-FPM 日志(关键)
bashCopyEditsudo tail -n 100 /var/log/php8.1-fpm.log
或可能位于:
bashCopyEdit/var/log/php-fpm/www-error.log
2. 查看 Nginx 错误日志
bashCopyEditsudo tail -n 100 /var/log/nginx/error.log
3. 查看内存、负载、进程状态
bashCopyEdithtop
free -m
top
4. 检查 PHP-FPM 配置(通常位于 /etc/php/8.1/fpm/pool.d/www.conf
):
关键参数说明如下:
参数 | 说明 | 示例 |
---|---|---|
pm | 模式(static、dynamic、ondemand) | 推荐用 dynamic |
pm.max_children | 最大并发 PHP 进程数 | 根据内存情况设定,如 4GB RAM 配 10-20 |
pm.start_servers | 启动时的进程数 | 2-4 |
pm.min_spare_servers | 最小备用进程 | 1-2 |
pm.max_spare_servers | 最大备用进程 | 4-6 |
你提供的日志说明非常明确:你的 PHP-FPM 已经达到了 pm.max_children
的上限(当前为 10),并且没有空闲子进程可以处理新的请求,导致 WordPress 响应变慢甚至挂掉。
🔍 问题本质总结:
javaCopyEditserver reached pm.max_children setting (10)
意思是:并发的 PHP 请求达到最大进程数上限,新的请求只能等待,直到前面的处理完毕。
arduinoCopyEditseems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)
说明:PHP-FPM 一直在忙,没有空闲的“备用”进程来快速响应请求,调度压力大。
✅ 解决方案:优化 PHP-FPM 配置
你当前的 pm.max_children = 10
太低了,建议根据服务器内存调整。
步骤一:确认内存情况
使用以下命令确认服务器内存:
bashCopyEditfree -m
例如,如果你有 2GB 可用内存,且 WordPress 平均每个 PHP 子进程占用 30–60MB(根据插件复杂度),大概可以支持:
CopyEdit可用内存 / 单进程内存占用 = 最大 children 估算值
例:
CopyEdit1800MB / 50MB ≈ 36
步骤二:修改 www.conf
编辑 PHP-FPM 池配置文件:
bashCopyEditsudo nano /etc/php/8.1/fpm/pool.d/www.conf
推荐配置(适合 2–4GB RAM 的服务器):
iniCopyEditpm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500
⚠️ 提示:根据你实际内存再调整
pm.max_children
,不要直接调太高,以防系统 OOM(内存溢出)。
步骤三:重启 PHP-FPM 和 Nginx
bashCopyEditsudo systemctl restart php8.1-fpm
sudo systemctl restart nginx
🧠 补充建议:
- 开启缓存插件:如 WP Super Cache、LiteSpeed Cache 或者用 Cloudflare 缓存静态页面。
- 使用 object cache:推荐安装 Redis +
Redis Object Cache
插件。 - 排查高负载插件:比如统计类、视觉编辑器、社交类插件,可能造成 PHP 进程压力。
- 开启慢日志分析(排查是否部分请求很慢): iniCopyEdit
request_slowlog_timeout = 3s slowlog = /var/log/php8.1-fpm.slow.log
✅ 最后一句总结:
你的网站挂掉的根本原因是 PHP-FPM 并发处理能力不足(pm.max_children 设置过低)。只要合理提升该值,并根据服务器资源配置 start_servers
、spare_servers
等参数,同时加上缓存机制,就能大幅提升稳定性。
需要我帮你根据实际内存计算推荐值吗?可以发下 free -m
的结果。
You said:
很好,我是 8G的内存,帮我改一下参数,CPU4核心。我现在的参数如下:pm.max_children = 200 ; The number of child processes created on startup. ; Note: Used only when pm is set to ‘dynamic’ ; Default Value: (min_spare_servers + max_spare_servers) / 2 pm.start_servers = 2 ; The desired minimum number of idle server processes. ; Note: Used only when pm is set to ‘dynamic’ ; Note: Mandatory when pm is set to ‘dynamic’ pm.min_spare_servers = 1 ; The desired maximum number of idle server processes. ; Note: Used only when pm is set to ‘dynamic’ ; Note: Mandatory when pm is set to ‘dynamic’ pm.max_spare_servers = 3 ; The number of rate to spawn child processes at once. ; Note: Used only when pm is set to ‘dynamic’ ; Note: Mandatory when pm is set to ‘dynamic’ ; Default Value: 32 ;pm.max_spawn_rate = 32 ; The number of seconds after which an idle process will be killed. ; Note: Used only when pm is set to ‘ondemand’ ; Default Value: 10s ;pm.process_idle_timeout = 10s; ; The number of requests each child process should execute before respawning. ; This can be useful to work around memory leaks in 3rd party libraries. For ; endless request processing specify ‘0’. Equivalent to PHP_FCGI_MAX_REQUESTS. ; Default Value: 0 ;pm.max_requests = 500
ChatGPT said:
你有 8GB 内存 + 4 核 CPU,当前 pm.max_children = 200
对于 8GB 来说偏高,如果没有启用缓存或有很多慢请求,200 个 PHP 进程可能会吃光内存导致系统崩溃(甚至被 OOM Killer 杀掉),所以你需要一个更稳健合理的配置。
✅ 推荐 PHP-FPM 配置(8GB RAM,4核 CPU)
根据经验估算,WordPress 单个 PHP-FPM 进程通常消耗 30MB~60MB 内存,带缓存优化后更低。以 45MB 平均内存占用估算,你可以安全地运行:
CopyEdit8000MB * 0.75 / 45MB ≈ 133 个 PHP 进程(pm.max_children)
⚠️ 为了系统留出空间(Nginx、MySQL、Redis 等),建议不要占满全部内存,用 70~75% 即可。
🚀 优化后的 PHP-FPM 建议配置:
iniCopyEditpm = dynamic
pm.max_children = 130
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 500
🔍 参数说明简要:
参数 | 推荐值 | 说明 |
---|---|---|
pm.max_children | 130 | 并发处理 PHP 请求的最大进程数 |
pm.start_servers | 10 | 启动时创建的 PHP 子进程 |
pm.min_spare_servers | 10 | 最小空闲子进程数 |
pm.max_spare_servers | 20 | 最大空闲子进程数 |
pm.max_requests | 500 | 每个进程处理请求数后自动重启(避免内存泄漏) |
🔁 修改后操作步骤
- 编辑配置文件(路径通常是): bashCopyEdit
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
- 保存后,重启 PHP-FPM 与 Nginx: bashCopyEdit
sudo systemctl restart php8.1-fpm sudo systemctl restart nginx
个人微信:ssevening