在 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 = 501.2 配置 pm.max_requests
pm.max_requests 参数设置每个子进程在被重启之前可以处理的最大请求数。通过设置这个值,可以防止子进程长期运行导致的问题。
pm.max_requests = 500方法二:使用 supervisord 管理 PHP-FPM
supervisord 是一个进程管理工具,可以用来监控和管理 PHP-FPM 进程,确保它们正常运行并自动重启有问题的进程。
2.1 安装 supervisordsudo apt-get install supervisor2.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.target3.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 fi4.2 添加到 cron 任务
编辑 cron 任务:
crontab -e
添加以下行,每分钟检查一次僵尸进程:
* * * * * /usr/local/bin/clean_zombie.sh
通过以上方法,可以有效地管理和清理 PHP-FPM 环境中的僵尸进程,确保系统的稳定性和性能。
网友回复