温馨提示×

ubuntu php-fpm为什么崩

小樊
38
2026-09-16 13:50:07
栏目: 编程语言

在 Ubuntu 上 php-fpm 崩溃(或频繁退出/重启) 通常并不是 PHP 本身“随机崩”,而是资源、配置或代码问题触发了保护机制。下面按最常见 → 较少见帮你梳理原因和排查方法。


一、最常见原因(80% 情况)

1️⃣ 内存不足(OOM Killer)

这是 Ubuntu 上 php-fpm 最常见崩溃原因。

表现:

  • php-fpm 进程突然消失
  • /var/log/syslog 里有:
    Out of memory: Kill process (php-fpm) score
    

原因:

  • php.ini 中 memory_limit 太大
  • pm.max_children 太多
  • 服务器内存小(1G / 2G)

✅ 检查:

free -h
dmesg | grep -i oom

✅ 解决:

  • 降低 pm.max_children
  • 降低 memory_limit
  • 增加 swap

2️⃣ php-fpm 配置错误(启动即崩)

修改过配置后直接挂。

典型错误:

  • pm 写错
  • user/group 不存在
  • socket 路径权限不对

✅ 检查:

sudo php-fpm8.1 -t
sudo journalctl -u php8.1-fpm

✅ 常见配置示例(安全):

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8

3️⃣ PHP 致命错误导致 worker 退出

php-fpm 的 worker 崩 ≠ master 崩。

表现:

  • 某些请求 500
  • 日志里有 Fatal Error

✅ 查看:

tail -f /var/log/php8.1-fpm.log
tail -f /var/log/nginx/error.log

✅ 常见:

  • 调用不存在的函数
  • 第三方扩展不兼容
  • 无限递归

二、系统 / 权限问题

4️⃣ 权限问题(socket / 目录)

nginx 无法连 php-fpm:

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

✅ 解决:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

5️⃣ Ubuntu 升级 / PHP 版本不匹配

  • nginx 指向 php7.4,实际装的是 8.1
  • 升级后服务没重启

✅ 检查:

ls /etc/php/
systemctl list-units | grep fpm

三、高级但真实存在的原因

6️⃣ 扩展冲突 / 段错误(Segmentation fault)

表现:

  • 无明显 PHP 错误
  • 日志只有:
SIGSEGV

✅ 排查:

  • 禁用 Xdebug / OPcache 测试
  • 升级 PHP 小版本

7️⃣ 磁盘满了

df -h

日志写不进去 → fpm 异常


四、快速自检清单(照着做)

# 1. 配置是否正确
php-fpm8.1 -t

# 2. 看崩溃日志
journalctl -u php8.1-fpm -n 50

# 3. 看内存
free -h
dmesg | grep oom

# 4. 看 PHP 错误
tail -n 100 /var/log/php8.1-fpm.log

五、如果你愿意,我可以更精准帮你

你可以直接贴:

  1. Ubuntu 版本
  2. PHP 版本
  3. php-fpm.conf 或 www.conf 相关配置
  4. 崩溃时的日志(journalctl / fpm log)

我可以直接帮你算该设多少 pm.max_children,或者判断是不是 OOM。

0 踩