首页 > 解决方案 > 性能问题 php-fpm 多副本 docker swarm

问题描述

我用 Apache 和 PHP-FPM 容器构建了一个 Swarm 堆栈。

如果我通过 docker-compose 运行文件并通过 JMeter 运行性能测试,则所有请求都成功且响应时间正常。

如果我通过在副本中使用 1 个 apache 和 1 个 PHP 通过 swarm 部署堆栈来运行文件,运行相同的性能测试,则所有请求都成功且响应时间正常。

但是,一旦我增加 PHP 副本的数量,就会有一些 http 请求到达后期的 apache 容器。只有当我的 PHP 副本数大于 1 时才会发生这种情况。你知道为什么吗?

这是构建堆栈的组合文件:

version: '3'
services:
    ws_portail_web:
        image: ws_portail_apache_api
        ports:
            - 8443:443
        volumes:
            - ${VHOST_CERTS_PATH_APACHE}:/etc/apache2/ssl
            - ${VHOST_SSL_CONF_PATH_APACHE}:/etc/apache2/sites-enabled/vhost_api-ssl.conf
            - ${MPM_CONF_PATH_APACHE}:/etc/apache2/mods-available/mpm_worker.conf
            - ${LOGS_APACHE}:${APACHE_LOG_DIR}
            - ${SOURCE_CODE_API_DOC}:/var/www/api/apiDoc
        environment:
            MPM_SERVER_LIMIT: ${MPM_SERVER_LIMIT}
            MPM_START_SERVERS: ${MPM_START_SERVERS}
            MPM_MAX_REQUEST_WORKERS: ${MPM_MAX_REQUEST_WORKERS}
            MPM_MIN_SPARE_THREADS: ${MPM_MIN_SPARE_THREADS}
            MPM_MAX_SPARE_THREADS: ${MPM_MAX_SPARE_THREADS}
            MPM_THREAD_LIMIT: ${MPM_THREAD_LIMIT}
            MPM_THREADS_PER_CHILD: ${MPM_THREADS_PER_CHILD}
            MPM_MAX_CONNECTIONS_PER_CHILD: ${MPM_MAX_CONNECTIONS_PER_CHILD}
            PHP_FPM_PM_MAX_CHILDREN: ${PHP_FPM_PM_MAX_CHILDREN}
            PHP_FPM_PM_START_SERVERS: ${PHP_FPM_PM_START_SERVERS}
            PHP_FPM_PM_MIN_SPARE_SERVERS: ${PHP_FPM_PM_MIN_SPARE_SERVERS}
            PHP_FPM_PM_MAX_SPARE_SERVERS: ${PHP_FPM_PM_MAX_SPARE_SERVERS}
            PHP_FPM_PM_MAX_REQUESTS: ${PHP_FPM_PM_MAX_REQUESTS}
            APACHE_LOG_DIR: ${APACHE_LOG_DIR}
            APACHE_LOG_LEVEL: ${APACHE_LOG_LEVEL}
            APACHE_SERVEUR_NAME: ${APACHE_SERVEUR_NAME}
        depends_on:
            - ws_portail_php
        deploy:
            mode: replicated
            restart_policy:
                condition: on-failure
                max_attempts: 5
                window: 30s
            replicas: ${SWARM_NB_REPLICAS_APACHE}
            update_config:
                parallelism: 1
                delay: 10s
                failure_action: rollback
            resources:
                limits:
                    cpus: ${SWARM_CPU_LIMIT_APACHE}
                    memory: ${SWARM_MEMORY_LIMIT_APACHE}
                reservations:
                    cpus: ${SWARM_CPU_RESERVATION_APACHE}
                    memory: ${SWARM_MEMORY_RESERVATION_APACHE}

    ws_portail_php:
        image: ws_portail_phpfpm_74_api
        ports:
            - 9000:9000
        volumes:
            - ${SOURCE_CODE}:/var/www/api
            - ${CUSTOM_CONF_PATH_PHP}:/usr/local/etc/php/conf.d/custom_php.ini
            - ${PHPFPM_CONFIGURATION_FILE}:/usr/local/etc/php-fpm.d/www.conf
            - ${BLACKFIRE_CONF_PATH_PHP}:/usr/local/etc/php/conf.d/blackfire.ini
            - ${LOGS_PHP}:/var/log
        environment:
            MEMORY_LIMIT: ${INI_MEMORY_LIMIT}
            MAX_EXECUTION_TIME: ${INI_MAX_EXECUTION_TIME}
            MAX_INPUT_TIME: ${INI_MAX_INPUT_TIME}
            ERROR_REPORTING: ${INI_ERROR_REPORTING}
            DISPLAY_ERRORS: ${INI_DISPLAY_ERRORS}
            IGNORE_REPEATED_ERRORS: ${INI_IGNORE_REPEATED_ERRORS}
            IGNORE_REPEATED_SOURCE: ${INI_IGNORE_REPEATED_SOURCE}
            REPORT_MEMLEAKS: ${INI_REPORT_MEMLEAKS}
            TRACK_ERRORS: ${INI_TRACK_ERRORS}
            FILE_UPLOADS: ${INI_FILE_UPLOADS}
            UPLOAD_MAX_FILESIZE: ${INI_UPLOAD_MAX_FILESIZE}
            MAX_FILE_UPLOADS: ${INI_MAX_FILE_UPLOADS}
            POST_MAX_SIZE: ${INI_POST_MAX_SIZE}
            EXPOSE_PHP: ${INI_EXPOSE_PHP}
            OPCACHE_MEMORY_CONSUMPTION: ${OPCACHE_MEMORY_CONSUMPTION}
            OPCACHE_INTERNED_STRINGS_BUFFER: ${OPCACHE_INTERNED_STRINGS_BUFFER}
            OPCACHE_ENABLE_CLI: ${OPCACHE_ENABLE_CLI}
            OPCACHE_MAX_ACCELERATED_FILE: ${OPCACHE_MAX_ACCELERATED_FILE}
            OPCACHE_MAX_WASTED_PERCENTAGE: ${OPCACHE_MAX_WASTED_PERCENTAGE}
            OPCACHE_VALIDATE_TIMESTAMP: ${OPCACHE_VALIDATE_TIMESTAMP}
            OPCACHE_REVALIDATE_FREQ: ${OPCACHE_REVALIDATE_FREQ}
            OPCACHE_FAST_SHUTDOWN: ${OPCACHE_FAST_SHUTDOWN}
            OPCACHE_ERROR_LOG: ${OPCACHE_ERROR_LOG}
            OPCACHE_LOG_VERBOSITY_LEVEL: ${OPCACHE_LOG_VERBOSITY_LEVEL}
            PHP_FPM_PM_MAX_CHILDREN: ${PHP_FPM_PM_MAX_CHILDREN}
            PHP_FPM_PM_START_SERVERS: ${PHP_FPM_PM_START_SERVERS}
            PHP_FPM_PM_MIN_SPARE_SERVERS: ${PHP_FPM_PM_MIN_SPARE_SERVERS}
            PHP_FPM_PM_MAX_SPARE_SERVERS: ${PHP_FPM_PM_MAX_SPARE_SERVERS}
            PHP_FPM_PM_MAX_REQUESTS: ${PHP_FPM_PM_MAX_REQUESTS}
            PHP_FPM_CATCH_WORKERS_OUTPUT: ${PHP_FPM_CATCH_WORKERS_OUTPUT}
            PHP_FPM_LOG_ERRORS: ${PHP_FPM_LOG_ERRORS}
            PHP_FPM_DISPLAY_ERRORS: ${PHP_FPM_DISPLAY_ERRORS}
            PHP_FPM_ERROR_REPORTING: ${PHP_FPM_ERROR_REPORTING}
            PHP_FPM_ERROR_LOG: ${PHP_FPM_ERROR_LOG}
        deploy:
            mode: replicated
            restart_policy:
                condition: on-failure 
                max_attempts: 5
                window: 30s
            replicas: ${SWARM_NB_REPLICAS_PHP}
            update_config:
                parallelism: 1
                delay: 10s         
                failure_action: rollback
            resources:
                limits:
                    cpus: ${SWARM_CPU_LIMIT_PHP}
                    memory: ${SWARM_MEMORY_LIMIT_PHP}
                reservations:
                    cpus: ${SWARM_CPU_RESERVATION_PHP}
                    memory: ${SWARM_MEMORY_RESERVATION_PHP}

这是apache ssl配置文件:

<VirtualHost *:443>
    ServerName ${APACHE_SERVEUR_NAME}
    DocumentRoot /var/www/api
    DirectoryIndex disabled
    DirectoryIndex index.php index.html
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/serveur.crt
    SSLCertificateKeyFile /etc/apache2/ssl/serveur.key
    SSLCertificateChainFile /etc/apache2/ssl/CA.crt

    <Directory "/var/www/api">
        Options -Indexes
        AllowOverride All
        Require all granted
        RewriteEngine on
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !=/favicon.ico
        RewriteRule ^ index.php [L]
    </Directory>

    <LocationMatch "^(.*\/public\/.*)$">
        ProxyPass fcgi://ws_portail_php:9000/var/www/api/public/index.php$1
    </LocationMatch>

    <LocationMatch "^/(.*\.php(/.*)?)$">
        ProxyPass fcgi://ws_portail_php:9000/var/www/api/$1
    </LocationMatch>

    LogLevel ${APACHE_LOG_LEVEL}
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

谢谢你的帮助。

标签: dockerapachedocker-composedocker-swarm

解决方案


推荐阅读