Heroku、GeoIP、亚马逊 Route 53

Posted

技术标签:

【中文标题】Heroku、GeoIP、亚马逊 Route 53【英文标题】:Heroku, GeoIP, Amazon Route 53 【发布时间】:2015-08-24 10:43:11 【问题描述】:

我开始为我的 Heroku 应用设置 2-Region,然后使用 Amazon Route 53 GeoDNS 服务创建分配工作负载。

解决方案 1 失败

a = api.mydomain.com, Europe, myApp-EU.herokuapp.com
b = api.mydomain.com, US, myApp-US.herokuapp.com

a,b 失败: 因为 Heroku 不知道“api.mydomain.com”。

解决方案 2 失败

a = api.mydomain.com, Europe, CNAME api-eu.mydomain.com
b =  api.mydomain.com, US, CNAME api-us.mydomain.com
c =  api-eu.mydomain.com, Europe, myApp-EU.herokuapp.com
d =  api-us.mydomain.com, US, myApp-US.herokuapp.com

c,d 工作,因为 heroku 知道“api-eu.mydomain.com”。 a,b 不起作用,因为 heroku 不知道“api.mydomain.com”

此时我会得出结论,Herou 不可能?

【问题讨论】:

【参考方案1】:

在 http/s 环境中,两个因素必须结合在一起。 (从问题中可以看出您理解这两个问题,但请在我澄清时放纵我)。

请求主机名必须可直接解析为端点 IP 地址,使用 DNS A 记录,或间接通过 CNAME 记录,

目标必须期待在Host: http 标头中具有原始 主机名的请求。

Heroku 显然理解应用应支持自定义主机名的概念,例如 eu-app.example.comapi.example.com

如果他们的系统允许您为这两个应用程序分配相同的主机/域名,问题就会自行解决,因为您将地理 DNS 映射配置到适当的区域 CNAME 目标,它会按预期工作。既然你问了这个问题,我认为情况并非如此。

根据在 Heroku 上托管对您有多大用处,鉴于这个明显的问题,一个简单且成本相对较低的解决方案将是每个目标区域中的一个 EC2 实例,其唯一目的是接收那些地理路由的请求,重写Host: 标头到 Heroku 期望看到的内容,并反向代理请求。

我有一个类似的应用程序,其中我有一个具有一个主机名的静态站点,存储在具有不同名称的 S3 存储桶中。对于静态网站托管,S3 要求存储桶名称等于浏览器在 Host: 标头中发送的值,这会阻止来自不同主机名的 CNAME 工作,原因完全相同你在这里看到了。

代理服务器在 t2.micro 实例上运行 HAProxy,每月不到 10 美元,每天提供数千次点击,几乎不使用 t2.micro 上的任何 CPU(我的信用余额总是超过 100),因为 HAProxy写得很好,并且依赖于资源使用。由于 EC2 机器与 S3 存储桶位于同一区域,因此添加到每个请求的额外延迟是微不足道的。当然,作为额外的奖励,我可以获得实时日志记录、标头捕获以及后端服务性能和行为的外部视角。 nginx 或 Varnish 或其他几个代理服务器可能用于相同目的。您可以将它们放在部署应用程序的相同区域,但对于一个区域,如果 Heroku 平台直接期待您的 api.example.com,您可以跳过它。从技术上讲,您只需要在一个位置使用它。

这样做的原因是 HAProxy 不关心传入的 Host: 标头包含什么,除非您将其配置为根据该标头做出路由决策。

您还可以在所有 HAProxy 实例上加载您的 api.example.com SSL 证书,它会终止 SSL 并使用新的 SSL 连接将请求转发到端点,该端点可以使用任何有效的 SSL 证书,包括任何目标端点可能支持的通配符/非虚荣证书。

【讨论】:

【参考方案2】:

在查看了不同的解决方案后,我想出了如何处理它。 AKAMAI 和 Fastly 是允许您覆盖“http 主机标头”的 2 个 CDN 服务。通过这种方式,Heroku 知道请求来自“api-eu.mydomain.com”,因为 Akamai 能够覆盖“api.mydomain.com”主机头。

【讨论】:

以上是关于Heroku、GeoIP、亚马逊 Route 53的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Heroku / Amazon cloudfront / route 53 重定向

如何使用自定义 SSL 正确链接 Heroku、CloudFront、Route53?

route53 裸域未到达亚马逊弹性负载均衡器

亚马逊route53 DNSSEC支持

使用 Route 53 设置子域亚马逊

Heroku + Rails + GeoIp = 未初始化的常量 GeoIP 错误