如何在Docker容器上部署php-fpm和在本地主机上部署apache/nginx(Ubuntu)

egmofgnx  于 2023-02-24  发布在  Apache
关注(0)|答案(3)|浏览(363)

我们可以在单独的Docker容器中部署Apache和PHP,然后将它们链接起来。
但是有没有办法在本地安装apache(使用apt-get install apache 2)和在docker container中安装php-fpm,然后链接它们呢?
谢谢

htzpubme

htzpubme1#

是的。由于您在Apache as you should中使用的是php-fpm(而不是mod_php),因此在基于Docker的Apache站点配置中会出现类似的内容:

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://php-fpm-container:9000"
  </FilesMatch>

当php-fpm和apache都运行在不同的docker容器中时,上面的代码可以正常工作;php-fpm-container是指php-fpm容器。

要在主机上运行Apache,并在Docker中运行php-fpm:

只要您的Docker php-fpm容器向主机公开端口9000,Apache就不会知道或关心该端口是从主机还是从Docker内部提供的。
您的Apache站点配置需要修改为指向localhost:

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

顺便提一下,这是在一台主机和一台Apache服务器上运行多个不同PHP版本的一种非常简洁的方法,只需在不同的端口(可能是9001,9002等)上公开每个php-fpm容器即可。

ffscu2ro

ffscu2ro2#

您可以构建自己的映像,在Dockerfile中,您可以apt install ...
但是这里也有一个apache + php-fpm的官方图片:https://hub.docker.com/_/php
所以你不必这样做。它准备好了。
但我相信它可以通过暴露您的php-fpm端口并将您的ApacheFastCgiExternalServer配置到该端口而不是UNIX套接字来工作。

j2datikz

j2datikz3#

以下是如何在Docker容器中设置php-fpm的指南,同时主机系统运行Apache(以及可选的:MySQL、memcached等)。
本指南专门针对开发环境而非生产环境的设置而定制。如果在生产环境中运行,您可能需要研究一种保持容器更新的方法(即:在自动构建管道中),并将PHP设置配置为适合生产环境(即:隐藏错误消息和其他生产配置)

1)创建自定义Docker映像

为您的自定义php-fpm映像创建一个新文件夹(例如:sitename-php74-fpm)。根据需要替换站点名称和php版本。
在内部创建一个Dockerfile

FROM php:7.4-fpm

# These pages may be helpful for customizing the below run lines:
# https://github.com/docker-library/docs/tree/master/php
# https://github.com/mlocati/docker-php-extension-installer

# Easy installer allows for easier dependency installation
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN                                                           \
    apt-get update &&                                         \ 
    apt-get install -y telnet &&                              \
                                                              \
    printf "                                                \n\
            [www]                                           \n\
            listen = 127.0.0.1:7474                         \n\
            php_flag[log_errors] = on                       \n\
                                                            \n\
            [global]                                        \n\
            error_log = /var/log/php74-sitename/error.log   \n\
            " >> /usr/local/etc/php-fpm.conf &&               \
                                                              \
    chmod +x /usr/local/bin/install-php-extensions &&         \
    install-php-extensions gd xdebug mysqli pdo pdo_mysql     \
        memcache bz2 zip

根据您所需的PHP版本和扩展名自定义文件。

  • 我拉telnet客户端是因为它对解决连接问题很有用,但是,您可以删除它。
  • 因为这个示例是针对PHP7.4的,所以我使用端口7474来允许多个phpfpm版本同时运行
  • 我们将登录到/var/log/php74-sitename/error.log,并在后续步骤中进行设置
  • 提醒一下,如果你在生产中这样做,你应该绝对定制它,否则它也会向浏览器显示错误。
  • 我监听127.0.0.1只是为了防止网络/互联网上的其他设备连接到php-fpm(如果你只指定一个端口,它将监听所有接口)。

现在使用docker build -t sitename-php74-fpm .构建docker映像

2)主机系统配置

先决条件:我假设你已经安装了Apache并提供了一些静态路径,如果没有,请在继续之前先安装Apache。

为Apache安装并启用fcgi:

apt-get install libapache2-mod-fcgid
a2enmod proxy_fcgi

更新Apache配置

更新应使用php-fpm的站点的配置(例如:/etc/apache2/sites-enabled/default-ssl.conf

<VirtualHost _default_:443>
    ServerAdmin webmaster@localhost

    DocumentRoot /path/to/website
    
    ...

    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:7474"
    </FilesMatch>

</VirtualHost>

这将允许Apache将请求转发到Docker。重新启动Apache /etc/init.d/apache2 restart

创建日志文件夹

mkdir /var/log/php74-sitename
chown www-data:www-data /var/log/php74-sitename

3)运行Docker

启动php-fpm服务器:

docker run \
  --user 33:33 \
  --network host \
  --restart always \
  --detach \
  --name sitename-php74-fpm \
  --volume=/path/to/web:/path/to/web \
  --volume=/var/log/php74-sitename:/var/log/php74-sitename \
  sitename-php74-fpm

注:

  • 我有php-fpm运行为www-data(用户/组33在我的系统)。这符合Ubuntu的默认配置,但是,你可以运行它作为另一个用户,如果你喜欢。确保它有适当的访问您的网络文件夹。
  • 我使用主机网络,因此php-fpm可以轻松访问mysql和memcache。另一种方法是使用-p 127.0.0.1:7474:7474共享php-fpm端口,使用--add-host=host.docker.internal:host-gateway共享主机端口。在这种情况下,您需要将应用连接到host.docker.internal而不是localhost,并在mysql中更新docker IP的用户权限。
  • 第一卷是网站的路径--必须与容器共享它,以便容器能够读取站点文件。
  • 第二卷是日志路径。

现在您应该可以访问PHP网站了,尽管您可能会遇到一些MySQL错误(参见下面的MySQL部分)。

附录:故障排除

要准确指出容器内部或外部出现问题的位置可能很困难,因此这里提供了一些一般的故障排除技巧和工具。

Docker输出--php-fpm的访问日志

检查docker示例可以得到一些提示,特别是当Apache连接到php-fpm时,在试图访问您的站点时,在窗口中运行以下命令:
x1米11米1x
它应该在您刷新页面时输出访问日志信息。

php-fpm的错误日志

您可以在之前指定的位置检查日志(即:1米12米1x)

验证php-fpm的文件访问权限

按如下所示输入容器,并检查其是否具有适当的权限:

docker exec -it sitename-php74-fpm /bin/bash
ls -lth /path/to/web
cat /path/to/web/index.php

MySQL连接路径调整

如果你之前连接过localhost,你可能会发现你现在收到一个"找不到文件"的错误。这是因为PHP MySQL客户端实际上是aliases that to a socket connection。要解决这个问题,只需更新你的应用配置以连接到127.0.0.1而不是localhost

验证php-fpm的网络访问

这个简单的测试确保php-fpm可以连接到MySQL(或其他运行在主机上的服务),更高级的版本可以安装mysql客户端,尽管它不包含在Debian的repos中,所以需要自定义安装。
如下所示输入容器并检查对mysql的基本端口访问:

docker exec -it sitename-php74-fpm /bin/bash
telnet 127.0.0.1 3306

相关问题