我正在尝试为 php-fpm v7.3 启用动态进程管理。这是我的php-pm.ini
[www]
pm = dynamic
pm.max_children = 25
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 498
问题是我似乎无法确认我的 fpm 是否看到了更改。我可以看到它正在解析 ini 文件:
$ docker-compose exec web php -i | grep "pm."
Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pcntl.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini,
/usr/local/etc/php/conf.d/php-pm.ini
通过 fpm查看phpinfo()
服务时,我根本看不到任何设置pm.
。我如何验证这些设置是否被拾取?如果它们被拾取但不会显示在这里,我该如何证明它?
答案1
您不会看到这些设置php -i
,因为它们是与代码相关的设置。尝试设置pm.status_path = /status
,然后转到您的http://localhost/状态URL 并且您将在那里看到您的 php-fpm 选项。
您还可以查看进程列表以查看当前与命令一起使用的配置文件ps aux | grep php-fpm | grep master
,或者您将在命令的输出中看到它php-fpm -t
。
当然你必须将它传递给你的docker容器。
由 OP/Webnet 编辑
这个解决方案引导我走了一段路,但还有其他部分帮助我解决了这个问题。由于这让我走上了最初的道路,我想确保 patok 得到赞扬,所以我将在这里详细阐述这个解决方案。
我不需要通过 加载额外的 ini 文件/usr/local/etc/php/conf.d/
,而是需要修改/usr/local/etc/php-fpm.d/www.conf
容器内部的 fpm 配置(您可以.conf
根据需要添加额外的文件,但我没有)。将其添加到 dockerfile 中即可完成以下任务:
RUN sed -i -e 's/pm = .+?/pm = dynamic/' \
-e 's/pm\.max_children = \d/pm\.max_children = 35/' \
-e 's/pm\.start_servers = \d/pm\.start_servers = 10/' \
-e 's/pm\.min_spare_servers = \d/pm\.min_spare_servers = 5/' \
-e 's/pm\.max_spare_servers = \d/pm\.max_spare_servers = 20/' \
-e 's/pm\.max_requests = \d/pm\.max_requests = 500/' \
-e 's/pm\.process_idle_timeout = .+?/pm\.process_idle_timeout = 10s/' \
/usr/local/etc/php-fpm.d/www.conf
我能够通过遵循概述的做法来确认此解决方案有效PHP-FPM:进程管理其中包括使用它ab -n 10000 -c 200 http://localhost/index.php
来模拟对我的站点的 10k 个请求,使我能够使用docker-compose exec web ps aux | grep php-fpm
(如 patok 所述)来查看 fpm 进程的数量确实已经增加来处理负载。