温馨提示×

Ubuntu PHP-FPM为何崩溃

小樊
32
2026-07-13 20:28:33
栏目: 编程语言

Ubuntu 上 PHP-FPM 崩溃/频繁重启 通常不是单一原因,而是 资源、配置、代码或系统限制 叠加导致的。下面按最常见 → 较少见的顺序给你一个系统排查思路,基本能定位 90% 的问题。


一、最常见原因(先重点看)

1️⃣ PHP-FPM 进程耗尽(最常见)

现象

  • 网站 502 / 504
  • server reached pm.max_children
  • 进程数不够用

检查

grep -R "max_children" /var/log/php*-fpm.log

解决 编辑 pool 配置:

/etc/php/8.x/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50      # 调大
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

✅ 一般 max_children ≈ 内存 / 单个PHP进程内存


2️⃣ PHP 脚本内存溢出导致 FPM 被杀

现象

  • 随机崩溃
  • 日志中有 Allowed memory size exhausted

检查

php -i | grep memory_limit

解决

memory_limit = 256M   # 或更高

⚠️ 如果是程序问题(死循环、大数组),只加内存是掩盖问题。


3️⃣ OOM Killer 杀掉 php-fpm(非常常见)

现象

  • PHP-FPM 突然消失
  • 系统日志中出现 Out of memory

检查

dmesg | grep -i oom
journalctl -k | grep -i oom

解决

  • 减少 pm.max_children
  • 增加服务器内存
  • 加 swap(临时缓解)

4️⃣ PHP-FPM 配置错误导致启动失败

现象

systemctl status php8.x-fpm

失败或 failed to start

检查

php-fpm8.x -t

常见错误:

  • listen 端口/ sock 冲突
  • user/group 不存在
  • syntax error

二、日志是核心(一定要看)

PHP-FPM 日志

/var/log/php*-fpm.log

重点关键词:

  • segfault
  • core dumped
  • max_children
  • exit signal

Nginx / Apache 日志

/var/log/nginx/error.log
/var/log/apache2/error.log

常见:

  • connect() failed (111: Connection refused)
  • upstream timed out

三、PHP 本身问题

5️⃣ PHP 扩展冲突 / Bug

现象

  • segfault
  • 特定请求必崩

排查

php -m

可尝试:

  • 禁用第三方扩展
  • 升级 PHP 版本

6️⃣ PHP 版本 Bug

Ubuntu 自带 PHP 有时有已知 bug。

✅ 推荐使用:

ppa:ondrej/php

四、系统层面原因

7️⃣ systemd 限制

现象

  • 启动后很快挂掉
  • status=1/FAILURE

检查

systemctl show php8.x-fpm | grep Limit

解决

# /etc/systemd/system/php8.x-fpm.service.d/override.conf
[Service]
LimitNOFILE=65535
LimitNPROC=65535

然后:

systemctl daemon-reload
systemctl restart php8.x-fpm

8️⃣ 磁盘 / inode 满

df -h
df -i

五、快速定位流程(推荐)

# 1. 看 PHP-FPM 状态
systemctl status php8.x-fpm

# 2. 看 FPM 日志
tail -n 100 /var/log/php*-fpm.log

# 3. 看系统 OOM
dmesg | tail

# 4. 看配置是否正确
php-fpm8.x -t

# 5. 看当前进程数
ps aux | grep php-fpm | wc -l

六、如果你愿意,我可以精准定位

你可以直接贴出:

  1. Ubuntu 版本
  2. PHP 版本
  3. PHP-FPM 报错日志(最近 30 行)
  4. 502 / 504 / 直接挂 / 重启

我可以帮你 直接给出最优配置参数,而不是泛泛而谈。

0