创建多个Meteor.js应用程序实例在单个服务器上运行需要哪些主要步骤?

7
我设计了一个meteor.js应用程序,它在本地主机上运行得很好,甚至在部署到互联网上时也很好用。现在我想要创建一个注册网站,为每个在后端注册的客户端启动新的应用程序实例。假设使用meteor.js应用程序和python或javascript进行注册网站,需要采取哪些高级步骤来实现呢?
我正在寻找更正确、更完整的答案,形式如下:
  1. 使用类似node或python的东西调用一个shell脚本,该脚本可能会以sudo方式运行。
  2. 该脚本可能会创建一个新的文件夹来保存特定于实例的内容(如客户端文件、配置和/或该实例的数据库)。
  3. 脚本或python代码将在该文件夹中部署应用程序,并在特定端口上运行。
  4. Python可能会向类似Pound的工具添加配置信息,以将子域名转发到一个端口。
  5. 其他事情......!?
我不太理解在这里需要采取的高级步骤,因此如果有人能提供这些步骤,甚至还有一些有用的工具或教程来完成这些步骤,我将非常感激。

你反对使用Meteor的托管解决方案吗?你现在有启动应用程序的脚本吗? - user728291
我在某种程度上反对它,主要有两个原因...但它们可能是无效的:
  1. 在不久的将来,我打算添加用户上传内容的功能。我不认为能够控制存储空间或使用Meteor的解决方案来实现任何除了可以适合数据库的文件之外的东西。
  2. 在Meteor托管周围构建备份解决方案很困难。访问每个应用程序的数据库需要响应密码提示以获得短期Mongo密码,这使自动化变成了一项挑战。即使第1条是可能的,备份这些文件也不是我所知道的。
- funkyeah
我使用Meteor的deploy now,但实际上,引发这个问题的动力来自上述原因,导致它不再是可行的方法。 - funkyeah
3个回答

6
我有一个和你类似的情况,但最终是以完全不同的方式解决的。现在它作为Meteor智能包可用:

https://github.com/mizzao/meteor-partitioner

我们所面临的问题是,我们希望编写一个Meteor应用程序,好像只存在一个客户端(或在我的情况下是一组客户端),但它需要处理多组客户端而不让它们知道彼此的存在。我正在执行以下操作:
  • 假设Meteor应用程序仅针对单个实例进行编程
  • 使用智能包,在服务器上(可能还包括客户端)挂接集合,以便所有操作仅“作用域”于调用它们的用户实例。一种方法是自动附加一个“实例”或“组”字段到每个被添加的文档中。

正确地完成这项工作需要很多关于Meteor内部的知识,而我一直在学习。然而,这种方法比尝试同时部署多个Meteor应用程序更加清洁和资源节约。这意味着您仍然可以将应用程序编码为好像只存在一个客户端,而不是明确地为多个客户端这样做。此外,它允许您共享可共享的实例之间的资源(即静态资产、共享状态等)

有关详细信息和讨论,请参见:


正如reactioncommerce的Aaron在那些讨论中提到的,为每个租户创建单独的mongodb是否明智?你会如何自动化这样的事情? - Dheeraj Bhaskar
@DheerajBhaskar 那么你可能想要使用 Meteor 的新产品 Galaxy 托管。 - Andrew Mao

3
首先,我认为启动多个相同应用的实例是一个不好的设计选择。如果这只是一个临时措施,以下是我会建议的:
  1. 创建一个可以快速部署的存档文件。(打包应用程序,重新安装纤维(如果需要),重新压缩)。使用脚本在创建新实例时将存档文件(解压缩)部署到新文件夹中。

  2. 创建一个init脚本模板,并使用forever、daemonize或jesus等工具在重启时启动网站并在正常运行期间保持网站在线。请参见Meteor deploying to a VM by installing meteorHow does one start a node.js server as a daemon process?以获取示例。当部署新实例时,填充模板的值(例如端口号、数据库名称、文件夹)。将填好的模板复制到init.d并链接到runlevel。或者,创建一个在init.d中执行其他脚本以启动网站的脚本。

  3. 每个实例都应该监听它自己的端口,因此你需要一个反向代理。据我所知,Apache和Nginx在更改配置时需要重新启动,因此你可能需要查看Hipache https://github.com/dotcloud/hipache。Hipache使用redis存储配置信息。添加新实例需要向redis添加一个键。还有一个实验性的Hipache端口可以将功能带到Nginx中https://github.com/samalba/hipache-nginx

关于DNS更新呢?一旦创建了新实例,是否需要在DNS配置中添加新记录?


3
你认为重新设计或添加所需的架构以使应用程序成为多租户应用程序是最好的方法吗?对我来说,似乎一切都指向多实例架构对于这种类型的事情更好......我有多个客户端不需要相互通信,需要至少逻辑数据分离,将应用程序的注册、路由和数据分离分区似乎比在应用程序内部分区要困难得多;而自动进行实例化和更新每个实例似乎并没有那么困难。 - funkyeah
nginx不需要重新启动即可重新加载其配置。 - Dan Dascalescu

2
我并没有对你的问题给出答案...但我想提醒你可能会遇到的另一个潜在问题,因为我看到你提到了Python,换句话说,你可能正在Apache/Nginx等上运行其他Web应用程序...问题是Meteor与另一个HTTP服务器共存时不太友好,我们正在处理的项目就受到了这个问题的困扰,经过几天与Meteor的人们挣扎后,我们不得不将其移动到一个独立的服务器上...我没有参与解决此问题,因此无法给你更多细节,但我在网上找到了类似的内容:https://serverfault.com/questions/424693/serving-meteor-on-main-domain-and-apache-on-subdomain-independently
只是提醒一下...

Python只是一个想法,但绝对不是必需品。不过这是很好的信息,谢谢! - funkyeah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接