如何在一个 EC2 实例上运行多个应用程序

Posted

技术标签:

【中文标题】如何在一个 EC2 实例上运行多个应用程序【英文标题】:How to run more than one app on one instance of EC2 【发布时间】:2013-05-09 01:54:00 【问题描述】:

我有几个小型生产站点和一堆有趣的爱好者/实验应用程序等。我想在一个 EC2 实例上运行所有这些。

我可以安装 node.js、npm、express 和 couchdb 一次,然后在不同的端口上运行每个应用程序,并在我的域注册表中调整 dns 设置以指向适当的位置吗?

更新:感谢迈克!对于在 EC2 上寻找多个 IP 地址的其他任何人:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html

【问题讨论】:

是的,虽然 DNS 不指向端口 - 它指向 IP 地址。 谢谢,迈克!嗯...那我该怎么做(在一个 EC2 实例上托管多个应用程序)? 多个 IP 地址?主机头? 谢谢迈克!对于在 EC2 上寻找多个 IP 地址的其他任何人:docs.aws.amazon.com/AWSEC2/latest/UserGuide/… 【参考方案1】:

有多种方法可以解决。

不同的端口

您可以在不同的端口上运行每个 Node.js 进程,然后简单地向全世界开放这些端口。但是,您的 URL 需要在每个项目的主机名末尾添加一个端口。 yoururl.com:8080/ 在技术上可以工作,但可能不是您想要的。

多个 IP 地址

您可以在一个 EC2 实例上使用多个 IP 地址,但是,每个实例需要支付大约 3.65 美元的额外费用。因此,如果您想在一个实例上托管 10 个不同的域,那么每月额外的托管费用超过 30 美元。

另一方面,任何使用 SSL 的域都需要自己的 IP 地址。

此外,您可以将limits to the number of IP addresses 分配给实例,并且实例越小,您获得的 IP 地址就越少。

您可以分配的 IP 地址数量因实例类型而异。小型实例最多可容纳 8 个 IP 地址(跨 2 个弹性网络接口),而高内存四重超大型和集群计算机 8 个超大型实例最多可分配 240 个 IP 地址(跨 8 个弹性网络接口)。有关 IP 地址和弹性网络接口限制的更多信息,请转到 Amazon EC2 用户指南中的实例系列和类型。

表达虚拟主机

Express 带有虚拟主机功能。您可以在一台 Node.js/Express 服务器下运行多个域,并根据域名设置路由。 Express 下的vhost 启用此功能。

反向代理

您可以在多个应用服务器前设置 nginx。这具有最大的灵活性。每个域可以有一个 Node.js 进程,它允许您一次在一个域上进行更新和重新启动。它还允许您在 Node.js 进程旁边的同一 EC2 实例下托管 Apache/php 等应用程序服务器。

使用 Nginx 作为反向代理,您还可以在同一域下托管不同的应用程序服务器,但提供不同的路径。

例如,Node.js 可以提供域的主根路径,但您可以设置 /blog/ 路径以转到同一 EC2 实例上的 Apache/PHP/Wordpress 设置。

【讨论】:

你摇滚! Nginx 听起来是下一个最好的去处。我对此知之甚少,所以我会到处谷歌。使用单独的 IP 怎么样? 关于多个 IP 的更新答案。 非常感谢丹尼尔!好东西!对于任何使用 SSL 的东西,我都需要新的 IP,这是肯定的。也许很快亚马逊就会采用 ipv6 并降低新 IP 的成本。 @Daniel 当您使用反向代理运行 3 个应用程序时,您对如何部署有什么建议吗?当我对一个应用程序使用“eb deploy”时,它会将其放在 /var/current 文件夹中,并出于某种原因将我的 nginx 代理文件抹回默认值。显然你不能以这种方式部署所有 3 个应用程序,所以只 rsync 是不是很糟糕? @Daniel 感谢您的回答。通过您的哪种方法,我可以在同一个域上运行多个节点应用程序/服务器,我的意思是我的主域使用 express 提供服务。我有另一个在节点上但使用 websockets ws 的小应用程序。我怎样才能同时运行这两者,以便 www.mysite.com 应由 express 节点应用程序提供服务,而 mysite.com/hello 应为 Web 套接字节点应用程序提供服务?【参考方案2】:

已经回复@https://***.com/a/50528580/3477353,但再次提及。

除了@Daniel 的回答,我想为那些正在寻找实现它的确切语法的人提及我的 nginx 的配置。

server 
  listen 80;
  server_name mysite.com;
  location / 
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  Host       $http_host;
    proxy_pass        http://127.0.0.1:3000;
  

server 
  listen 80;
  server_name api.mysite.com;
  location / 
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  Host       $http_host;
    proxy_pass        http://127.0.0.1:4500;
  

只需创建两个具有唯一服务器名称和端口地址的服务器对象。

在每个对象中记住 proxy_pass。

谢谢。

【讨论】:

以上是关于如何在一个 EC2 实例上运行多个应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon Auto-scaling 组中的多个 ec2 实例上部署和更新应用程序?

您如何使用 EC2 在多个服务器上分发您的应用程序?

如何确定为云应用程序部署哪些EC2实例?

最佳实践:单个 Amazon EC2 实例上的多个 django 应用程序

在一个 AWS EC2 实例上运行多个环境 (Elastic Beanstalk)

如何从公司内部机器浏览器访问 AWS EC2 实例私有 IP 以访问在 EC2 上运行的应用程序