显示php7.0-fpm.log
每秒产生数百个孩子,然后立即被摧毁。这种情况正在不停地发生。日志如下所示:
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4980 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4978 exited with code 0 after 0.014658 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4981 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4980 exited with code 0 after 0.014354 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4982 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4979 exited with code 0 after 0.015170 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4983 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4981 exited with code 0 after 0.014709 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4984 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4982 exited with code 0 after 0.014741 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4985 started
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4983 exited with code 0 after 0.014727 seconds from start
[09-Mar-2017 02:58:25] NOTICE: [pool www] child 4986 started
设置来自/etc/php/7.0/fpm/php-fpm.conf
:
pid = /run/php/php7.0-fpm.pid
error_log = /var/log/php7.0-fpm.log
include=/etc/php/7.0/fpm/pool.d/*.conf
设置来自/etc/php/7.0/fpm/pool.d/www.conf
:
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
;pm.process_idle_timeout = 10s;
;pm.max_requests = 500
catch_workers_output = yes
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/phperrors.log
php_admin_flag[log_errors] = on
;
所有其他行都用(默认设置)注释掉。这是 Ubuntu 16.04,使用默认包。PHP和Nginx版本如下:
php-fpm7.0 -v
PHP 7.0.13-0ubuntu0.16.04.1 (fpm-fcgi)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.13-0ubuntu0.16.04.1, Copyright (c) 1999-2016, by Zend Technologies
nginx -v
nginx version: nginx/1.10.0 (Ubuntu)
没有进行任何调整(除了启用日志记录)。此服务器尚未部署到生产环境,因此没有用户负载。
为什么 php-fpm 每秒产生并立即摧毁数百个孩子?这是配置错误,还是 Ubuntu 16.04 附带有错误的 php-fpm 版本?
既不是错误配置也不是错误版本。事实上,没有什么可担心的。
您的进程快速退出和重生的原因是您
pm.max_requests
在 php-fpm 池配置文件中使用默认值,因为它通过分号;
符号注释。要了解pm.max_requests
参数代表什么,您可以阅读以下从默认配置中获取的描述:你的是 0,因为它被评论了。您可以将其设置为 100-500(取决于您的需要),以便您的 php-fpm 在处理该数量的请求后回收该进程。
顺便说一句,您应该注意,日志文件中的这些消息只是信息性的,没有任何问题,所以请不要担心。这些日志条目可以通过使用值
warning
而不是参数 innotice
来避免。它几乎显示了所有内容 - 略低于level - 因为默认值设置为.log_level
php-fpm.conf
debug
notice
取自默认配置:
祝你好运
这已经发生在我的一台带有 Ubuntu 14 (PHP 5) 和 16 (PHP 7) 的服务器上。对于早期版本,会有一些延迟,但对于最新版本,一旦 FPM 进程处理了一个有问题的请求,它就会变得疯狂。
我注意到有问题的请求确实发生
exec
在https://stackoverflow.com/questions/44400072/php-fpm-forever-respawning-children-when-executing-uglifycss中,但我仍然不明白这是怎么回事应该导致这个。它似乎与在后台执行的东西(与&
操作员)密切相关。我无法提供实际的解决方案,只能提供从 cron 运行的丑陋的解决方法脚本:
这不应该存在......但我一直在随着时间的推移更新它。<叹气>