2

问题

我在这里不知所措,请指出我是否想将苹果与面包进行比较。

我想了解人们是如何做这种特定模式(或一组模式)的,这对我来说似乎很神奇。

注意:下面的具体问题(答案需要是对此的解决方案)

图案

1.银河流星托管

DNS 配置中,他们要求我们将 CNAME 从 www.customer1.com(您)设置为galaxy-ingress.meteor.com.

这让我大吃一惊,他们如何能够根据源域重定向多个站点。其中许多可能是高流量。这也应该是高性能的。

2. Github.com 页面

只需在他们的设置中添加您的域并将 CNAME 设置为他们给您的常量域。完毕。

注意:我对细节很模糊 - 转发到常量域或您的GH pages user domain类似user.github.io,不要准确回忆。

3. Gitlab.com

他们给了你一个 IP 来指向A record,不过,这对我来说似乎对正常运行时间不太友好。

PS:我爱这些家伙,Git + CI + docker repo 免费,我一定是在做梦。

4. Heroku

  1. 通过命令行或通过他们的 web gui 添加域。
  2. 将 CNAME 添加到您的 app-name.heroku

这(如上面的几个)将是最好的,xyz.herokuapp.com即使没有自定义域,您也可以使用默认 URL。

5.浪涌.sh

  1. 将域添加到一个名为 CNAME 的文件(我很怀疑,最初,这会起作用,它太简单了:))
  2. 将 CNAME 添加到您的 xyz.surge.sh 网址

6. 模数.io

(我可以继续使用这个列表)

具体问题

我想根据上面的设置

    • 当 www.website1.com 具有到 ingress.yourwebsite.com 的 CNAME 时,显示与其站点相关的内容
    • 当 www.website2.com 具有到 ingress.yourwebsite.com 的 CNAME 时,显示与其站点相关的内容
  1. URL 应显示 www.website1.com 或 www.wesbite2.com 而不是 ingress.yourwebsite.com
  2. 以编程方式添加新站点很容易
  3. 保持高性能和正常运行时间友好
  4. 在 IaaS(数字海洋、AWS 等)提供商上实施。(尽管正如一个答案所暗示的那样,您可以使用 PaaS(Heroku、Modulus 等)提供者的 API,这不是作弊,因为这样做一无所知,因为 API 抽象了实现)

性能:我的意思是,如果可以在 DNS 层完成,您就不会在应用层执行此操作。

正常运行时间友好:我的意思是,如果服务器实例出现故障,该服务不会停止工作

奖金

如何使 website1.com 和 website2.com 工作(注意没有www.)?

www.website1.com转发到website1.com(或根据您的喜好以其他方式)

我想像谷歌应用程序一样在内部进行设置,我不希望用户在他们的 DNS 上进行花哨的设置,比如根目录下的 CNAME 等。

技术偏好

如果可能,请使用其中之一而不是其竞争对手。当您通过这样做做出次优选择时,请提及。

为了:

  1. 流星JS
  2. 节点JS
  3. Javascript
  4. Cloudflare.com API
  5. Nginx
  6. 任何高星级的 github.com 存储库(例如,1k+)

PS:我提到这个偏好不是一个dou*he,而是重用我已经知道的东西。

可能的解决方案(我不是在寻找):

  • iframe(糟糕的 SEO 等)
  • mod_rewrite(是 github 和其他人使用 mod_rewrite,似乎是应用程序级别和 kludgy)

更新 #1(2016 年 7 月 13 日)

我试过的

    • 使用自定义域(例如 xyz.com)将meteorJS 应用程序部署到heroku,并尝试以编程方式路由a.xyz.com 等,出现此域中不存在herokuapp 之类的错误。
    • 阅读了很多关于 hoerku 的通配符域但没有帮助的信息
    • 使用自定义域(例如 xyz.com)将meteorJS 应用程序部署到meteor.com,并尝试以编程方式路由a.xyz.com 等,但出现错误,例如该域中不存在meteor 应用程序。
    • 他们无法访问 DNS(我认为这需要工作的地方)
    • meteor.com 免费托管已关闭
    • 我猜这应该比我正在制作的缠结的毛线球更容易。
    • 如果我可以以编程方式设置CNAMEs (使用 cloudflare.com API,这可能在其他地方吗?)website1.yourwebsite.com当有人点击时website1.yourwebsite.com,我应该知道根据 URL(应用程序级别)提供哪些内容,然后我可以301 redirect对实际主机做一个?URL 更改为301 redirect。当!

更新 #2(2016 年 7 月 30 日)

    • 更新问题以澄清这需要在 IaaS(数字海洋、AWS 等)上实施。如果您使用的是 PaaS(Heroku、Modulus 等)提供者的 API,您仍然不知道这种模式是如何实现的,它已经被 API 抽象掉了。
4

1 回答 1

1

作为 Modulus 的一名员工,我可以就其工作原理提供一些见解。或者至少它在 Modulus 平台上是如何工作的。

我们使用传入的主机头/ SNI知道将流量路由到哪个项目。我们有负载平衡器 -> 主机 -> 伺服器。当您的应用程序收到请求时,它会访问我们的负载均衡器,该负载均衡器具有静态 IP 地址(或多或少)。我们的负载均衡器在内存数据库中进行主机查找以查找应用程序的位置。负载均衡器将请求路由到项目所在的主机,然后路由到项目所在的确切伺服器。响应来自应用程序,该应用程序从伺服器返回到主机,然后返回到负载均衡器,负载均衡器在响应离开负载均衡器并返回之前检查一些事情(例如是否为您的项目设置了 SSL)访问您的应用程序的人。当您在模数项目仪表板上查看项目指标时,“指标”部分,“响应时间”

当您将自定义域放入组合中时,其工作原理几乎相同。您设置 DNS 以使用“A 记录”将您的域解析到我们的负载均衡器。您也可以使用 CNAME,但我认为 A 记录效果最好。使用 A 记录,您可以定义所有流量首先路由到哪个负载均衡器。这可能会影响诸如 x-forwarded-for 之类的事情。您可以在此处阅读有关在我们的服务中使用自定义域的更多信息。我们可以更深入地了解这部分,但在那篇“自定义域”文章中对此进行了很好的解释。

关于您关于以编程方式设置项目/应用程序的问题,最好为每个应用程序/网站设置一个单独的项目。那将是最简单的。您可以创建一个项目,该项目以编程方式创建具有自定义域的其他项目,但您必须对我们的 CLI 进行逆向工程,或者等到我们发布我们的公共 API(这应该在几个月后发生)。

如果您想对我们的 CLI 进行逆向工程,您可以通过在此处分析我们的开源代码来实现。您必须先在 CLI 中创建一个令牌,$ modulus token create然后您可以使用它来发出 API 请求https://api.onmodulus.net/<XYZ or project etc>?create&authToken=<authToken goes here>

如果你想多聊,你可以随时在 Meteor Chef Slack 群中找到我,你可以在这里加入。

我希望这些基本信息可以为您解决这个问题提供一些指导。:)

于 2016-07-29T13:50:47.437 回答