温馨提示×

为何ubuntu php-fpm崩溃

小樊
43
2026-09-28 13:48:03
栏目: 编程语言

Ubuntu 上 php-fpm 崩溃(crash / 退出 / 不响应) 是很常见的问题,原因通常集中在资源、配置、扩展、权限这几类。下面按「最常见 → 较少见」给你系统梳理,并给出排查方法。


一、最常见原因

1️⃣ 内存不足(OOM)

php-fpm 被系统 OOM Killer 杀掉。

表现

  • 进程突然消失
  • /var/log/syslog 或 dmesg 中有 Out of memory
  • 网站 502

排查

dmesg | grep -i kill
free -h

解决

  • 降低 pm.max_children
  • 优化 PHP 内存:memory_limit
  • 增加 Swap

2️⃣ php-fpm 配置不合理(进程模型)

尤其是 pm = dynamic 或 static 设置错误。

典型问题

  • pm.max_children 太大 → 内存爆
  • pm.max_children 太小 → 请求排队 → 502

关键配置

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

3️⃣ PHP 代码致命错误 / 死循环

  • 无限循环
  • 大数组 / 大文件处理
  • 第三方库 bug

表现

  • 单进程卡死
  • 整个 pool 不可用

排查

tail -f /var/log/php*-fpm.log

4️⃣ PHP 扩展冲突或版本不兼容

  • 升级 PHP 后扩展未升级
  • 使用了 unstable 扩展(如 xdebug + fpm)

排查

php -m
php-fpm -t

二、权限 & 用户问题(Ubuntu 常见)

5️⃣ socket / 权限错误

Nginx 无法访问 php-fpm socket。

错误示例

connect() to unix:/run/php/php8.1-fpm.sock failed (13: Permission denied)

解决

listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

6️⃣ 用户不存在或错误

user = www-data
group = www-data

如果 user 被改错,php-fpm 会直接退出。


三、系统 & 服务问题

7️⃣ systemd 限制

Ubuntu 使用 systemd 管理 php-fpm。

查看状态

systemctl status php8.1-fpm
journalctl -u php8.1-fpm

可能原因:

  • TasksMax 限制
  • MemoryMax 限制

8️⃣ 文件句柄耗尽

ulimit -n

php-fpm 高并发时容易 fd 耗尽。

解决

; php-fpm.conf
rlimit_files = 65535

四、日志定位(最重要)

php-fpm 日志

/var/log/php8.1-fpm.log

Nginx 日志

/var/log/nginx/error.log

系统日志

/var/log/syslog
journalctl -xe

五、快速自检清单 ✅

  • [ ] php-fpm -t 配置无误
  • [ ] 内存是否 OOM
  • [ ] pm.max_children 是否合理
  • [ ] socket 权限是否正确
  • [ ] PHP 扩展是否兼容
  • [ ] 是否有代码死循环

如果你愿意,可以把下面信息发我,我能精准判断原因:

  1. Ubuntu 版本
  2. PHP 版本
  3. php-fpm.conf 或 pool 配置
  4. 崩溃时的日志内容

我可以直接帮你改配置。

0 踩