ProxyPassMatch到FCGI平衡器不起作用

时间:2019-11-28 18:16:39

标签: php apache docker docker-compose load-balancing

我有一个docker-compose设置。基本上有3种服务:php-fpm,apache服务器和mysql。

我的docker-compose文件在这种情况下应该可以(可以跳过):

version: "3"

services:
    php-fpm:
        build: 
            context: ./bin/php-fpm
            args:
                SITE_HOSTNAME: ${SITE_HOSTNAME-example.com}
                SITE_TITLE: ${SITE_TITLE-WPBuilder}
                DOCKER_PASSWORD: ${DOCKER_PASSWORD-docker}
                MYSQL_USER_NAME: ${MYSQL_USER_NAME-wp}
                MYSQL_USER_PASSWORD: ${MYSQL_USER_PASSWORD-wppass}
                ADMIN_USER_NAME: ${ADMIN_USER_NAME-admin}
                ADMIN_USER_PASSWORD: ${ADMIN_USER_PASSWORD-adminpass}
                ADMIN_EMAIL: ${ADMIN_EMAIL-admin@example.com}
        depends_on:
            - mysql
        networks:
            - wp_network
        volumes:
            - "source_code:/srv/www/${SITE_HOSTNAME-example.com}"
    webserver:
        build: 
            context: ./bin/webserver
            args:
                SITE_HOSTNAME: ${SITE_HOSTNAME-example.com}
        container_name: 'wp_server'
        networks:
            - wp_network
        ports:
            - "80:80"
            - "443:443"
        depends_on:
            - php-fpm
            - mysql
        volumes:
            - "source_code:/srv/www/${SITE_HOSTNAME-example.com}"
            - "${APACHE_LOG_DIR-./logs/apache2}:/usr/local/apache2/logs/${SITE_HOSTNAME-example.com}"
    mysql:
        build:
            context: ./bin/mysql
            args:
                MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD-password}
                MYSQL_USER_NAME: ${MYSQL_USER_NAME-wp}
                MYSQL_USER_PASSWORD: ${MYSQL_USER_PASSWORD-wppass}
        container_name: 'wp_db'
        networks:
            - wp_network
        ports:
            - "3306:3306"
        volumes:
            - "db_volume:/var/lib/mysql"
            - "${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql"
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD-password}
networks:
    wp_network:
volumes:
    db_volume:
    source_code:

我运行它来启动服务,特别是有4个php-fpm容器:

docker-compose up --scale php-fpm=4

我在浏览器中输入了本地主机的主机名,它只返回“找不到文件”。在白屏上。

apache的屏幕日志:

wp_server    | 192.168.144.1 - - [28/Nov/2019:17:58:37 +0000] "GET / HTTP/1.1" 404 16

第一个php-fpm容器的访问日志:

192.168.144.5 -  28/Nov/2019:17:58:37 +0000 "GET " 404 - 0.748 2048 0.00%

最后是我的Apache site.conf:

ServerName hostname

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
LoadModule rewrite_module /usr/local/apache2/modules/mod_rewrite.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

<VirtualHost *:80>
    # Proxy .php requests to port 9000 of the php-fpm container(s)
    ProxyPassMatch "^/(.*\.php(/.*)?)$" "balancer://cluster/"
    <Proxy "balancer://cluster/">
        BalancerMember fcgi://wpbuilder_php-fpm_1:9000/srv/www/hostname/$1
        BalancerMember fcgi://wpbuilder_php-fpm_2:9000/srv/www/hostname/$1
        BalancerMember fcgi://wpbuilder_php-fpm_3:9000/srv/www/hostname/$1
        BalancerMember fcgi://wpbuilder_php-fpm_4:9000/srv/www/hostname/$1
        ProxySet lbmethod=byrequests
    </Proxy>

    DocumentRoot /srv/www/hostname/
    <Directory /srv/www/hostname/>
        DirectoryIndex index.php
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    CustomLog logs/hostname/hostname-access_log common
    ErrorLog /proc/self/fd/2
    ErrorLog logs/hostname/hostname-error_log
</VirtualHost>

有人可以阐明这一点吗,这已经花了我整天的时间了……谢谢!!

1 个答案:

答案 0 :(得分:0)

已解决:

apache站点虚拟主机配置:

ServerName hostname

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
LoadModule rewrite_module /usr/local/apache2/modules/mod_rewrite.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

<VirtualHost *:80>
    # Proxy .php requests to port 9000 of the php-fpm container(s)
    <Proxy balancer://cluster>
        BalancerMember fcgi://wpbuilder_php-fpm_1:9000
        BalancerMember fcgi://wpbuilder_php-fpm_2:9000
        BalancerMember fcgi://wpbuilder_php-fpm_3:9000
        BalancerMember fcgi://wpbuilder_php-fpm_4:9000
        ProxySet lbmethod=byrequests
    </Proxy>

    DocumentRoot /srv/www/hostname
    <Directory /srv/www/hostname>
        DirectoryIndex index.php
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
        <FilesMatch \.php$>
            SetHandler proxy:balancer://cluster
        </FilesMatch>
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    CustomLog logs/hostname/hostname-access_log common
    ErrorLog /proc/self/fd/2
    ErrorLog logs/hostname/hostname-error_log 
</VirtualHost>

关键是使用FilesMatch而不是ProxyPassMatch方法。