Apache 的不同 Php-Fpm 容器

Posted

技术标签:

【中文标题】Apache 的不同 Php-Fpm 容器【英文标题】:Different Php-Fpm containers with Apache 【发布时间】:2017-08-21 15:10:27 【问题描述】:

我的生产服务器正在运行具有经典结构的 Docker Db-Container、Server-Container 和 php-Fpm 容器。

我想做的是拆分源,以便为项目的 3 个主要部分提供不同的容器。现在它们以旧方式工作,例如 mydomain.com/index 用于主站点,mydomain.com/api 和 mydomain.com/adm 用于其他服务。

我必须如何设置 Apache 虚拟主机才能映射这样的请求?

mydomain.com -> fcgi://siteFpm:9000
mydomain.com/api -> fcgi://apiFpm:9000
mydomain.com/cms -> fcgi://cmsFpm:9000

谢谢

【问题讨论】:

如果您担心性能,为什么不测量呢?如果您追求性能,为什么要使用 Apache 和 Docker?为什么将所有 3 项服务都放在同一个物理盒子上?过早的优化..你知道其余的。既然您有两种选择,为什么不简单地衡量并确定哪一种最适合您? 我试图排除无用的解决方案。我也在考虑从 Apache 切换到 nginx 【参考方案1】:

在 conf 文件或 vhosts 文件中使用 docker-compose expose 和 FastCgiExternalServer

(请注意,这是我将采用并且仍在研究的一种方法。我会根据我的了解进行更新。但它也应该可以为您提供如何做的大纲。我确实更新了我的答案,而不是空洞的承诺,请在此处查看此示例:Getting a LAMP stack running on a Vagrant VM (under windows 7 host), full instructions?)

安装docker-compose,它提供了一种官方标准化的方式来批处理/自动运行您的docker容器,使用docker-compose.yml文件,而不是使用命令行docker命令单独启动每个命令。

docker-compose.yml文件中,定义你的php-fpm服务,例如:

服务:

使用EXPOSE 关键字语句/指令使您的php-fpm 端口可用于apache。

本文中显示了expose 的示例:Multiple versions of AMP in One Host,其中示例中docker-compose.yml 包含此公开语句:

  expose:      
   - "3306"   

- 使 sql 数据库可用于其他 docker 容器。

您还需要确保 php 文件对 php 和 apache 容器都可用 - 信用:https://***.com/a/40449377/227926

然后,需要从 vhosts 文件或 conf 文件中的 Apache FastCgiExternalServer 指令引用相同的 expose: 端口以及服务名称。我认为,选择 vhosts 文件或 conf 文件来放置指令似乎是个人偏好,尽管研究可能会发现其中一个或另一个更适合您的情况的差异。

conf 文件中的示例如下所示:

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization

我应该把它放在什么 conf 文件中?

回答:有几个选项(如上所述),更详细地说是(假设 Ubunut/Debian Linux 是运行 Apache 的操作系统): - httpd.conf - 000-default.conf(默认虚拟主机)(在可用站点中) - yoursite.conf(在可用站点中) - 和(例如)/etc/apache2/conf-available/php5.6-fpm.conf

这些 conf 文件在哪里?

答案:在您的 apache docker 容器中。定义服务后,您将需要使用 docker-compose.yml 文件将描述的设置添加(注入)到容器中。您可以从 docket-compose.yml 执行标准 linux 命令,将文本插入到配置文件中。

您应该自动添加这些设置,而不是手动编辑容器内的 Apache 配置文件,因为:1) 自动意味着设置是可重复的,因此可以用于开发工作流程中的不同平台:dev , qa, uat, live/prod 2) 不需要手动工作 3) Docker 容器旨在是短暂的,因为它们可以被销毁和重新创建。任何持久性数据都应保存在它们之外 - 在主机中 -(Dockerfiles 中的配置、docker-composer 文件、单独文件夹中的资产(图像)、容器外部和主机上的数据库存储。

FastCgiExternalServer 指令示例:

Apache 2.4 + PHP-FPM and Authorization headers https://www.cyberciti.biz/tips/rhel-fedora-centos-apache2-external-php-spawn.html https://www.howtoforge.com/using-php5-fpm-with-apache2-on-centos-6.2-p2 Difference between FastCgiExternalServer and FastCgiServer in Apache FastCGI PHP? Apache 2.4.6 on Ubuntu Server: Client denied by server configuration (PHP FPM) [While loading PHP file] https://www.digitalocean.com/community/questions/apache-2-4-with-php5-fpm?answer=12056 https://www.howtoforge.com/tutorial/apache-with-php-fpm-on-ubuntu-16-04/#-making-phpfpm-use-a-tcp-connection-optional

对 Debian/Ubuntu 的 conf 文件和 Apache 约定的引用

https://serverfault.com/questions/216252/how-to-configure-apache-sites-available-vs-httpd-conf https://forum.owncloud.org/viewtopic.php?t=30157 https://askubuntu.com/questions/378734/how-to-configure-apache-to-run-php-as-fastcgi-on-ubuntu-12-04-via-terminal

关于 PHP-FPM 的讨论 - https://serverfault.com/questions/645755/differences-and-dis-advanages-between-fast-cgi-cgi-mod-php-suphp-php-fpm

有关 docker-file.yml 语句的有用相关信息

Difference between 'image' and 'build' within docker compose https://docs.docker.com/compose/compose-file/#build

关于一起运行单独容器的类似讨论

https://medium.com/docker-captain/multiple-versions-of-amp-in-one-host-6e107c836cd8 php docker link apache docker Multi Docker container with PHP7 fpm and nginx Docker - Run Apache on host and container for different websites Linking nginx and php-fpm container together for fast interaction in docker prod How to correctly link php-fpm and Nginx Docker containers?

【讨论】:

以上是关于Apache 的不同 Php-Fpm 容器的主要内容,如果未能解决你的问题,请参考以下文章

没有来自 docker 容器的 php-fpm 错误日志

workerman 与php-fpm冲突吗

PHP-FPM docker 容器根据引擎(docker-compose 和 swarm)有不同的行为

apache + php-fpm + mariadb 分离部署

为多个PHP-FPM容器量身打造单一Nginx镜像

Apache的PHP-FPM-启用实例