Answers:
使用nginx的PHP通常是使用php-fpm来完成的,这是一个单独的过程。
在每个容器中保留一个进程的docker核心思想(有关这一点的更多详细信息,请参见答案的结尾),这对于将nginx进程和php-fpm进程放在单独的容器中是有意义的。
由于nginx和php-fpm之间的通信是通过fastcgi产生的,因此php-fpm容器也可以位于单独的主机上,这允许在nginx后面使用一堆php-fpm容器。
在后面的评论墙后面有一些背景知识,docker文档中有一段关于容器应该只涉及一个问题的想法。
linux容器(lxc)的主要思想是在cpu和内存级别的隔离名称空间中运行进程,docker在此之上在文件系统级别添加隔离。
这样做的好处是,在此名称空间内对进程的破坏将不允许读取其他进程的内存,因此应防止主机上的其他破坏。
在谈论nginx和php-fpm时,它们是成对工作的,但是每个人都有各自的关注点,nginx将执行HTTP部分,路由,标头验证等工作,而php-fpm将进行代码解释并将html部分返回给nginx 。通常将两者一起提供给一个应用程序不是必须的。
根据上下文,在开发人员工作站上放置一个包含应用程序整个堆栈的容器可能会更容易,例如。但是理想地用于生产用途,请尽量减少容器内的交互,在具有监督者的情况下将同一容器中的各个过程分开,这会带来僵尸过程和日志处理方面的问题(此处仅作说明之用)。
所以最后我将重点强调docker页面:
虽然“每个容器一个进程”通常是一个很好的经验法则,但这并不是一个硬性规定。根据您的最佳判断,使容器保持清洁和模块化。
没有适用于所有事物的“银弹规则”,它始终是容器内的复杂性与协调容器本身的复杂性之间的平衡。
实际上,这里的一个缺失点是水平可伸缩性。很久以前,杰米·阿尔奎扎(Jamie Alquiza)上有一篇文章谈到了这一点:
简而言之,您可以水平扩展php-fpm以获得更高的性能。一起扩展Nginx + php-fpm不会给您带来任何好处。我鼓励您自己进行一些压力测试(例如Tsung,Gatling等;请不要做Apache ab,这是一个非常古老的玩具),以验证文章中的内容。我个人有一些现实世界的经验证明这篇文章总体上是正确的。
但是裸机/虚拟机有两个缺点(也许不是Kubernetes):
编辑:现在快到2019年半年了。旧模型,同一容器中的php-fpm + nginx,具有不同的用法。如果您熟悉服务网格,那么nginx(或所谓的Nginmesh)可作为辅助车辆来处理东西向的交通。东西向的流量主要用于在服务或其他高级功能之间进行身份验证,而纯粹的php-fpm无法做到这一点。