heroku - Multi-Tenancy Web 应用程序的自定义域

标签 heroku proxy dns amazon-ec2 multi-tenant

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

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

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

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

说到这里,我想问一下解决这个“常见”功能的建议/最佳实践。

谢谢

最佳答案

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

  • 更改代理服务器上的主机 header 可能会导致最终 Web 应用程序生成不正确的链接。您可以使用相对路径来解决此问题,但这需要 Web 应用程序开发人员了解他们正在运行的环境。
  • 用户连接到 www.example.com(代理服务器)
  • 代理服务器连接到 www.realdomain.com(网络应用程序)
  • 该网络应用程序有一个购物车链接。 www.realdomain.com/shoppingcart
  • 最终用户点击链接,但链接是 www.realdomain.com/shoppingcart 而不是 www.example.com/shoppingcart
  • 主机充当代理服务器的成本。这可能会很快失控。例如,您是否需要冗余,如果是,您打算如何实现?你打算终止 ssl 吗?如果是这样,您将不得不增加 CPU 数量以适应额外的负载。您想通过代理与 heroku 建立安全连接吗?如果这样做,那么您还需要为此增加 CPU 数量。根据并发连接的数量,您可能还需要添加额外的内存。
  • Heroku 还会定期更改他们的负载均衡器。这很重要,因为您的代理服务需要每 60 秒重新加载配置/更新 heroku 实例的 IP 地址。根据我的经验,他们每天可能会更改一两次,但他们使用的 DNS 条目有 60 秒的 TTL。这意味着您应该确保您能够每 60 秒更新一次配置。

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

    关于heroku - Multi-Tenancy Web 应用程序的自定义域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18340820/

    相关文章:

    c# - MVC : how to correctly serve multiple domain names from one site (different content for each)

    linux - 无法使用 heapster 和 kube-dns 在 Kubernetes 上解析 monitoring-influxdb

    redirect - CloudFlare 重定向到特定端口

    ruby-on-rails - 如何从 SQLite 迁移到 PostgreSQL (Rails)

    ruby - 访问页面 :backups from Heroku Scheduler

    Webpack 代理到代理

    tcp - 使用代理复制 TCP 流量

    ruby-on-rails - Highcharts 不适用于 Heroku 环境,适用于本地环境

    ssl - Heroku SSL 端点 - "No Such App"

    browser - fiddler 不捕获任何浏览器流量(不捕获 IE、FF 或 CHROME)