1 php apache docker dockerfile docker-compose
类似的问题已被问过很多次,我已经解决了大部分问题,但仍然无法解决问题。
我在不同的 docker 容器中运行 Apache2 和 PHP 7 FPM,但它们无法相互连接。连接失败并出现以下错误。
[Tue Sep 19 00:05:51.743322 2017] [proxy:debug] [pid 336:tid 140441754191616] proxy_util.c(2422): [client 172.18.0.1:36332] AH00947: connected /var/www/html/info.php to 127.0.0.1:9000
[Tue Sep 19 00:05:51.743387 2017] [proxy:error] [pid 336:tid 140441754191616] (111)Connection refused: AH00957: FCGI: attempt to connect to 127.0.0.1:9000 (*) failed
[Tue Sep 19 00:05:51.743405 2017] [proxy_fcgi:error] [pid 336:tid 140441754191616] [client 172.18.0.1:36332] AH01079: failed to make connection to backend: 127.0.0.1
[Tue Sep 19 00:05:51.743410 2017] [proxy:debug] [pid 336:tid 140441754191616] proxy_util.c(2175): AH00943: FCGI: has released connection for (*)
[Tue Sep 19 00:05:56.809604 2017] [authz_core:debug] [pid 336:tid 140441672480512] mod_authz_core.c(809): [client 172.18.0.1:36442] AH01626: authorization result of Require all granted: granted
[Tue Sep 19 00:05:56.809646 2017] [authz_core:debug] [pid 336:tid 140441672480512] mod_authz_core.c(809): [client 172.18.0.1:36442] AH01626: authorization result of <RequireAny>: granted
[Tue Sep 19 00:05:56.809676 2017] [proxy:debug] [pid 336:tid 140441672480512] mod_proxy.c(1160): [client 172.18.0.1:36442] AH01143: Running scheme fcgi handler (attempt 0)
[Tue Sep 19 00:05:56.809687 2017] [proxy_fcgi:debug] [pid 336:tid 140441672480512] mod_proxy_fcgi.c(879): [client 172.18.0.1:36442] AH01076: url: fcgi://127.0.0.1:9000/var/www/html/info.php proxyname: (null) proxyport: 0
[Tue Sep 19 00:05:56.809694 2017] [proxy_fcgi:debug] [pid 336:tid 140441672480512] mod_proxy_fcgi.c(886): [client 172.18.0.1:36442] AH01078: serving URL fcgi://127.0.0.1:9000/var/www/html/info.php
[Tue Sep 19 00:05:56.809703 2017] [proxy:debug] [pid 336:tid 140441672480512] proxy_util.c(2160): AH00942: FCGI: has acquired connection for (*)
[Tue Sep 19 00:05:56.809712 2017] [proxy:debug] [pid 336:tid 140441672480512] proxy_util.c(2213): [client 172.18.0.1:36442] AH00944: connecting fcgi://127.0.0.1:9000/var/www/html/info.php to 127.0.0.1:9000
[Tue Sep 19 00:05:56.809840 2017] [proxy:debug] [pid 336:tid 140441672480512] proxy_util.c(2422): [client 172.18.0.1:36442] AH00947: connected /var/www/html/info.php to 127.0.0.1:9000
[Tue Sep 19 00:05:56.809927 2017] [proxy:error] [pid 336:tid 140441672480512] (111)Connection refused: AH00957: FCGI: attempt to connect to 127.0.0.1:9000 (*) failed
[Tue Sep 19 00:05:56.809946 2017] [proxy_fcgi:error] [pid 336:tid 140441672480512] [client 172.18.0.1:36442] AH01079: failed to make connection to backend: 127.0.0.1
[Tue Sep 19 00:05:56.809953 2017] [proxy:debug] [pid 336:tid 140441672480512] proxy_util.c(2175): AH00943: FCGI: has released connection for (*)
Run Code Online (Sandbox Code Playgroud)
下面是我的 docker-compose 文件
version: '2'
services:
php:
build: ./etc/php/
volumes:
- ./etc/php/config/php.ini:/etc/php/7.1/fpm/php.ini
- ./etc/php/config/www.conf:/etc/php/7.1/fpm/pool.d/www.conf
- ./etc/php/config/php-fpm.conf:/etc/php/7.1/fpm/php-fpm.conf
- ./etc/php/logs/php-fpm.log:/var/log/php-fpm.log
- ./etc/php/logs/fpm-php.www.log:/var/log/fpm-php.www.log
- ./source/:/var/www/html/
expose:
- 9000
ports:
- "9000:9000"
links:
- mysql
apache2:
build: ./etc/apache/
volumes:
- ./source/:/var/www/html/
- ./etc/apache/config/sites-enabled/:/etc/apache2/sites-enabled/
- ./etc/apache/config/conf-enabled/:/etc/apache2/conf-enabled/
- ./etc/apache/logs/error.log:/var/log/apache2/error.log
- ./etc/apache/logs/access.log:/var/log/apache2/access.log
- ./etc/apache/logs/sm-error.log:/var/log/apache2/sm-error.log
- ./etc/apache/logs/sm-access.log:/var/log/apache2/sm-access.log
expose:
- 80
- 443
ports:
- "8080:80"
- "443:443"
links:
- php
mysql:
image: mysql:latest
volumes:
- ./etc/mysql/data/:/var/lib/mysql/
- ./etc/mysql/config/:/etc/mysql/conf.d/
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: sp
MYSQL_USER: spadmin
MYSQL_PASSWORD: root
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8081:80"
links:
- mysql
environment:
PMA_HOST: mysql
Run Code Online (Sandbox Code Playgroud)
下面是我的 apache2 docker 文件。
#Get the base image
FROM ubuntu:16.04
#Install Apache
RUN apt-get update && \
apt-get dist-upgrade -y && \
apt-get install -y \
apache2 \
apache2-utils
# Enable modules
RUN a2enmod rewrite
RUN a2enmod proxy
RUN a2enmod proxy_fcgi
# Add user to www-data
RUN groupadd 1000
RUN usermod -a -G 1000 www-data
RUN usermod -a -G staff www-data
RUN service apache2 restart
# Run config
ENTRYPOINT [ "/usr/sbin/apache2ctl" ]
CMD [ "-D", "FOREGROUND" ]
Run Code Online (Sandbox Code Playgroud)
下面是我的 apache2 虚拟主机文件。
<VirtualHost *:80>
ServerName localhost
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
DocumentRoot /var/www/html
<Directory /var/www/html>
Options FollowSymlinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/apache2/sm-error.log
CustomLog /var/log/apache2/sm-access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
下面是我的 PHP-FPM docker 文件。
FROM ubuntu:16.04
# Install PHP
RUN apt-get clean && \
apt-get -y update && \
apt-get install -y locales \
curl \
software-properties-common \
git && \
locale-gen en_AU.UTF-8
RUN LC_ALL=en_AU.UTF-8 add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install -y --force-yes php7.1-bcmath \
php7.1-bz2 \
php7.1-cli \
php7.1-common \
php7.1-curl \
php7.1-cgi \
php7.1-dev \
php7.1-fpm \
php7.1-gd \
php-ldap \
php7.1-gmp \
php7.1-intl \
php7.1-json \
php7.1-mbstring \
php7.1-mcrypt \
php7.1-mysql \
php-sqlite3 \
php7.1-opcache \
php7.1-phpdbg \
hp7.1-pspell \
php7.1-readline \
php7.1-recode \
php7.1-soap \
php7.1-tidy \
php7.1-xml \
php7.1-xmlrpc \
php7.1-xsl \
php7.1-zip \
php-xdebug
# Install Composer
RUN curl https://getcomposer.org/installer > composer-setup.php && php composer-setup.php && mv composer.phar /usr/local/bin/composer && rm composer-setup.php
# Clean files
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Run PHP-FPM
CMD ["php-fpm7.1"]
Run Code Online (Sandbox Code Playgroud)
下面是 docker ps 命令的输出。
a85830192ad4 spendingmanager_apache2 "/usr/sbin/apache2..." 15 minutes ago Up 15 minutes 0.0.0.0:443->443/tcp, 0.0.0.0:8080->80/tcp spendingmanager_apache2_1
4574c977d0d4 phpmyadmin/phpmyadmin "/run.sh phpmyadmin" 15 minutes ago Up 15 minutes 0.0.0.0:8081->80/tcp spendingmanager_phpmyadmin_1
82735fa580e8 spendingmanager_php "php-fpm7.1" 15 minutes ago Up 15 minutes 0.0.0.0:9000->9000/tcp spendingmanager_php_1
32422e934247 mysql:latest "docker-entrypoint..." 15 minutes ago Up 15 minutes 0.0.0.0:3307->3306/tcp spendingmanager_mysql_1
Run Code Online (Sandbox Code Playgroud)
注意:PHP-FPM 正在侦听端口 9000 上的连接并正常工作。当我尝试从我的主机操作系统访问它时(例如http://localhost/而不是http://localhost:8080我能够连接并获得所需的输出)。
我也尝试过设置权限www/html并尝试制作www-data所有者。
有人可以帮我解决这个问题吗?
在此先感谢您的帮助。
在您的示例中,localhost或者127.0.0.1是容器本地的(不是主机)。因此,当 Apache 尝试连接到 FPM 时127.0.0.1:9000,它实际上是在尝试连接到自身(仅限 Apache 容器)。
您想要做的是让 Apache 连接到 FPM 容器。使用 Docker 网络执行此操作的最简单方法是使用来自 Docker Compose 的服务名称。在您的情况下,服务名称php将php在 Apache 容器的 DNS 名称中可用。
因此,您的 Apache 配置应该是:
SetHandler "proxy:fcgi://php:9000"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3102 次 |
| 最近记录: |