CDN工程師必看-認知Cloudfront配置參數

近幾年互聯網應用風聲水起,例如:電商,視頻,遊戲等,愈來愈成爲生活習慣。如何在這場白日化的競爭中,爭取到一席之地,除了專業,還有就是訪問體驗,而訪問體驗可經過CDN來提高。做爲全球第二大CDN廠商的AWS,在海外仍是擁有很強的基礎設施覆蓋(截止到2020年2月28日有205 個邊緣站點和 11 個區域性邊緣緩存,這些節點遍及 42 個國家/地區的 84 個城市)。
爲讓剛接觸CDN的工程師對CDN有個瞭解,咱們簡單介紹一下CDN重要的節點:客戶端(瀏覽器/App等)/CDN邊緣站點/源站(服務器或S3),引用AWS官方博客的例子。
當客戶端發起對 www.customer.com 的訪問時,首先須要 DNS系統解析出該域名對應的主機IP,經過本地 ISP DNS遞歸查詢到customer.com 的 DNS 域名服務器並瞭解到該域名是指向了xxx.cloudfront.net,進一步解析 xxx.cloudfront.net,CloudFront的DNS 域名服務器會根據請求來源的 IP 等信息,返回適合當前該客戶端訪問的邊緣節點的主機 IP 如1.1.1.1,最終該客戶端向1.1.1.1發出請求。若是該邊緣節點已經緩存了該客戶端請求的內容(圖片、視頻等靜態文件),則直接返回給客戶端,若是未緩存,則首先回源站取回該內容,並存儲在邊緣節點,以便下次客戶端對該內容請求時能夠直接返回該內容。
配置描述▼
要獲得更好訪問體驗,須要源站與Cloudfront邊緣站點進行相關參數配置:
簡單一下介紹Cloudfront配置裏面的相關術語,以便在進行相關配置指導時,能讓工程師們更好在Cloudfront配置中找對應點:
源站(Origin): 是須要被加速的站點,能夠是 S3 存儲桶,能夠是 ELB/EC2,能夠是 Elemental MediaStore/MediaPackage,或者是用戶自定義的站點(如第三方 IDC 中的 HTTP Web 服務器)。舉個例子,在Nginx配置不被緩存:(相關參數:https://shuwoom.com/?p=4311
分配(Distribution):分配是 CloudFront 的基本單元,每一個分配有獨一的ID以及CloudFront 爲其分配的域名(相似 abcdefg13456789.cloudfront.net)。目前有 Web和RTMP兩種方式的分配,Web分配主要用於分發靜態、動態內容,基於HTTP/s 協議的媒體文件分發,基於HLS(拉流)協議的互聯網直播等。RTMP(推流)分配主要用於基於RTMP協議的視頻點播場景,源站必須爲S3存儲桶,一個分配能夠配置多個源站。
行爲(Behaviors):CloudFront 經過路徑匹配的方式決定執行哪個緩存行爲,一個分配中能夠有多個Behaviors,而且每一個Behaviors 對應一個源站。在Behaviors 中能夠設置緩存 TTL 時間,容許的 HTTP 行爲(GET,PUT,POST 等),與 Lambda 關聯等。
基於S3靜態託管Web服務css

  1. 建立一個分配(包含一個源站)
  2. 配置緩存行爲
  3. S3桶的建立在此不介紹
  4. 打開Console,建立一個分配,有兩種選擇,這次選擇Web Distributio
    源設置參數部分解釋以下:
    參數名稱

參數解釋html

源路徑(可選)web

若是您但願 CloudFront 從 AWS 資源或自定義源的目錄中請求內容,請輸入目錄路徑並以斜槓 (/) 開頭且不要以(/)結尾。假設已爲分配指定如下值:瀏覽器

源域名 – 名爲 myawsbucket 的 Amazon S3 存儲桶 源路徑 – /production備用域名 (CNAME) – example.com緩存

當用戶在瀏覽器中輸入 example.com/index.html 時CloudFront 向 Amazon S3 發送請求以獲取 myawsbucket/production/index.html。服務器

源IDjsp

爲源輸入描述。此值容許您區分同一分配中的多個源。每一個源的描述在分配中必須是惟一的。ide

限制存儲桶訪問函數

若是您但願用戶僅使用 CloudFront URL 而非 Amazon S3 URL 訪問 Amazon S3 存儲桶中的對象,請選擇是。而後,指定其餘值。性能

源訪問身份

僅適用於Amazon S3存儲桶來源(配置爲網站終端節點的狀況除外)

授予對存儲桶的讀取權限

CloudFront讀取Amazon S3 存儲桶中對象的權限

源自定義標頭(可選)

您在此處指定的全部自定義標頭鍵和值將包含在Cloudfront轉發到此源的每一個請求中。若是客戶端請求中提供了標頭,則會覆蓋它

注意提醒:
1) 在配置 CloudFront 分配時,若是使用是Amazon S3 靜態網站託管,請在源域名輸入終端節點。該值顯示在 Amazon S3 控制檯的屬性頁面上的靜態網站託管下面。例如:https://bucket-name.s3-website.region.amazonaws.com
2) 如爲靜態網站託管,能夠不採用「限制存儲桶訪問」
3) 若是設置授予對存儲桶的讀取權限爲「否,我將更新權限」,必定要手動去更權限,否則訪問出錯了
參考網址:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html

  1. 緩存行爲設置
    部分配置參數解釋:
    參數名稱

