+
95
-

回答

在 PHP-FPM 环境中,僵尸进程(Zombie Process)通常是由于子进程在完成任务后没有被父进程正确回收而导致的。为了自动清除这些僵尸进程,可以采取以下几种方法:

方法一:调整 PHP-FPM 配置

PHP-FPM 配置文件(通常是 php-fpm.conf 或 www.conf)中,有一些参数可以帮助管理进程,减少僵尸进程的出现。

1.1 配置 pm.max_children

确保 pm.max_children 的值设置得合适,这个参数定义了 PHP-FPM 可以创建的最大子进程数。如果这个值设置得过高,系统可能会创建太多子进程,导致资源耗尽和僵尸进程的出现。

pm.max_children = 50
1.2 配置 pm.max_requests

pm.max_requests 参数设置每个子进程在被重启之前可以处理的最大请求数。通过设置这个值,可以防止子进程长期运行导致的问题。

pm.max_requests = 500
方法二:使用 supervisord 管理 PHP-FPM

supervisord 是一个进程管理工具,可以用来监控和管理 PHP-FPM 进程,确保它们正常运行并自动重启有问题的进程。

2.1 安装 supervisord
sudo apt-get install supervisor
2.2 配置 supervisord

创建一个配置文件来管理 PHP-FPM 进程,例如 /etc/supervisor/conf.d/php-fpm.conf:

[program:php-fpm]
command=/usr/sbin/php-fpm7.4 -F
autostart=true
autorestart=true
stderr_logfile=/var/log/php-fpm.err.log
stdout_logfile=/var/log/php-fpm.out.log

然后重新加载 supervisord 配置并启动服务:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start php-fpm
方法三:使用 systemd 管理 PHP-FPM

如果你的系统使用 systemd 来管理服务,可以通过配置 systemd 来自动处理和重启 PHP-FPM 进程。

3.1 创建或编辑 systemd 服务文件

通常,PHP-FPM 的 systemd 服务文件位于 /etc/systemd/system/php-fpm.service 或类似路径。确保服务文件包含以下配置:

[Unit]
Description=The PHP FastCGI Process Manager
After=network.target

[Service]
Type=notify
ExecStart=/usr/sbin/php-fpm7.4 --nodaemonize --fpm-config /etc/php/7.4/fpm/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target
3.2 重新加载 systemd 配置并重启服务
sudo systemctl daemon-reload
sudo systemctl restart php-fpm
方法四:使用脚本定期清理僵尸进程

可以编写一个脚本定期检查并清理僵尸进程,并将其添加到 cron 任务中。

4.1 编写清理脚本

创建一个脚本文件,例如 /usr/local/bin/clean_zombie.sh:

#!/bin/bash

# 获取僵尸进程的 PID
zombie_pids=$(ps aux | awk '{ if ($8 ~ /Z/) print $2 }')

# 杀死僵尸进程
if [ -n "$zombie_pids" ]; then
  echo "Killing zombie processes: $zombie_pids"
  kill -9 $zombie_pids
fi
4.2 添加到 cron 任务

编辑 cron 任务:

crontab -e

添加以下行,每分钟检查一次僵尸进程:

* * * * * /usr/local/bin/clean_zombie.sh

通过以上方法,可以有效地管理和清理 PHP-FPM 环境中的僵尸进程,确保系统的稳定性和性能。

网友回复

我知道答案,我要回答