为什么 apache 不能使用 Docker Desktop for Windows 在单独的容器中与 php-fpm 通信?
Why can't apache communicate with php-fpm in separate containers using Docker Desktop for Windows?
我是 运行 Docker Windows 的最新稳定版 Windows 10。
我写了一个 docker-compose
文件(见下文)构建独立的容器,基于带有 SCL 的 Centos 6,一个用于 httpd24-httpd (Apache) 和一个用于 rh-php56 -php-FPM(PHP-FPM)。容器启动正常,服务报告 OK 状态。如果我从另一个容器 ping 一个容器,它会很好地解决它。如果我访问 index.html 页面,Apache 会很高兴并启动它。
Apache 当前设置为使用 proxy:fcgi:phpfpm:9000
,但如果我尝试加载 php 文件,Apache returns 会出现 503 错误。我已经尝试了许多不同的连接选项,例如 proxy:fcgi:127.0.0.1:9000 -- 0.0.0.0:9000 -- 172.20.0.3:9000
(这是来自 docker 的 phpfpm ip)但是 Apache 只是在记录:
[proxy:error] [pid 60:tid ...] (...)Connection refused: AH00957: FCGI:
attempt to connect to 172.20.0.3:9000 (*) failed [proxy_fcgi:error]
[pid 60:tid ...] [client 172.20.0.1:44546] AH01079: failed to make
connection to backend: ...
我也用 proxypassmatch 试过了,但还是不满意。
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/
</IfModule>
mod_proxy、mod_proxy_http 和 mod_proxy_fcgi 正在由 Apache 加载。
PHP-FPM显然也在配置中。我通常只是将其设置为在端口 9000
上侦听,但也尝试了 :::9000
在 development.php.dockerfile 的构建过程中,我添加了:
EXPOSE 9000
而且,正如您在撰写文件中看到的那样,httpd 链接到 phpfpm,所以根据我的估计,他们应该完全了解彼此,apache 应该能够达到 phpfpm:9000
谁能帮我弄清楚为什么这不起作用??这让我陷入困境。非常感谢。
docker-撰写:
version: '2'
services:
httpd:
build:
context: .
dockerfile: ./docker/development.httpd.Dockerfile
environment:
- APACHE_RUN_USER=apache
- APACHE_RUN_GROUP=apache
- APACHE_LOG_DIR=/var/log/httpd24
- APACHE_RUN_DIR=/opt/rh/httpd24/root/var/run/httpd
- APACHE_LOCK_DIR=/opt/rh/httpd24/root/var/lock
- APACHE_SERVERADMIN=admin@mtf8.bar
- APACHE_SERVERNAME=foo.bar
- APACHE_SERVERALIAS="foo.foo.bar www.foo.bar"
- APACHE_DOCUMENTROOT=/var/www/html
volumes:
- ./data/www/html:/var/www/html
ports:
- "10180:80"
tty: true
networks:
- front-tier
phpfpm:
build:
context: .
dockerfile: docker/development.php.Dockerfile
environment:
- PHPFPM_RUN_USER=apache
- PHPFPM_RUN_GROUP=apache
- PHPFPM_LISTEN=9000
- PHPFPM_PM=dynamic
- PHPFPM_PM_MAX_CHILDREN=50
- PHPFPM_PM_START_SERVERS=5
- PHPFPM_PM_MIN_SPARE_SERVERS=5
- PHPFPM_PM_MAX_SPARE_SERVERS=35
- PHPFPM_LOG_DIR=/var/log/rh-php56-php-fpm
volumes:
- ./data/www/html:/var/www/html
tty: true
networks:
- front-tier
- back-tier
mysql:
build:
context: .
dockerfile: docker/development.mysql.Dockerfile
volumes:
- ./data/db:/usr/tmp/db/
- mysql:/var/lib/mysql
expose:
- 3306
ports:
- "10133:3306"
tty: true
networks:
- back-tier
volumes:
mysql:
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
www.conf
[...]
user = apache
group = apache
listen = 9000
listen.allowed_clients = httpd
[...]
00-custom.conf
[...]
<VirtualHost *:80>
[...]
<Directory "/var/www/html">
Options -Indexes +FollowSymlinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:fcgi://php:9000"
</FilesMatch>
[...]
</VirtualHost>
更新
PHP-FPM 配置文件有问题。我没有意识到,但是来自 SCL 的 rh-php56-php-fpm 正在创建 2 个 conf 文件目录。我正在修改 /opt/rh/rh-php56/register.content/etc/opt/rh/rh-php56/php-fpm.d/www.conf 但服务正在使用 /etc/opt/rh/rh-php56/php-fpm.d/www.conf
我应该在问题中说清楚完整的文件路径!
我还删除了 listen.allowed_clients = httpd
,因为它导致了 Broken pipe AH01074 Apache 错误。使用容器 IP 很好,但我不想走那条路。不管怎样都不重要。
问题已解决。
配置都是正确的,但我修改了错误的www.conf文件。 rh-php56-php-fpm 创建了 2 个 conf 文件目录。我正在修改 /opt/rh/rh-php56/register.content/etc/opt/rh/rh-php56/php-fpm.d/www.conf 而不是 /etc/opt/rh/rh-php56/php-fpm.d/www .conf 被服务使用。
我是 运行 Docker Windows 的最新稳定版 Windows 10。
我写了一个 docker-compose
文件(见下文)构建独立的容器,基于带有 SCL 的 Centos 6,一个用于 httpd24-httpd (Apache) 和一个用于 rh-php56 -php-FPM(PHP-FPM)。容器启动正常,服务报告 OK 状态。如果我从另一个容器 ping 一个容器,它会很好地解决它。如果我访问 index.html 页面,Apache 会很高兴并启动它。
Apache 当前设置为使用 proxy:fcgi:phpfpm:9000
,但如果我尝试加载 php 文件,Apache returns 会出现 503 错误。我已经尝试了许多不同的连接选项,例如 proxy:fcgi:127.0.0.1:9000 -- 0.0.0.0:9000 -- 172.20.0.3:9000
(这是来自 docker 的 phpfpm ip)但是 Apache 只是在记录:
[proxy:error] [pid 60:tid ...] (...)Connection refused: AH00957: FCGI: attempt to connect to 172.20.0.3:9000 (*) failed [proxy_fcgi:error] [pid 60:tid ...] [client 172.20.0.1:44546] AH01079: failed to make connection to backend: ...
我也用 proxypassmatch 试过了,但还是不满意。
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/
</IfModule>
mod_proxy、mod_proxy_http 和 mod_proxy_fcgi 正在由 Apache 加载。
PHP-FPM显然也在配置中。我通常只是将其设置为在端口 9000
上侦听,但也尝试了 :::9000
在 development.php.dockerfile 的构建过程中,我添加了:
EXPOSE 9000
而且,正如您在撰写文件中看到的那样,httpd 链接到 phpfpm,所以根据我的估计,他们应该完全了解彼此,apache 应该能够达到 phpfpm:9000
谁能帮我弄清楚为什么这不起作用??这让我陷入困境。非常感谢。
docker-撰写:
version: '2'
services:
httpd:
build:
context: .
dockerfile: ./docker/development.httpd.Dockerfile
environment:
- APACHE_RUN_USER=apache
- APACHE_RUN_GROUP=apache
- APACHE_LOG_DIR=/var/log/httpd24
- APACHE_RUN_DIR=/opt/rh/httpd24/root/var/run/httpd
- APACHE_LOCK_DIR=/opt/rh/httpd24/root/var/lock
- APACHE_SERVERADMIN=admin@mtf8.bar
- APACHE_SERVERNAME=foo.bar
- APACHE_SERVERALIAS="foo.foo.bar www.foo.bar"
- APACHE_DOCUMENTROOT=/var/www/html
volumes:
- ./data/www/html:/var/www/html
ports:
- "10180:80"
tty: true
networks:
- front-tier
phpfpm:
build:
context: .
dockerfile: docker/development.php.Dockerfile
environment:
- PHPFPM_RUN_USER=apache
- PHPFPM_RUN_GROUP=apache
- PHPFPM_LISTEN=9000
- PHPFPM_PM=dynamic
- PHPFPM_PM_MAX_CHILDREN=50
- PHPFPM_PM_START_SERVERS=5
- PHPFPM_PM_MIN_SPARE_SERVERS=5
- PHPFPM_PM_MAX_SPARE_SERVERS=35
- PHPFPM_LOG_DIR=/var/log/rh-php56-php-fpm
volumes:
- ./data/www/html:/var/www/html
tty: true
networks:
- front-tier
- back-tier
mysql:
build:
context: .
dockerfile: docker/development.mysql.Dockerfile
volumes:
- ./data/db:/usr/tmp/db/
- mysql:/var/lib/mysql
expose:
- 3306
ports:
- "10133:3306"
tty: true
networks:
- back-tier
volumes:
mysql:
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
www.conf
[...]
user = apache
group = apache
listen = 9000
listen.allowed_clients = httpd
[...]
00-custom.conf
[...]
<VirtualHost *:80>
[...]
<Directory "/var/www/html">
Options -Indexes +FollowSymlinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:fcgi://php:9000"
</FilesMatch>
[...]
</VirtualHost>
更新 PHP-FPM 配置文件有问题。我没有意识到,但是来自 SCL 的 rh-php56-php-fpm 正在创建 2 个 conf 文件目录。我正在修改 /opt/rh/rh-php56/register.content/etc/opt/rh/rh-php56/php-fpm.d/www.conf 但服务正在使用 /etc/opt/rh/rh-php56/php-fpm.d/www.conf
我应该在问题中说清楚完整的文件路径!
我还删除了 listen.allowed_clients = httpd
,因为它导致了 Broken pipe AH01074 Apache 错误。使用容器 IP 很好,但我不想走那条路。不管怎样都不重要。
问题已解决。
配置都是正确的,但我修改了错误的www.conf文件。 rh-php56-php-fpm 创建了 2 个 conf 文件目录。我正在修改 /opt/rh/rh-php56/register.content/etc/opt/rh/rh-php56/php-fpm.d/www.conf 而不是 /etc/opt/rh/rh-php56/php-fpm.d/www .conf 被服务使用。