我有一个应用程序运行在Heroku的2个地区,欧盟和我们。 让我们说:myapp-eu.herokuapp.com和myapp-us.herokuapp.com。
我想build立一个地理位置的DNS指向用户到最近的地区,当他们访问我们的网站www.myapp.com。
到目前为止我所做的是使用Amazon Route 53来设置2个CNAMElogging:
但Heroku不接受在两个不同的应用程序中使用相同的CNAME。
任何人都已经成功地build立了一个与Heroku合作的地理DNS?
谢谢!
我打算用HAProxy发布解决scheme,我想我已经在这里给出了答案(尽pipesearch没有提交)。
考虑到Heroku的全局应用程序名称空间限制,这个(或类似的,你也可以使用varnish或nginx)将是唯一可行的方法,因为没有DNS服务可以做你想做的事情 – 主机头重写不能用DNS来完成单独configuration。 这个请求将不得不通过一个可以重写头文件的系统。
但是,你只需要一个代理,而不是两个。 原因如下:
如果主机名为myapp.example.com ,则将美国Heroku部署configuration为简单地期望该主机名。
那么不要将EU部署configuration为期望自定义主机名; 您将使用非虚荣主机名myapp-eu.herokuapp.com 。
路由53将被configuration为返回Heroku端点作为美国查询的答案,以及EU请求的代理端点。 代理会将主机头重写到myapp-eu.herokuapp.com并将请求发送到Heroku EU端点,但是美国请求将直接到达Heroku US端点,这将期望客户端已经使用的主机名。
您也可以避免使用代理,而使用CloudFront作为代理。 请注意,由于CloudFront的全局configuration限制(对于给定的传入主机名只能configuration一个CloudFront分配),因此此解决scheme仅适用于2个目标(在此情况下为美国和欧盟)…但对于此解决scheme,是我们所需要的。 一个目的地(美国)使用直接连接,不需要重写,而另一个目的地(EU)通过CloudFront进行代理并进行重写。
创build一个CloudFront分配。 将其configuration为预计对myapp.example.com请求。 将其configuration为使用非虚拟的Heroku EU端点主机名myapp-eu.herokuapp.com作为其自定义源服务器,并且不要将其configuration为将原始请求中的主机标头添加到白名单。 将您需要的任何其他标题列入白名单。 或者,禁用caching。 然后,CloudFront会将myapp.example.com的Host:标题重写为configuration的Origin服务器主机名,该Host:名将是EU端点。
然后,像以前一样,将Route 53configuration为返回美国Heroku端点CNAME,以查找来自应该到达美国端点的位置的请求,但返回CloudFront dxxxxxxxx.cloudfront.net CNAME以查找应该到达EU端点的位置的请求。
无论采用哪种方式,您都需要支付通过代理或CloudFront发送到端点的stream量,因此您可能希望将其用于期望看到stream量较低的端点。在上面的例子中,你可能想要转换欧盟和美国,而这些例子都是假设美国会看到更多的stream量,所以它直接路由。
这些解决scheme都不会增加请求的显着往返时间。 如果你使用代理路由,你很可能会发现一个非常小的机器,比如t2.micro或者t2.nano,可以处理更多的stream量,因为它可以处理最less的stream量。