近幾年互聯網應用風聲水起,例如:電商,視頻,遊戲等,愈來愈成爲生活習慣。如何在這場白日化的競爭中,爭取到一席之地,除了專業,還有就是訪問體驗,而訪問體驗可經過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
參數解釋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
參數解釋
路徑模式
默認
查看器協議策略
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
參數解釋
價格級別
分爲三個區域,價格各不相同。分美國,加拿大和歐洲;國,加拿大,歐洲,亞洲,中東和非洲;全部邊緣站點(最佳性能)
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配置,動態加速,設置樣例以及錯誤處理。
長期靜態內容
短時間靜態內容
動態內容
舉例
.css, .js, .jpg, .png
軟件下載,媒體文件,媒體分片文件(HLS .ts,.m3u8)。
登陸頁,index.jsp,新聞,天氣信息,HLS 直播 m3u8 文件。
變化的內容,不可緩存的內容。
建議
不變的內容能夠設置較大的 TTL 值,例如:使用版本號更新內容。
按期更新的內容設置低 TTL 值。TTL 到期後,CloudFront 回源校驗源站內容是否發生變化。
常常變化的內容;按請求不一樣內容不一樣;設置很低甚至0 TTL。
動態內容場景:有如下兩方式:
登陸頁
媒體分片
動態內容
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
設置方式可見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/