參數解釋

路徑模式

默認

查看器協議策略

Client到達CloudFront 時用的協議,支持HTTP 和HTTPS,而且提供重定向 HTTP 到 HTTPS

容許的 HTTP 方法

容許的 HTTP 動做,不一樣的 Behavior 能夠配置不一樣的選項

字段級加密配置

在將 POST 請求轉發到您的源站以前,CloudFront 的字段級加密使用特定於字段的加密密鑰 (由用戶提供) 對 HTTPS 表單中的敏感數據進行進一步加密

基於選擇的請求標頭進行緩存

重點關於Client端對Cloudfront訪問時帶header請求處理

無(改進緩存):Cloudfront不會根據請求header進行緩存。一般Client端請求到Cloudfront的header都會被移除,再轉發給源站。

白名單:若是須要Cloudfront根據header內容區分緩存或源站須要按header內容分別處理,這時須要設置白名單。這樣Cloudfront纔會轉發Client端的header內容到源站。

所有(不建議S3爲源站的設置):這個設置會致使Cloudfront不作任何緩存(動態設置),會把Client端請求來的header所有轉發給源站。並TTL也自動所有設置爲「0」。

對象緩存

對象緩存

使用源緩存標頭:根據您在源站設置的Cache-Control來決定在Cloudfront緩存時長,例如:Cache-Control: public; max-age=3600表示緩存1個小時。

自定義:在Cloudfront緩存時長,由Cloudfront設置TTL與源站設定Cache-Control決定,

一般狀況以下:

當您自定義對象緩存時,能夠配置默認TTL、最小TTL 和最大TTL。CloudFront 根據源站是否返回緩存標頭來使用這些參數:若是源站不返回緩存標頭,則分配使用默認TTL。若是源站返回的緩存標頭小於最小TTL,則分配使用最小TTL。若是源站返回的緩存標頭大於最大TTL,則分配使用最大TTL。

轉發 Cookies

是否將Cookie轉發回源站,一樣 CloudFront 會基於此值緩存不一樣的內容。(能夠白名單定義須要轉發Cookies,不合適配置在S3做爲源站)

查詢字符串轉發和緩存

是否將查詢字符串轉發回源站,一樣 CloudFront 會基於此值緩存不一樣的內容。

限制查看器訪問
(使用簽名的 URL 或
簽名的 Cookies)

瀏覽器否使用簽名的URL或簽名的 Cookie

自動壓縮對象

是否啓用自動壓縮。若是在查看器請求標頭包含 Accept-Encoding :gzip,則 能夠開啓CloudFront 自動壓縮,以減少流量傳輸。

Lambda 函數關聯

指定要爲其添加觸發器的 Lambda 函數的 Amazon 資源名稱 (ARN)。

注意提醒:
1) 須要關注「基於選擇的請求標頭進行緩存和對象緩存」配置,這會影響緩存內容和緩存時長,如何提升緩存命中率,固然也跟Cookies和Query String有關,能夠參考:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html
2) 自定義緩存對象時,須要關注的點,能夠參考:https://aws.amazon.com/cn/premiumsupport/knowledge-center/cloudfront-custom-object-caching/
3) S3存儲桶做爲源端,標頭添加的設置:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationAddingHeadersInS3

  1. 分配設置
    分配設置部分參數解釋:
    參數名稱

參數解釋

價格級別

分爲三個區域,價格各不相同。分美國,加拿大和歐洲;國,加拿大,歐洲,亞洲,中東和非洲;全部邊緣站點(最佳性能)

AWS WAF Web ACL

能夠已經建立的WAF進行關聯,也能夠在將來建立關聯

備用域名
(CNAMEs)

(正常是必選項),就是填寫您們公司與cloudfront.net CNAME的域名,例如:www.bosicloud.com

SSL 證書

