我们可以在单独的Docker容器中部署Apache和PHP,然后将它们链接起来。但是有没有办法在本地安装apache(使用apt-get install apache 2)和在docker container中安装php-fpm,然后链接它们呢?谢谢
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容器。
php-fpm-container
只要您的Docker php-fpm容器向主机公开端口9000,Apache就不会知道或关心该端口是从主机还是从Docker内部提供的。您的Apache站点配置需要修改为指向localhost:
<FilesMatch \.php$> SetHandler "proxy:fcgi://localhost:9000" </FilesMatch>
顺便提一下,这是在一台主机和一台Apache服务器上运行多个不同PHP版本的一种非常简洁的方法,只需在不同的端口(可能是9001,9002等)上公开每个php-fpm容器即可。
ffscu2ro2#
您可以构建自己的映像,在Dockerfile中,您可以apt install ...但是这里也有一个apache + php-fpm的官方图片:https://hub.docker.com/_/php所以你不必这样做。它准备好了。但我相信它可以通过暴露您的php-fpm端口并将您的ApacheFastCgiExternalServer配置到该端口而不是UNIX套接字来工作。
apt install ...
php-fpm
j2datikz3#
以下是如何在Docker容器中设置php-fpm的指南,同时主机系统运行Apache(以及可选的:MySQL、memcached等)。本指南专门针对开发环境而非生产环境的设置而定制。如果在生产环境中运行,您可能需要研究一种保持容器更新的方法(即:在自动构建管道中),并将PHP设置配置为适合生产环境(即:隐藏错误消息和其他生产配置)
为您的自定义php-fpm映像创建一个新文件夹(例如:sitename-php74-fpm)。根据需要替换站点名称和php版本。在内部创建一个Dockerfile:
sitename-php74-fpm
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版本和扩展名自定义文件。
/var/log/php74-sitename/error.log
127.0.0.1
现在使用docker build -t sitename-php74-fpm .构建docker映像
docker build -t sitename-php74-fpm .
先决条件:我假设你已经安装了Apache并提供了一些静态路径,如果没有,请在继续之前先安装Apache。
apt-get install libapache2-mod-fcgid a2enmod proxy_fcgi
更新应使用php-fpm的站点的配置(例如:/etc/apache2/sites-enabled/default-ssl.conf:
/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
/etc/init.d/apache2 restart
mkdir /var/log/php74-sitename chown www-data:www-data /var/log/php74-sitename
启动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
注:
-p 127.0.0.1:7474:7474
--add-host=host.docker.internal:host-gateway
host.docker.internal
localhost
现在您应该可以访问PHP网站了,尽管您可能会遇到一些MySQL错误(参见下面的MySQL部分)。
要准确指出容器内部或外部出现问题的位置可能很困难,因此这里提供了一些一般的故障排除技巧和工具。
检查docker示例可以得到一些提示,特别是当Apache连接到php-fpm时,在试图访问您的站点时,在窗口中运行以下命令:x1米11米1x它应该在您刷新页面时输出访问日志信息。
您可以在之前指定的位置检查日志(即:1米12米1x)
按如下所示输入容器,并检查其是否具有适当的权限:
docker exec -it sitename-php74-fpm /bin/bash ls -lth /path/to/web cat /path/to/web/index.php
如果你之前连接过localhost,你可能会发现你现在收到一个"找不到文件"的错误。这是因为PHP MySQL客户端实际上是aliases that to a socket connection。要解决这个问题,只需更新你的应用配置以连接到127.0.0.1而不是localhost。
这个简单的测试确保php-fpm可以连接到MySQL(或其他运行在主机上的服务),更高级的版本可以安装mysql客户端,尽管它不包含在Debian的repos中,所以需要自定义安装。如下所示输入容器并检查对mysql的基本端口访问:
docker exec -it sitename-php74-fpm /bin/bash telnet 127.0.0.1 3306
3条答案
按热度按时间htzpubme1#
是的。由于您在Apache as you should中使用的是php-fpm(而不是mod_php),因此在基于Docker的Apache站点配置中会出现类似的内容:
当php-fpm和apache都运行在不同的docker容器中时,上面的代码可以正常工作;
php-fpm-container
是指php-fpm容器。要在主机上运行Apache,并在Docker中运行php-fpm:
只要您的Docker php-fpm容器向主机公开端口9000,Apache就不会知道或关心该端口是从主机还是从Docker内部提供的。
您的Apache站点配置需要修改为指向localhost:
顺便提一下,这是在一台主机和一台Apache服务器上运行多个不同PHP版本的一种非常简洁的方法,只需在不同的端口(可能是9001,9002等)上公开每个php-fpm容器即可。
ffscu2ro2#
您可以构建自己的映像,在Dockerfile中,您可以
apt install ...
但是这里也有一个apache + php-fpm的官方图片:https://hub.docker.com/_/php
所以你不必这样做。它准备好了。
但我相信它可以通过暴露您的
php-fpm
端口并将您的ApacheFastCgiExternalServer配置到该端口而不是UNIX套接字来工作。j2datikz3#
以下是如何在Docker容器中设置php-fpm的指南,同时主机系统运行Apache(以及可选的:MySQL、memcached等)。
本指南专门针对开发环境而非生产环境的设置而定制。如果在生产环境中运行,您可能需要研究一种保持容器更新的方法(即:在自动构建管道中),并将PHP设置配置为适合生产环境(即:隐藏错误消息和其他生产配置)
1)创建自定义Docker映像
为您的自定义php-fpm映像创建一个新文件夹(例如:
sitename-php74-fpm
)。根据需要替换站点名称和php版本。在内部创建一个
Dockerfile
:根据您所需的PHP版本和扩展名自定义文件。
/var/log/php74-sitename/error.log
,并在后续步骤中进行设置127.0.0.1
只是为了防止网络/互联网上的其他设备连接到php-fpm(如果你只指定一个端口,它将监听所有接口)。现在使用
docker build -t sitename-php74-fpm .
构建docker映像2)主机系统配置
先决条件:我假设你已经安装了Apache并提供了一些静态路径,如果没有,请在继续之前先安装Apache。
为Apache安装并启用fcgi:
更新Apache配置
更新应使用php-fpm的站点的配置(例如:
/etc/apache2/sites-enabled/default-ssl.conf
:这将允许Apache将请求转发到Docker。重新启动Apache
/etc/init.d/apache2 restart
创建日志文件夹
3)运行Docker
启动php-fpm服务器:
注:
-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的文件访问权限
按如下所示输入容器,并检查其是否具有适当的权限:
MySQL连接路径调整
如果你之前连接过
localhost
,你可能会发现你现在收到一个"找不到文件"的错误。这是因为PHP MySQL客户端实际上是aliases that to a socket connection。要解决这个问题,只需更新你的应用配置以连接到127.0.0.1
而不是localhost
。验证php-fpm的网络访问
这个简单的测试确保php-fpm可以连接到MySQL(或其他运行在主机上的服务),更高级的版本可以安装mysql客户端,尽管它不包含在Debian的repos中,所以需要自定义安装。
如下所示输入容器并检查对mysql的基本端口访问: