Heroku 地理定位 dns 和 Amazon Route 53
我有一個應用程序在 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(當地理是歐盟時)
- www.myapp.com CNAME myapp-us.herokuapp.com(當地理是我們時)
但是 Heroku 不接受在 2 個不同的應用程序中使用相同的 CNAME。
請問有人成功設置了與 Heroku 一起使用的 geo dns 嗎?
謝謝!
我打算用 HAProxy 發布解決方案,我想我之前已經在這裡給出了答案(儘管搜尋沒有出現)。
考慮到 Heroku 的全域應用程序命名空間限制,那(或類似的東西,你也可以使用 varnish 或 nginx)將是唯一可行的方法,因為沒有 DNS 服務可以做你想要的——主機頭重寫不能用 DNS 完成單獨配置。請求必須通過某種可以在執行中重寫標頭的系統。
但是,您只需要一個代理,而不是兩個。原因如下:
如果主機名是
myapp.example.com
,則將美國 Heroku 部署配置為僅期望該主機名。然後不要將 EU 部署配置為期望自定義主機名;您將使用非虛榮的主機名
myapp-eu.herokuapp.com
。Route 53 將被配置為返回 Heroku 端點作為美國查詢的答案,以及歐洲請求的代理端點。代理將重寫主機頭
myapp-eu.herokuapp.com
並將請求發送到 Heroku EU 端點,但 US 請求將直接發送到 Heroku US 端點,這需要客戶端已經使用的主機名。您也可以避免使用代理,而是使用 CloudFront 作為代理。請注意,此解決方案僅適用於 2 個目的地——在這種情況下為美國和歐盟——由於 CloudFront 的全域配置限制(只能為給定的傳入主機名配置 1 個 CloudFront 分配)……但對於此解決方案,1是我們所需要的。一個目的地(美國)使用直接連接並且不需要重寫,而另一個目的地(歐盟)通過 CloudFront 代理並獲得重寫。
創建 CloudFront 分配。將其配置為預期對
myapp.example.com
. 將其配置為使用非虛名 Heroku EU 端點主機名myapp-eu.herokuapp.com
作為其自定義源伺服器,並且不要將其配置為將原始請求中的 Host 標頭列入白名單。將您需要的任何其他標頭列入白名單。(可選)禁用記憶體。然後,CloudFront 會將Host:
標頭從myapp.example.com
配置的源伺服器主機名重寫為歐盟端點。然後,像以前一樣,將 Route 53 配置為針對來自應發送至美國端點的位置的請求返回美國 Heroku 端點 CNAME,但
dxxxxxxxx.cloudfront.net
為來自應發送至歐盟端點的位置的請求返回 CloudFront CNAME。無論哪種方式,您都需要為發送到通過代理或 CloudFront 的端點的流量的傳輸付費,因此您可能希望將其用於您希望看到較少流量的端點……所以您可能希望在上面的範例中轉置 EU 和 US,任意假設 US 會看到更多流量,因此它直接路由。
這些解決方案都不應該為請求增加大量的往返時間。如果您使用代理路由,您可能會發現一台非常小的機器(例如 t2.micro 或 t2.nano)可以處理您可能期望的更多流量,因為處理量很小。