如何以及在何处使用 Docker 为 php-fpm 配置 pm.max_children?

如何以及在何处使用 Docker 为 php-fpm 配置 pm.max_children?

在使用 Nginx 和 PHP-FPM 的 Web 应用程序中,我注意到有时会出现运行缓慢的情况,通过分析日志,我发现这个消息时不时会出现:

[19-Nov-2017 19:24:09] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

经过一番研究,我增加了 php.ini 配置文件中的值,停止并删除 php 容器并重建它,对卷上的文件设置的设置有效。

分析容器内的配置文件,它是我设置的新值,但是,关于 pm.max_children(5) 的错误消息继续出现。

Here is my docker-compose.yml

version: '2'

services:           

    pi_web:
        build: ./nginx
        ports:
            - "80:80"
            - "443:443"

        volumes:
            - ../src:/src
            - ./nginx/conf.d:/etc/nginx/conf.d
            - ./nginx/nginx.conf:/etc/nginx/nginx.conf
            - /etc/letsencrypt:/etc/letsencrypt

    pi_php:
        build: ./php
        volumes:
            - ../src:/src
            - ./php/config/php.ini:/usr/local/etc/php/php.ini

以下是 ./php/config/php.ini 的片段:

pm = dynamic
pm.max_children = 40
pm.start_servers = 15
pm.min_spare_servers = 15
pm.max_spare_servers = 25

如果我运行:

$ docker exec -it docker_pi_php_1 cat /usr/local/etc/php/php.ini

我在上面的代码片段中看到了相同的值。

容器内部配置文件的路径是正确的,我运行了:

$ php --ini 

在容器内,并且路径位于已加载的配置文件列表中。

我绞尽脑汁试图解决这个问题,但到目前为止还没有成功。

有任何想法吗?

答案1

我可能错了,但假设你使用的是官方 PHP 图像,这些 pm 设置应该放在/usr/local/etc/php-fpm.d/带有 conf 扩展名的文件内的目录中。根据 PHP 文档,这些设置是 FPM相关,尽管它们使用php.ini语法,但它们应该放在不同的文件中,所以我相信你的 pm 设置被忽略了。这PHP 中的 Dockerfile 有帮助我要找出这些配置文件应该放在哪里。

/usr/local/etc/php-fpm.d/www.conf我会检查容器中是否有一个文件max_children,现在将其设置为5。如果是这样,我想您可以修改 Dockerfile 以复制一个新的 www.conf 文件,该文件将 设置为更高的值pm.max_children

答案2

我发现使用官方图像附带的文件覆盖特定设置更清楚php:7.3-fpm/usr/local/etc/php-fpm.d/zz-docker.conf

该文件以如下内容结尾:

[www]
listen = 9000

因此,我们只需将我们需要为 www 池设置的内容附加到其中即可。

例如:

# SETUP PHP-FPM CONFIG SETTINGS (max_children / max_requests)
RUN echo 'pm.max_children = 15' >> /usr/local/etc/php-fpm.d/zz-docker.conf && \
    echo 'pm.max_requests = 500' >> /usr/local/etc/php-fpm.d/zz-docker.conf

我认为它更简单、更清晰。

相关内容