多租户Web应用程序的自定义域

时间:2013-08-20 16:57:09

标签: heroku proxy dns amazon-ec2 multi-tenant

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

为此,我需要为用户提供将其域指向我的服务器的功能。我们都知道Heroku不建议使用DNS A-Records

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

由于我没有找到关于这一点的明确信息,我不确定这个小说是否是最佳解决方案以及如何设置代理(代理使用哪种类型?Nginx可能?)。

说,我想问一下建议/最佳实践来解决这个“共同”特征。

由于

2 个答案:

答案 0 :(得分:4)

您想要做的是相当直接的实施。您的假设对于设置代理是正确的。 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秒更新一次配置。

  4. 我公司近一年来一直在做与此类似的事情。我们使用haproxy并让它定期重新加载配置。我们从未对最终用户造成中断或中断。 Nginx也是一款非常好的产品。它内置了DNS缓存,所以如果你走这条路线,你需要确保正确配置它,以便DNS缓存TTL是60秒。

答案 1 :(得分:0)

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

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

相关问题