這次若是使用的是本身域名,請選擇此選項。您可使用存儲在美國東部(弗吉尼亞北部)區域的 AWS Certificate Manager (ACM)
中的證書,也可使用存儲在 IAM 中的證書。

支持邊緣站點專用IP 和 SNI 兩種模式

日誌記錄

建議開啓日誌,方便將來作日誌分析與故障排查

日誌存儲桶/前綴

日誌存儲位置和Cloudfront爲該分配的訪問日誌文件名前面添加字符串

注意提醒:
1) CloudFront規定當使用自定義域名並配置該域名使用CNAME或Alias的方式指向CloudFront distribution的域名的時候,須要在CloudFront相應的「分配設置的備用域名」中提供該自定義的域名。不然訪問會出錯或域名沒辦法加速。
2) 配置和使用訪問日誌:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html
場景優化配置▼
本節將介紹一些經常使用場景TTL配置,動態加速,設置樣例以及錯誤處理。

  1. TTL設置
    CloudFront 在計算 Cache key 時會將請求的 URL 以及當前分配對應的Behavior 的配置(如是否轉發 Header、Cookie、查詢字符串)考慮在內,計算出惟一值。所以即便兩次請求都是相同的URL,若是兩次請求的個別Header 不同,且該Header配置爲了轉發(Cached based on Selected Headers),則計算出的Cache key也不一樣,返回給客戶端的內容天然也不一樣。所以配置轉發的查詢字符串、Cookie 及 Header 越少,Cache key 也將越少,緩存命中率就越高,帶來了性能也越好。若是同一個源端有不一樣動態或靜態須要加速,最好配置多個行爲(Behaviors),來達緩存效果。
    對於用戶內容在PoP點的緩存TTL,能夠由源站的 Cache Control: max-age參數值,或者在 Behavior的Customized的Minimum TTL、Maximum TTL、Default TTL的參數值決定。(https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
    分類

長期靜態內容

短時間靜態內容

動態內容

舉例

.css, .js, .jpg, .png

軟件下載,媒體文件,媒體分片文件(HLS .ts,.m3u8)。

登陸頁,index.jsp,新聞,天氣信息,HLS 直播 m3u8 文件。

變化的內容,不可緩存的內容。

建議

不變的內容能夠設置較大的 TTL 值,例如:使用版本號更新內容。

按期更新的內容設置低 TTL 值。TTL 到期後,CloudFront 回源校驗源站內容是否發生變化。

常常變化的內容;按請求不一樣內容不一樣;設置很低甚至0 TTL。

動態內容場景:有如下兩方式:

  1. 使用源緩存標頭(基於源端的設置)
    1) Cache-Control: no-cache; max-age=0; No-store; private
    2) Cache-Control: public; max-age=0
  2. 基於選擇的請求標頭進行緩存(基於Cloudfront)
    1) 直接在‘Cache based on Selected Header’處選‘All’此時自定義:Minimum TTL,Maximum TTL,Default TTL自動設置爲0
    源端設置例子:
    靜態資源

登陸頁

媒體分片

動態內容

HLS 直播

.css, .js, 軟件下載,更新包等

Index.html

/*.ts

/*.m3u8

Cache-Control:
public;
max-age=31536000

Cache-Control:
no-cache=Set-Cookie;
max-age=30

Cache-Control:
public;
max-age=31536000

Cache-Control:
no-cache;
max-age=0;No-store;private

Cache-Control:
public;
max-age=2

  1. 錯誤處理
    當源站不可用時,能夠在 CloudFront 配置針對400,403,404,405,414,500,501,502,503,504等錯誤碼的自定義響應頁並修改返回給客戶端的響應碼。CloudFront 將週期性驗證源站的可用性,並可在源站恢復前將當前緩存中的內容做爲響應返回給客戶端。

設置方式可見https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/GeneratingCustomErrorResponses.html
參考資料:

[1]開發人員指南:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Introduction.html

[2] Amazon CloudFront 常見錯誤配置及解決方法: https://amazonaws-china.com/cn/blogs/china/cloudfront-errors-solutions/

[3] 如何減小收到「X-Cache:Miss from cloudfront」響應的請求的延遲https://aws.amazon.com/cn/premiumsupport/knowledge-center/cloudfront-latency-xcache/

[4] 我在 CloudFront 分配上設置了自定義對象緩存。爲何個人分配使用個人源的緩存設置?https://aws.amazon.com/cn/premiumsupport/knowledge-center/cloudfront-custom-object-caching/

[5] 如何阻止 CloudFront 緩存某些文件?https://aws.amazon.com/cn/premiumsupport/knowledge-center/prevent-cloudfront-from-caching-files/

相關文章
相關標籤/搜索