Domain-Name-System

如何為動態站點的動態域數設置 AWS Cloudfront?

  • October 9, 2015

設置

我們有一個類似 webs/wix/etc 的網站管理系統,我們正在嘗試與 CloudFront 一起使用。它具有以下域和子域。

  • ourdomain:我們的主要網站

  • admin.ourdomain:每個網站的管理界面,可通過 https 訪問

  • images.ourdomain:一個 S3 儲存桶

  • router.ourdomain:見下文

$$ customersomething $$.ourdomain:我們免費使用者的子域

-$$ customersomething.com $$: 為我們的高級客戶提供的域名 該系統以某種方式工作,其中大多數域都是 CNAME-d 到 router.ourdomain (因為對於我們的客戶來說這是最簡單的方法,他們有不同的域註冊商等),並且 router.ourdomain 是我們的別名ELB,然後是我們 EC2-s 上的 PHP 基於 HTTP_HOST 值處理站點,而他的圖像來自 S3。

我們的計劃

現在我們想把這一切都放在 CloudFront 後面。大多數東西都是微不足道的。很容易將 S3 放在 CF 後面。通過asset.ourdomain 子域將每個ourdomain/*.(js|css) 放在CF 後面很容易。很高興我們可以使用 .images.ourdomain 在子域之間進行分片,從而減少客戶端載入時間等。我們甚至可以通過放置“.ourdomain”將每個 *.ourdomain 內容(包括動態 PHP 免費站點)放在 CF 後面進入 CF 參數。

問題

但是我們無法弄清楚的一件事是如何將所有動態創建的具有自定義域的 PHP 站點放在 CF 後面。提醒一下:這些是 CNAME-d 到 router.ourdomain。將每個域放入 CF 參數不是一種選擇,因為我們需要能夠處理數以萬計的域名,並且我們需要在不為每個域名手動配置的情況下做到這一點。

所以我們的想法是我們應該將router.ourdomain作為備用域名放入CF配置中,將router.ourdomain指向路由53中的CF,並將CF指向我們的ELB作為源。我們發現這是每次獲取此消息的好方法:“錯誤無法滿足請求。錯誤的請求。由雲端(CloudFront)生成”。其實不是每次都www.ourdomain 正常工作(它是 CNAME 到 router.ourdomain),但每個其他子域都會給出上述錯誤(* .ourdomain 是 CNAME 到 router.ourdomain,但即使是那些 CNAME 到路由器的子域也是如此。 ourdomain 一個一個,除了 www,當然還有路由器)。所以現在我們不僅不知道我們應該如何解決這個問題,我們甚至不明白,為什麼它對 www 不起作用,反之亦然。

任何想法和想法將不勝感激,謝謝。

提醒一下:這些是 router.ourdomain 的 CNAME-d

是的,你提到了。事情是這樣的:

沒關係。

是的,CloudFront 將備用主機名稱為 CNAME。是的,CNAME DNS 記錄是您將給定站點的流量路由到 CloudFront 的典型方式。但是不,將主機名配置為指向您的 CloudFront 分配的 CNAME 與現在的 Cloudfront 或通常的 HTTP 無關。

當瀏覽器想要連接到 Web 伺服器時,它會從 DNS 中查找 IP 地址。如果路徑中有 CNAME,則該資訊將被丟棄。瀏覽器關心的是“我連接到什麼 IP 地址?”

假設 www.example.org 是 webfarm.example.com 的 CNAME。瀏覽器查找 www.example.org 並以 webfarm.example.com 的 IP 地址結束。

得到答案後,瀏覽器與 Web 伺服器建立連接並發送請求。

GET / HTTP/1.1
Host: www.example.com

瀏覽器發送的 http 請求的Host:頭部包含地址欄中顯示的主機名。CNAME 資訊對瀏覽器或 Web 伺服器完全不可用且未知。

那麼 CNAME 如何與請求解析和第 7 層路由相關呢?不可能。CNAME 目標僅用作查找要連接的 IP 地址的路徑。

您的發行版並不是 Cloudfront 中唯一使用這些 IP 地址的發行版。還有成百上千的其他人。它歸結為Host:標題。

“CNAME”(備用主機名)列表是一組主機名,供 CloudFront 在傳入Host:標頭中匹配,以確定應將請求視為屬於您的分配。它Host:是瀏覽器可能發送的標頭列表。在Host:標頭與分配中的配置值匹配之前,與該請求關聯的分配是未知且未定義的。

如果 Cloudfront 無法將傳入Host:標頭與任何分配匹配,它會做什麼?

HTTP/1.1 400 Bad Request

因此,您看到的行為是預期的,並且是正確的。萬用字元在 CloudFront 配置中確實有效,只要它們構成備用主機名配置行中唯一的最左側元素。但這與 DNS 無關。

如果您希望其他客戶擁有的域名使用您的分配,則無法避免在 CloudFront 中配置它們。

但是,您可以通過 API 以程式方式修改它們,而不是手動:

http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/PutConfig.html

每個分配有 100 個此類別名的限制,但您可以通過向 AWS 支持送出表單來請求增加。但實際上,您同樣可以將它們分解為多個分佈,因為 CloudFront 不會在請求 esders 中使用一個主機將對象記憶體在給定路徑上,並將其作為記憶體響應返回給不同的主機,即使在同一個發行版中,如果您將主機標頭轉發到源伺服器(如果源伺服器能夠區分差異,您必須這樣做)。它不能,因為請求中的重要參數已從一個請求更改為另一個請求。

引用自:https://serverfault.com/questions/727733