Rails、Heroku 和子域。我的特殊情况可行吗?

Posted

技术标签:

【中文标题】Rails、Heroku 和子域。我的特殊情况可行吗?【英文标题】:Rails, Heroku and Subdomains. Is my special case scenario feasible? 【发布时间】:2011-06-19 18:04:46 【问题描述】:

这是我的场景:

我有一个必须支持多个客户端的应用程序。每个客户端都将获得一个用于该服务的子域。我们还将有一个没有应用程序的宣传册网站,它只是一个关于产品以及潜在客户如何在我们这里设置帐户的网站。

鉴于:

www.mycoolsite.com 将指向 Heroku 上的小册子应用程序。 client1.mycoolsite.comclient2.mycoolsite.comclient3.mycoolsite.com 都指向同一个 SaaS 应用程序,可以区分每个请求,我应该能够处理,所以他们只能看到他们的日期(即设置全局 client_id 或其他东西像这样)

我该怎么做呢?我对 DNS 做的不多,所以我不知道从哪里开始。

谢谢。

【问题讨论】:

我也遇到了这个问题,但没有找到解决方案(即使联系了 heroku 支持)。我发现的最接近的答案与 jpwynns 答案相同,但是如果您让人们通过注册页面注册 SaaS 应用程序的子域,那么该页面还需要将子域添加到您的 heroku 应用程序中(您可以不要使用通配符,因为它会与您的 www 冲突,而 Heroku 不允许这样做)。您的应用程序和主机之间的这种紧密耦合的集成可能是不可取的。如果有人解决了这个问题,我会很高兴。 【参考方案1】:

没有汗水。我们现在在 Heroku 这样做。我们碰巧使用 Godaddy 作为域名注册商,但任何 DNS 控制面板都可以让您做同样的事情。

我在这里读到的其他解释有点笼统,这里是具体的......

heroku 的解释很好,在:http://docs.heroku.com/custom-domains (甚至还有一个非常好的屏幕录像逐步展示)

关键是如果您的 ROOT 域 (mycoolsite.com) 位于 Heroku,您想要创建三个“A”记录,因为它们具有一些容错交叉魔法。所以你会有一个A记录

75.101.163.44
75.101.145.87
174.129.212.2

现在为每个子域创建一个 CNAME 记录

www  -> proxy.heroku.com
client1 -> proxy.heroku.com
client2 -> proxy.heroku.com
client3 -> proxy.heroku.com

现在在 HEROKu 方面,您有两个应用程序,对吧? “宣传册应用”和 saas 应用。

登录,然后为每个应用转到资源 -> 插件 -> 获取更多插件 ->自定义域(免费)

对于宣传册应用,添加一个域:www.mycoolsite.com

对于 saas 应用,添加每个客户端,例如:

client1.mycoolsite.com 
client2.mycoolsite.com 
client3.mycoolsite.com

就是这样。像冠军一样工作。玩得开心。

【讨论】:

哇,感谢您提供非常详细的答案,+1。我会试试这个,当我今天开始做这个时,我很可能会接受这个答案。 :) 如果您网站的公共地址没有www,例如twitter.com 而不是www.twitter.com,并且您还想做您正在谈论的事情(2 个应用程序,“主要”一个,说一个分期的),你能有这样的site.comstaging.site.com吗? 这真的应该在 Heroku 开发中心上,如上所示,以文本形式,而不仅仅是视频格式。 您好,我发现这很有帮助,但是,我的应用程序会自动创建用户子域。因此,只要我的客户注册到我的应用程序,我就会自动创建 myclient.myapp.com...这是否意味着我必须为每个客户手动创建 C 记录? @jalagrange 你应该可以使用 Heroku 的通配符子域,不过每月花费 5 美元。【参考方案2】:

您正在尝试做的事情非常可行,而且很容易做到。

您将需要ACNAME 记录的组合。简单来说,A 记录将主机名映射到 IP 地址,CNAME 记录充当A 记录的别名。

假设您的 SaaS 应用托管在 10.0.0.1,您的 Heroku 应用托管在 192.168.0.1,并且您希望 www.mycoolsite.commycoolsite.com 指向同一个 IP。

(注意:我从未在 Heroku 托管过任何东西,因此配置 DNS 可能会略有不同)

您首先需要的是域本身的A 记录。 (我在这里使用了BIND Zone File Syntax - 希望您的 DNS 提供商有一个更简单的管理系统。)

mycoolsite.com.      A      192.168.0.1    ; heroku
www                  CNAME  mycoolsite.com ; also heroku

这两条记录告诉我们mycoolsite.com 应该指向 Heroku 的 IP 地址,而www.mycoolsite.commycoolsite.com 的替代名称,它也将解析为 Heroku 的 IP 地址。

现在,让我们为您的 SaaS 站点设置 DNS。您可以为每个子域设置A 记录,但是如果您移动服务器,您将有很多 IP 地址需要更新。最简单的选择是配置一个A 记录,然后将应用程序的子域指向它:

sassapp              A      10.0.0.1        ; saas app server canonical name
client1              CNAME  sassapp         ; alias
client2              CNAME  sassapp         ; alias
client3              CNAME  sassapp         ; alias

然后,您可以根据需要添加任意数量的 CNAME。

【讨论】:

+1 讨论 ACNAME 记录。我需要了解更多关于他们的信息,谢谢!【参考方案3】:

我认为这不是问题。过去,Rails 在 subdomain_fu 等 gem 的帮助下支持了类似的子域。在 Rails 3 中,子域支持实际上是由 Ryan Bates http://railscasts.com/episodes/221-subdomains-in-rails-3 内置和覆盖的。看看那个截屏视频,了解从哪里开始的好方向。 我相信您需要 Heroku http://docs.heroku.com/custom-domains 的自定义域插件。

【讨论】:

railscasts 剧集+1。我在发布后立即观看,发现它非常有用!【参考方案4】:

这不会是一个问题。对于 DNS,为 mycoolsite.com 设置一条 A 记录,指向您希望应用程序所在的服务器。为为 heroku 配置的 www.mycoolsite.com 设置 A 记录。现在,您还需要重定向来自 mycoolsite.com 的流量(不带 www)并重定向到 www.mycoolsite.com,这将使您的***域为您的宣传册应用程序提供服务。一旦请求到达您的应用程序,您可以按照 raidfive 链接的教程进行操作,该教程将帮助您处理应用程序内部的子域。

【讨论】:

以上是关于Rails、Heroku 和子域。我的特殊情况可行吗?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:Heroku 的预编译?

rails: 如何基于子域覆盖locale?

Heroku、Rails 4 和 Rack::Cors

Rails assets_host、cloudfront 和 heroku

Rails Heroku Cloudflare SSL 和 websockets

Heroku/Unicorn 上反复出现 Rails 错误 - “执行已过期”,ActionView::Template::Error