13

我正在开发一个应用程序 (RoR + Heroku),它允许用户使用我的子域 (pagename.myapp.com) 或使用他们自己的域 (pagename.com) 创建自己的网站。重要的一点是,此选项是我业务的关键:子域是免费计划,自定义域是付费计划。所以我有一个表,我在其中存储每个用户的自定义域并检查此页面是否处于活动状态(存在并已支付配额)。

为此,我需要让用户能够将他们的域指向我的服务器。我们都知道 Heroku 不推荐使用DNS A-Records

此外,我想尽可能多地抽象这个功能,以便将来能够切换我的基础设施(Heroku 到 AWS),而不必要求我的所有用户更改他们的 DNS 区域。考虑到这一点,我认为最好的选择是运行 EC2 代理(使用 AWS Elastic IP)之类的东西,让我拥有这个 IP 的所有权。我认为这个代理应该重定向到proxy.myapp.com,我会在应用程序级别解决请求。

由于我没有找到明确的信息,我不确定这个假设是否是最好的解决方案以及如何设置代理(使用哪种类型的代理?也许是Nginx ?)。

话虽如此,我想请教解决这个“常见”功能的建议/最佳实践。

谢谢

4

2 回答 2

5

您想要做的是相当直接的实施。您对设置代理的假设是正确的。Nginx 或 haproxy 都可以很好地解决这个问题(我个人会使用 haproxy)。以下是您会遇到的一些问题:

  1. 在代理服务器上更改主机标头可能会导致最终 Web 应用程序生成不正确的链接。您可以使用相对路径来解决此问题,但这需要 Web 应用程序开发人员了解他们正在运行的环境。

    1. 用户连接到 www.example.com(代理服务器)
    2. 代理服务器连接到 www.realdomain.com(网络应用程序)
    3. 该网络应用程序有一个购物车链接。www.realdomain.com/shoppingcart
    4. 最终用户点击链接,但链接是 www.realdomain.com/shoppingcart 而不是 www.example.com/shoppingcart
  2. 主机充当代理服务器的成本。这可能很快就会失控。例如,您是否想要冗余,如果是,您打算如何实施?您打算终止 ssl 吗?如果是这样,您将不得不增加 CPU 数量以适应额外的负载。你想从你的代理安全连接到heroku吗?如果你这样做了,那么你也需要为此增加 CPU 数量。根据并发连接的数量,您可能还需要添加额外的 ram。

  3. Heroku 还会定期更换负载均衡器。这很重要,因为您的代理服务需要每 60 秒重新加载配置/更新 heroku 实例的 IP 地址。根据我的经验,他们可能每天更改一两次,但他们使用的 DNS 条目有 60 秒的 TTL。这意味着您应该确保能够每 60 秒更新一次配置。

我的公司近一年来一直在做与此非常相似的事情。我们使用 haproxy 并简单地让它定期重新加载配置。我们从未对最终用户造成中断或中断。Nginx 也是一个非常好的产品。它内置了 DNS 缓存,因此如果您使用该路线,您需要确保正确配置它,以便 DNS 缓存 TTL 为 60 秒。

于 2013-08-20T22:09:31.100 回答
0

您的许多客户是否希望在其域顶点上使用您的应用程序?例如 example.com 而不是 theapp.example.cpm?如果没有,我建议让他们 CNAME 到 proxy.myapp.com,而 CNAME 到 myapp.herokuapp.com。然后,您可以在不中断客户的情况下更新 proxy.myapp.com。

如果确实需要 apex 或 A 记录支持,则需要将 Nginx 设置为 Heroku 应用程序的反向代理。请记住,如果您需要客户端域的 HTTPS 支持,您将需要在您的代理上进行某种证书管理。

于 2013-08-21T05:02:24.573 回答