對(duì)服務(wù)可控性及可用性有較高要求的開(kāi)發(fā)者可以視項(xiàng)目的具體情況接入第三方 CDN 服務(wù)。 這篇指南簡(jiǎn)要介紹了配置 CDN 的具體步驟。
接入第三方 CDN 的使用場(chǎng)景
下面我們列舉了一些常見(jiàn)的接入第三方 CDN 的使用場(chǎng)景,供大家參考:
- 加速靜態(tài)資源訪問(wèn)+通常 CDN 對(duì)靜態(tài)資源的加速效果比較顯著。如果你想要為部署在云引擎上的純靜態(tài)站點(diǎn)接入第三方 CDN,那么也可以考慮直接使用云引擎內(nèi)置的加速節(jié)點(diǎn)功能,配置更加方便。+
- 加速動(dòng)態(tài)請(qǐng)求訪問(wèn)+由于每個(gè)動(dòng)態(tài)請(qǐng)求都需要回源(CDN 轉(zhuǎn)發(fā)客戶端請(qǐng)求至源站,收到源站響應(yīng)再發(fā)給客戶端),因此 CDN 對(duì)動(dòng)態(tài)請(qǐng)求的加速效果一般沒(méi)有那么明顯。當(dāng)然,全國(guó)各地、各運(yùn)營(yíng)商的線路千差萬(wàn)別,接入第三方 CDN 后在個(gè)別線路上可能會(huì)有顯著的加速效果,這也取決于具體的第三方 CDN 對(duì)不同線路的優(yōu)化情況。需要注意的是,許多 CDN 供應(yīng)商提供的產(chǎn)品會(huì)有靜態(tài) CDN 和動(dòng)態(tài) CDN 的區(qū)分,這種情況下請(qǐng)選擇為動(dòng)態(tài)請(qǐng)求優(yōu)化的產(chǎn)品。+
- 加速境外訪問(wèn)+我們推薦主要面向境外用戶的應(yīng)用使用 LeanCloud 國(guó)際版,國(guó)際版的機(jī)房在海外,境外用戶訪問(wèn)較快。同時(shí)面向境內(nèi)外用戶的應(yīng)用,可以考慮在華北節(jié)點(diǎn)或華東節(jié)點(diǎn)創(chuàng)建應(yīng)用,然后接入第三方 CDN 緩解境外用戶訪問(wèn)緩慢的問(wèn)題。當(dāng)然,這需要開(kāi)發(fā)者挑選一家境內(nèi)外節(jié)點(diǎn)豐富、回源 LeanCloud 華北或華東節(jié)點(diǎn)速度較快、支持動(dòng)態(tài)請(qǐng)求的第三方 CDN 服務(wù)商。同時(shí)面向境內(nèi)外用戶,且希望境外用戶能有更優(yōu)訪問(wèn)速度的商用版用戶,可以提工單聯(lián)系我們開(kāi)通專線。一般來(lái)說(shuō),相比通過(guò)公網(wǎng)回源 LeanCloud 華北或華東節(jié)點(diǎn)的第三方 CDN,專線能更好地優(yōu)化境外用戶訪問(wèn)速度。不過(guò),在訪問(wèn)量較小的情況下,專線的成本比較高。+
- 緩解 DDoS 攻擊+除了部署在云引擎上的純靜態(tài)站點(diǎn)以外,我們推薦每個(gè)應(yīng)用使用獨(dú)立 IP。每一個(gè)獨(dú)立 IP 默認(rèn)提供了 2 Gbps 的防護(hù)帶寬,可以防護(hù)小規(guī)模的攻擊。在遇到更大規(guī)模攻擊的情況下,我們也可以協(xié)助你接入第三方清洗服務(wù)。取決于攻擊的類型,接入 CDN 也可以對(duì) DDoS 攻擊起到不同程度的緩解作用。許多 CDN 供應(yīng)商還提供專門的防 DDoS 附加功能(通常成本較高),可以應(yīng)對(duì)大規(guī)模的 DDoS 攻擊。
準(zhǔn)備工作
在選定符合需要的第三方 CDN 供應(yīng)商后,請(qǐng)準(zhǔn)備一個(gè)已備案的域名,并規(guī)劃好供客戶端訪問(wèn)的子域名和作為回源 Host 的域名:
- 供客戶端訪問(wèn)的子域名,比如
foo.example.com
,這個(gè)域名將作為最終提供服務(wù)的域名。多個(gè)云引擎分組需要分別準(zhǔn)備各自的子域名,多個(gè)應(yīng)用的 API 可以共用一個(gè)子域名。以下簡(jiǎn)稱 CDN 域名。 - 在 LeanCloud 控制臺(tái)綁定的子域名,比如
bar.example.com
。這個(gè)域名將作為回源 Host。多個(gè)云引擎分組、多個(gè)應(yīng)用的 API 都需要分別準(zhǔn)備各自的子域名作為回源 Host。如果是出于緩解 DDoS 攻擊的目的接入 CDN,可以考慮使用復(fù)雜的長(zhǎng)隨機(jī)字符串(some-long-random-string.example.com
),最大限度降低因回源 Host 泄露進(jìn)而導(dǎo)致回源 IP 泄露的風(fēng)險(xiǎn)。存在較小的可能性,在回源 Host 解析記錄存在期間,惡意攻擊者基于常用詞字典窮舉出子域名,并通過(guò) DNS 查詢獲取回源 IP。以下簡(jiǎn)稱回源域名。
API 與云引擎的 CDN 不能混用,需要分別配置,下面提到的所有概念如果沒(méi)有特殊說(shuō)明,都不再區(qū)分 API 與云引擎服務(wù)。
向 LeanCloud 申請(qǐng)回源 IP
LeanCloud 華北節(jié)點(diǎn)需要進(jìn)行的設(shè)置如下:
- 申請(qǐng)獨(dú)立 IP 作為回源 IP
- 綁定回源域名
同一賬號(hào)下的多個(gè)應(yīng)用的 API 或者多個(gè)云引擎分組可以共用一個(gè) IP,但 API 與云引擎之間不能共用。 獨(dú)立 IP 可以直接在控制臺(tái)(賬號(hào)設(shè)置 > 獨(dú)立 IP)申請(qǐng),如果當(dāng)前賬號(hào)已經(jīng)申請(qǐng)了獨(dú)立 IP,那么可以直接使用已有的獨(dú)立 IP。 但如果是出于緩解 DDoS 攻擊的目的接入第三方 CDN,那么建議專門申請(qǐng) IP 以確保回源 IP 的私密性,并特別注意不要泄露回源 IP。
在 LeanCloud 控制臺(tái)綁定作為回源域名(上一節(jié)例子中的 bar.example.com
或 some-long-random-string.example.com
),其中,DNS 解析指向獨(dú)立 IP(回源 IP),SSL 選擇自動(dòng)管理模式(如果你有自己的證書,也可以選擇手動(dòng)模式,上傳證書)。等待綁定成功后前往第三方 CDN 供應(yīng)商處配置。
華東節(jié)點(diǎn)的流程與華北節(jié)點(diǎn)基本一致,只是目前還不支持在控制臺(tái)自動(dòng)申請(qǐng) IP,請(qǐng)通過(guò)工單系統(tǒng)提出申請(qǐng)。
配置 CDN
接下來(lái)請(qǐng)?jiān)?CDN 服務(wù)商處增加一個(gè) CDN。每個(gè)服務(wù)商提供的配置界面與文案會(huì)略有不同,如果對(duì)具體的配置項(xiàng)有疑問(wèn),可以聯(lián)系服務(wù)商的技術(shù)支持。需要對(duì)該 CDN 進(jìn)行如下配置:
- 域名與證書:準(zhǔn)備的最終提供服務(wù)的子域名(準(zhǔn)備工作一節(jié)例子中的
foo.example.com
)與證書(許多 CDN 供應(yīng)商都可以自動(dòng)申請(qǐng)證書),并按照提示配置對(duì)應(yīng)的 DNS 解析記錄。 - 回源 IP
- 回源 Host(回源域名)
- 回源協(xié)議(如有,選擇 https)
在配置完成之后,可以通過(guò)下面的請(qǐng)求驗(yàn)證配置的正確性:
dig foo.example.com
(應(yīng)該返回指向 CDN 的解析記錄,如果之前使用過(guò)這個(gè)域名,可能需要等待 DNS 解析記錄生效)- 如果是 API 服務(wù):
https://foo.example.com/1.1/date
(應(yīng)該每次都返回當(dāng)前的時(shí)間) - 如果是云引擎服務(wù):
https://foo.example.com/__engine/1/ping
或https://foo.example.com/
(參見(jiàn)關(guān)于云引擎健康監(jiān)測(cè)的說(shuō)明)
如果是出于緩解 DDoS 攻擊的目的接入 CDN,在確認(rèn) CDN 工作正常后,可以移除回源域名的 DNS 解析記錄,降低回源 IP 的泄露風(fēng)險(xiǎn)(但不要在 LeanCloud 控制臺(tái)解綁回源域名,否則回源 Host 無(wú)法工作)。
常見(jiàn)問(wèn)題
我已經(jīng)在使用 LeanCloud 綁定的自有域名,可以不換域名切換到基于 CDN 的方案嗎
可以。你可以用現(xiàn)在已經(jīng)綁定的二級(jí)域名作為 CDN 的域名,所有配置的方法都與上述一致。完成配置后將該域名 DNS CNAME 記錄從指向 LeanCloud 切換到指向 CDN,即可完成切換。需要特別注意 CDN 提供商有可能會(huì)需要驗(yàn)證 DNS CNAME 記錄后才能完成配置,那樣可能無(wú)法避免切換時(shí)的服務(wù)中斷,請(qǐng)向 CDN 服務(wù)商咨詢解決方案。另外要注意的是,在切換了 DNS 記錄后,LeanCloud 上綁定的域名的證書將無(wú)法自動(dòng)續(xù)期。
CDN 緩存了動(dòng)態(tài)的資源
請(qǐng)檢查 CDN 的緩存控制相關(guān)的配置,建議設(shè)置為「遵循相關(guān) header」,對(duì)于 API 服務(wù)可以直接設(shè)置為「均不緩存」。有部分服務(wù)商還會(huì)提供「忽略 URL 中的參數(shù)」的功能,請(qǐng)確保該功能是關(guān)閉的。
跨域訪問(wèn)出現(xiàn)異常
如果你的應(yīng)用是 WebApp,在訪問(wèn) CDN 域名的 API 服務(wù)的時(shí)候出現(xiàn)了 CORS 相關(guān)的異常,請(qǐng)先通過(guò)下面的命令檢查返回的 Header 中是否有正確的 CORS 相關(guān)的 header(access-control-allow-origin
,access-control-allow-methods
與 access-control-allow-headers
):
curl 'https://example.yourdomain.com/1.1/ping' \
-X OPTIONS -H 'Access-Control-Request-Method: GET' \
-H 'Access-Control-Request-Headers: content-type,x-lc-id,x-lc-prod,x-lc-session,x-lc-sign,x-lc-ua' \
-H 'Origin: http://localhost' -i
如果沒(méi)有正確的響應(yīng)或者 header 不正確,請(qǐng)檢查 CDN 的跨域訪問(wèn)配置,以下是參考配置:
access-control-allow-origin: *
access-control-allow-methods: GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH
access-control-max-age: 86400
access-control-allow-headers: Content-Type, Origin, X-LC-Id, X-LC-Key, X-LC-Sign, X-LC-Session, X-LC-Prod, X-LC-UA, X-LC-IM-Session-Token
獲取客戶端 IP
配置了 CDN 后,因?yàn)樗姓?qǐng)求會(huì)經(jīng)過(guò) CDN 中轉(zhuǎn),API 的請(qǐng)求日志、云函數(shù)中的 req.meta.remoteAddress
和云引擎中的 req.headers['x-real-ip']
獲取到的將是 CDN 節(jié)點(diǎn)的 IP 而不是客戶端的實(shí)際 IP。
如果你的業(yè)務(wù)需要客戶端 IP 的話,可以參照 CDN 供應(yīng)商的文檔來(lái)從 Header 中(一般是 X-Forwarded-For
)獲取實(shí)際 IP。注意因?yàn)?LeanCloud 的負(fù)載均衡總是會(huì)覆蓋 X-Real-IP
這個(gè)頭,所以如果 CDN 供應(yīng)商只在 X-Real-IP
上發(fā)送實(shí)際 IP 的話,目前確實(shí)沒(méi)有辦法獲得到這個(gè) IP。
CDN 域名和回源域名可以是同一個(gè)嗎
我們不推薦這樣配置。 由于 CDN 供應(yīng)商和 LeanCloud 的 IaaS 供應(yīng)商可能存在交叉,這樣配置有可能因?yàn)橛蛎涗洓_突導(dǎo)致域名綁定失敗。 另外,如果是出于緩解 DDoS 攻擊的目的接入 CDN,這樣配置的情況下,回源域名是公開(kāi)的,在綁定域名、確認(rèn) CDN 正常工作的窗口期,攻擊者可以通過(guò) DNS 查詢獲取回源 IP。 攻擊者獲知回源 IP 后,隨時(shí)可以繞過(guò) CDN 直接攻擊源站。