php - 使用 docker 的多个 nginx/php 应用程序的体系结构

标签 php nginx docker

我一直在直接在 vps 上的单个 nginx/php-fpm 安装上运行我的大部分应用程序。我决定试用 docker,并且已经玩了一个星期了。我已经阅读了所有可能的内容,并且相信我理解它的概念。

但我无法理解有这么多 nginx、php 和 db 实例。

我解决的一件事是我想要 1 db,所以这很容易:

mariadb:
  image: mariadb:latest
  container_name: mariadb
  ports:
    - "127.0.0.1:3306:3306"
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: xxxxx
  volumes:
    - /srv/mysql:/var/lib/mysql

我还发现 nginx-proxy 和 nginx-certs 一起工作很有魅力:

nginx-proxy:
  image: jwilder/nginx-proxy
  container_name: nginx-proxy
  ports:
    - "80:80"
    - "443:443"
  restart: always
  volumes:
    - /srv/certs:/etc/nginx/certs:ro
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - ./vhost.d:/etc/nginx/vhost.d
    - /usr/share/nginx/html


nginx-certs:
  image: jrcs/letsencrypt-nginx-proxy-companion
  container_name: nginx-certs
  volumes:
    - /srv/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock:ro
  volumes_from:
    - nginx-proxy

这都是花花公子。但是我该如何处理实际的应用程序容器呢?

我想将 ram 使用量保持在最低限度,因此建议:

  1. 1 个 php-fpm 容器,内部有多个卷和多个 nginx 服务器
  2. 1 个 nginx 服务器和多个 php-fpm 容器?
  3. 每个项目有 1 个容器,并将 nginx/php-fpm 放在该容器内
  4. X 个 nginx 容器 + X 个 php-fpm 容器。 X 数量的应用。

有什么想法吗?

最佳答案

您应该只需要每个主机 1 个 nginx 容器,并使用它在您的 php 容器之间进行负载平衡。如果你在 nginx 容器上正确设置了重启策略,它应该一直在运行,而且 nginx 可以处理很多负载,所以只有一个应该没问题。

当您拥有多个 nginx 时,管理起来也会变得更加困难,因为一次只能有一个容器绑定(bind)到端口 80 和 443,并且您需要在两个 nginx 容器之前放置一些东西来在它们之间进行负载平衡那种情况。如果您想要冗余,您可以添加另一台具有完全相同设置的主机,即主机之间的负载平衡。

1 db 容器和数据卷是好的。

至少 1 个 php 容器,最好不止一个,但取决于您的负载。如果您计划在运行时更改容器中的数据(php 文件)(不推荐),请确保使用卷,并在所有 php 容器之间共享。

在 php 容器之间进行 nginx 负载平衡,并确保正确设置 php 容器的重启策略。

如果您需要更新 php 容器镜像,如果您有多个容器镜像,那么您可以更轻松地进行滚动升级,而无需停机。

  1. 下拉新图片
  2. 停止 php1 容器,从新镜像开始
  3. 停止 php2 容器,从新镜像开始

完成,滚动升级,无需停机。

此设置适用于一个或多个站点。唯一的区别是 nginx 将根据主机名处理对正确 php 容器的代理。

所以你总是有 1 个 nginx,但 php 容器会根据你托管的网站数量增长。

关于php - 使用 docker 的多个 nginx/php 应用程序的体系结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36954555/

相关文章:

docker - odoo docker多个实例

php - 使用带有复选框的 html post 函数

php - ElasticSearch PHP SDK简单查询不起作用

php - 如何安全地将可疑的 SQL 注入(inject)攻击存储在数据库中?

python - Flask/uWSGI/CentOS - 更新不起作用

docker - 运行docker ps时看不到Docker镜像

php - 计算 <li> 被打印了多少次

ubuntu - 在 AWS 上安装 nginx 后禁止 403(不欢迎 nginx 消息)

node.js - 使用 nginx 应用程序在基本 url 上运行 NodeJs Express 应用程序

使用 EFS 的 AWS ECS 上的 MongoDB Docker 容器