使用PHP-FPM在Apache服务器上运行PHP应用程序

3
我们有一个使用 Docker Image 运行良好的 PHP 应用程序:

php:7.2-apache-stretch

我们现在需要使用下面的图片来提高性能,并使应用程序像以前一样工作。

php:7.2.17-fpm-stretch

由于这个镜像中没有Apache,我根据各种论坛的建议更新了Dockerfile,从安装Apache2及相关软件包开始。还有其他步骤,我只是添加了我在Dockerfile中更新的指令。
 FROM php:7.2.17-fpm-stretch

RUN apt-get update && apt-get install -y apache2 wget

RUN cd /tmp && wget http://mirrors.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb && dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb;apt-get install -f

RUN a2enmod actions proxy_fcgi fastcgi
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
COPY info.php /var/www/html/info.php
COPY run.sh /app/run.sh
# EXPOSE 9000
RUN chmod 755 /app/run.sh
CMD "/app/run.sh"

info.php 包含 <?php phpinfo( ); ?>。在 run.sh 脚本中,我们启动 php-fpm 服务和 apache2,如下所示:

php-fpm -D

/usr/sbin/apachectl -D FOREGROUND

之前,我尝试从映射到 9000 端口(fpm)的端口访问应用程序。当我访问运行 Apache 的正确端口时,我能够查看 info.php。

vhost.conf 文件中的内容。

<FilesMatch \.php$>
  SetHandler "proxy:fcgi://localhost:9000"
</FilesMatch>

3个回答

3
我做了一些修改,终于让它工作了。
我使用了这个稍微修改过的Dockerfile:
FROM php:7.2.17-fpm-stretch

RUN apt-get update; apt-get install -y apache2 wget

RUN cd /tmp && wget http://mirrors.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb && dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb;apt-get install -f


RUN a2enmod actions proxy_fcgi fastcgi

COPY run.sh /app/run.sh
RUN chmod 755 /app/run.sh
CMD "/app/run.sh"

我还在/etc/apache2/sites-available/000-default.conf文件中添加了以下代码片段(与您所做的修改相同):"

Original Answer

"
<FilesMatch \.php$>
  SetHandler "proxy:fcgi://localhost:9000"
</FilesMatch>

这是我得到的输出结果:
[09-Apr-2019 21:23:06] NOTICE: fpm is running, pid 9
[09-Apr-2019 21:23:06] NOTICE: ready to handle connections
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message

此外,您尝试过在没有缓存的情况下构建dockerfile吗?有时,缓存可能会导致包安装出现问题(有关详细信息,请参见此处)。要进行图像的清洁构建,只需使用以下命令: "最初的回答"
docker build --no-cache 

你好,非常感谢回复。我忘记包含了某个东西。我正在对脚本进行chmod操作,并且能够成功启动两个进程。但是我不确定这一切是如何连接的。我的vhost.conf文件中的实现是否正确?如果我们有一个像WordPress这样的PHP应用程序,并且我需要使用php-fpm在Apache服务器上托管它,需要执行哪些步骤? - Bala
1
我在 /etc/apache2/sites-available/000-default.conf 文件中添加了以下代码片段,并且它对我起作用了: <FilesMatch \.php$> SetHandler "proxy:fcgi://localhost:9000" </FilesMatch> - Alassane Ndiaye
我已经更新了我的Dockerfile。当我尝试访问info.php时,无法成功。而localhost可以访问index.html。:(。 - Bala
它适用于一个sample.php文件。我有一个运行在php上的WordPress应用程序。在那个Dockerfile中启用了以下模块。 - Bala

2
我使用这个Dockerfile使您的新配置工作起来了:
FROM php:7.2.17-fpm-stretch

RUN apt-get update && apt-get install -y apache2 wget

RUN cd /tmp && wget http://mirrors.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb && dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb;apt-get install -f

RUN a2enmod actions proxy_fcgi fastcgi
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
COPY info.php /var/www/html/info.php
COPY run.sh /app/run.sh
RUN chmod 755 /app/run.sh
EXPOSE 80
CMD "/app/run.sh"

我运行的命令是:
docker run -P -d --rm <php-image>

暴露的端口为:

0.0.0.0:32773->80/tcp, 0.0.0.0:32772->9000/tcp

我能够使用 http://localhost:32773/info.php 访问 info.php


谢谢回复。现在我的WordPress应用程序正在工作中。但我遇到了.htaccess文件中提到的重写问题。[Wed Apr 10 15:24:03.632495 2019] [proxy_fcgi:error] [pid 15:tid 139956055955200] [client 172.17.0.18:55636] AH01071: 出现错误:'Primary script unknown\n',引用者:http://local.test.com [Wed Apr 10 15:26:53.354451 2019] [proxy_fcgi:error] [pid 16:tid 139956039169792] [client 172.17.0.18:56056] AH01071: 出现错误:'Primary script unknown\n',引用者:http://local.test.com - Bala
什么是.htaccess文件? - Alassane Ndiaye

0

我能够访问php页面。一切都运行正常。但是,我在错误的方向上寻找。当我运行容器时。

docker run -P -d --rm php:test-fpm

输出结果为

82071c9ff023        php:test-fpm                    "docker-php-entrypoi…"   2 seconds ago       Up 1 second         0.0.0.0:32778->80/tcp, 0.0.0.0:32777->9000/tcp   practical_mclean

我正在访问 localhost:32777/info.php。但是我应该访问 32778,这是 Apache 暴露的端口,localhost:32778/info.php 可以正常工作!!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接