我在 2 个地区(欧盟和美国)的 Heroku 上运行了一个应用程序。假设:myapp-eu.herokuapp.com 和 myapp-us.herokuapp.com。
我想设置一个地理位置 DNS,当用户访问我们的网站 www.myapp.com 时,它将指向最近的地区。
到目前为止我所做的是使用 Amazon Route 53 设置 2 个 CNAME 记录:
- www.myapp.com CNAME myapp-eu.herokuapp.com (当地理位置为 eu 时)
- www.myapp.com CNAME myapp-us.herokuapp.com (当地理位置为我们时)
但是 Heroku 不接受在两个不同的应用程序中使用相同的 CNAME。
有人成功设置了可与 Heroku 配合使用的地理 DNS 吗?
谢谢!
答案1
我本来打算使用 HAProxy 发布解决方案,我认为我之前已经在这里给出过答案(尽管搜索没有找到)。
鉴于 Heroku 的全局应用程序命名空间限制,这种方法(或类似方法,您也可以使用 varnish 或 nginx)将是唯一可行的方法,因为没有 DNS 服务可以满足您的要求——仅使用 DNS 配置无法完成主机标头重写。请求必须通过某种可以在传输过程中重写标头的系统。
但是,您只需要一个代理,而不是两个。原因如下:
如果主机名是myapp.example.com
,则将美国 Heroku 部署配置为简单地期望该主机名。
然后,不要将 EU 部署配置为使用自定义主机名;您将使用非虚荣主机名myapp-eu.herokuapp.com
。
Route 53 将配置为返回 Heroku 端点作为美国查询的答案,以及返回代理端点作为欧盟请求的答案。代理将重写主机标头并将myapp-eu.herokuapp.com
请求发送到 Heroku 欧盟端点,但美国请求将直接发送到 Heroku 美国端点,该端点将预期客户端已在使用的主机名。
您也可以避免使用代理,而是使用 CloudFront 作为代理。请注意,由于 CloudFront 的全局配置限制(只能为给定的传入主机名配置 1 个 CloudFront 分发),此解决方案仅适用于 2 个目的地(在本例中为美国和欧盟)...但对于此解决方案,我们只需要 1 个。一个目的地(美国)使用直接连接并且不需要重写,而另一个目的地(欧盟)通过 CloudFront 代理并获得重写。
创建 CloudFront 分发版。配置它以接收 的请求myapp.example.com
。配置它以使用非虚荣 Heroku EU 端点主机名,myapp-eu.herokuapp.com
作为其自定义源服务器,以及不要配置它以将原始请求中的 Host 标头列入白名单。将您需要的任何其他标头列入白名单。(可选)禁用缓存。然后,CloudFront 会将标Host:
头从myapp.example.com
配置的 Origin 服务器主机名(即 EU 端点)重写。
然后,与之前一样,配置 Route 53,以便对于来自应前往美国端点的位置的请求返回美国 Heroku 端点 CNAME,但对于来自dxxxxxxxx.cloudfront.net
应前往欧盟端点的位置的请求返回 CloudFront CNAME。
无论哪种方式,您都需要为通过代理或 CloudFront 发送到端点的流量的传输付费,因此您可能希望将其用于您希望看到较少流量的端点...因此您可能希望在上面的例子中转置欧盟和美国,这些例子任意假设美国会看到更多的流量,因此它直接路由。
这两种解决方案都不会显著增加请求的往返时间。如果您采用代理路由,您可能会发现非常小的机器(如 t2.micro 或 t2.nano)可以处理比您预期更多的流量,因为处理最少的流量。