我们有一个用 Ruby 编写的 Web 应用程序,可以通过 Docker 设置进行部署,除此之外,还可以使从开发人员到生产服务器的 Ruby 环境完全相同。
我们选择通过 Elastic Beanstalk 将其部署在 AWS 上,以利用其自动扩展配置和部署简便性。Beanstalk 支持部署 Docker 容器。
我们选择使用 Phusion Passenger,它需要与 Ruby 应用程序(因为它运行它)和与其紧密互连的 Web 服务器(nginx 或 apache)在同一主机上运行。因此 nginx+passenger 也在我们的 Docker 中运行。
如果我们将其部署在 Beanstalk 上,Beanstalk EC2 上会安装一个 nginx Web 服务器(由 Beanstalk 安装),作为 Docker 80 端口的简单代理。(实际上这有点令人惊讶,因为 AWS 文档中没有明确说明。)
1)在 EC2 主机上安装这个 nginx 代理,只是为了将端口 80 代理到端口 80,这不是无用的开销吗?如果我们考虑前面有一个弹性负载均衡器(ELB),它会为简单请求级联提供 3 个 Web 服务器。
2) 这是应该的工作方式吗?
其中一个不必要的不便之处是,例如,要更改 nginx 参数中的参数(如增加最大请求大小或超时),需要在两个 nginx 配置中(在 EC2 主机上通过 .ebextensions 和在 Docker 中)进行。
答案1
是/否:
- 是的,因为有一个额外的代理。
- 不,因为我们没有其他 Elastic Beanstalk Single Docker Container 的选择。使用此环境,您需要在 EC2 实例和 Docker 容器中安装 Web 代理/服务器。在我看来,Nginx 代理开销并不是什么大问题。
如果你愿意,你可以使用Elastic Beanstalk Ruby 环境。它删除了额外的 Nginx 代理,因为 Phusion Passenger 直接在 EC2 实例主机上运行。但是,您的应用程序不是 dockerize。
我猜你用的是Phusion Passenger Docker使用 Nginx + Ruby(对吧?)。即使您创建了一个运行 Phusion Passenger Standalone 的 Docker 容器,它实际上是一个由 Phusion 修改的 Nginx 服务器。