使用 CDN 加速你的 GitHub Pages 網站


內容分發網絡 Content Delivery Network

前言

除去 WordPress, 許多博客網站是托管於 GitHub Pages 上的,但其在國內的速度實在是難以稱道。
所以使用國內服務商的 CDN 對其進行加速不失為一個好辦法。

內容分發網絡(Content Delivery Network,CDN)通過將站點內容發布至遍布全國的海量加速節點,使其用戶可就近獲取所需內容,避免網絡擁堵、地域、運營商等因素帶來的訪問延遲問題,有效提升下載速度、降低響應時間,提供流暢的用戶體驗。

曾經我使用的策略是在國內托管 Coding Pages,以及為了讓百度能抓取到博客內容,還做了一番配置。

讓百度收錄你的 GitHub Pages 博客

但是 Coding 的服務並不穩定,且經常變動一些策略。
現在更是下線整合到靜態部署中,且似乎因為 API 的問題實名認證總是不能通過,暫時都無法使用。

所以便干脆使用 CDN 來進行加速。並且也可以輕松被百度抓取了。

因為我域名購置於騰訊雲,且騰訊雲 CDN 每月贈送免費 10G 流量。
所以我直接采用騰訊雲的 CDN 來實現。

注意:域名需要備案(按需簽發 SSL 證書)

步驟

首先開通騰訊雲 - 內容分發網絡

添加自己的域名

添加自己的域名

設置源站

管理 > 基本配置

設置源站

這里是 GitHub Pages 提供的 IP 地址,可以添加多行。

About custom domains and GitHub Pages


可選:建議前往 高級配置 開啟 HTTPS 配置

回源協議

證書管理 > 編輯 > 協議跟隨 (如果沒開啟 HTTPS,默認的 HTTP 也可以

設置 CNAME

前往 域名解析

根據需要將 CDN 提供的 CNAME 線路類型設置為 境內
境外 則仍默認解析回 GitHub Pages。

配置緩存

默認的緩存時間非常長,不配置的話就會導致 CDN 的文件長時間沒有更新。

可以參見騰訊雲文檔 緩存配置問題

也可以在 刷新預熱 處手動刷新。

后話

測試發現首頁基本可以秒開,速度確實不錯。
至於流量萬一不夠用怎么辦,emm,大概等這里真有這么大訪問量的時候,就不至於還要在這樣各處薅羊毛了吧。

FAQ

CNAME 與 MX 記錄沖突導致郵件丟失

值得注意的是,設置 CDN 的方式是使用 CNAME 重定向到 CDN 域名。
如果你同時將裸域名(developingmonkey2022.org)作為博客域名和域名郵箱(比如我的郵箱:me@developingmonkey2022.org),那么你可能會遇到 CNAME 與 MX 記錄沖突問題。

如果你的運營商沒有這么提示你,那也最好不要這么做,因為這會導致域名郵箱發生郵件丟失。

在過去解析尚未規范時,部分運營商是允許同時在裸域名上設置 CNAME 和 MX 記錄的。
但如今按照 RFC 標准協議,CNAME 優先級最高,所以在解析請求過程中,會優先返回 CNAME 解析記錄結果。
這樣設置的結果就是導致無法解析到用戶設置的 MX 記錄(設置權重也沒有用),影響郵箱的正常收發。

現在,大部分運營商會提示 CNAME 與 MX 記錄發生沖突,來避免這種情況。

更多信息請參閱 RFC1034 和 RFC2181
記錄沖突的規則

我此前之所以使用 GitHub Pages 托管,卻仍然能夠使用域名郵箱,是因為我使用了 GitHub 提供的 A 記錄解析。

185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
 

Managing a custom domain for your GitHub Pages site

而如今加了 CDN 又回到了這一兩難的局面。

最后想着長痛不如短痛,下定決定將博客主域名更換為 www.developingmonkey2022.org

裸域名仍舊使用 A 記錄和 MX 記錄。
設置 A 記錄的作用是用戶訪問 developingmonkey2022.org 時(GitHub Pages 的 CNAME 文件提前設置為 www.developingmonkey2022.org),那么 GitHub Pages 會自動從 developingmonkey2022.org 跳轉為 www.developingmonkey2022.org

此外,谷歌瀏覽器會自動隱藏 www 域名前綴,所以一定程度上減少觀感的影響。

以及我發現一些企業的網站都采取的裸域名跳轉 www 域名的方式。

譬如:

  • 語雀:https://yuque.com,
  • JetBrains(著名的 IDE 軟件開發商):https://jetbrains.com(我在幾年前的視頻里發現他們留的還是裸域名的網址,而現在則是跳轉 www 鏈接。)

當然如果你對域名郵箱沒有需求,且域名非常短又很酷,使用裸域名也並非不可。


此外還有一種解決方案就是 CNAME Flattening

有些服務商(如 CloudflareCloudXNS)可以直接將 CNAME 解析為對應的 A 記錄(IP 地址),這時在裸域名上設置 CNAME 就相當於設置 A 記錄。

以往騰訊雲允許 CNAME 與 MX 並存,再然后提示沖突不允許,到了現在又可以同時設置了。但最好是一次性可以解析到 A 記錄的 CNAME。

我嘗試在 www 域名上加了 CNAME 開啟了 CDN,裸域名 CNAME 到 www,就會影響郵箱。
這時的路徑就相當於:@ -> www(CNAME) -> cdn(CNAME) -> A。可能無法使用 CNAME Flattening 。

而直接 CNAME 到 GitHub Pages 時,郵箱網址都可以正常工作。@ -> GitHub Pages(CNAME) -> A

PS. 怎么感覺自己最近說話都有點翻譯腔了。

CDN 刷新

有了 CDN,這也意味着你的頁面可能會因此延遲更新(對於用戶來說)。

因此,CDN 往往提供了刷新預熱功能。譬如指定 URL 或者目錄進行更新。

其實延遲的一會兒也不算是什么事,遇到着急的鏈接手動去控制台刷新即可。
但說實話,每次登陸到網站上操作着實有些浪費時間。
那么不如考慮一下命令行工具。

需要 Python & pip

Example:

# 注意這里的參數是 Array
# 刷新目錄
tccli cdn PurgePathCache --Paths '["https://www.developingmonkey2022.org/links/"]' --FlushType flush
# 刷新鏈接
tccli cdn PurgeUrlsCache --Urls '["https://www.developingmonkey2022.org/links/index.html"]'
 

PurgePathCache

PurgePathCache 用於批量提交目錄刷新,根據域名的加速區域進行對應區域的刷新。
默認情況下境內、境外加速區域每日目錄刷新額度為各 100 條,每次最多可提交 20 條。

–Paths
目錄列表,需要包含協議頭部 http:// 或 https://

–FlushType
刷新類型

  • flush:刷新產生更新的資源
  • delete:刷新全部資源

PurgeUrlsCache

PurgeUrlsCache 用於批量提交 URL 進行刷新,根據 URL 中域名的當前加速區域進行對應區域的刷新。
默認情況下境內、境外加速區域每日 URL 刷新額度各為 10000 條,每次最多可提交 1000 條。

–Urls
URL 列表,需要包含協議頭部 http:// 或 https://

后后話

2020-03-26

因為不知騰訊雲 CDN 為何掛了,轉為使用 Cloudflare 了,自動 Flattening。

后發現不是騰訊雲的問題,是 GitHub Pages 的 HTTPS 證書被劫持了。Github pages 的 HTTPS 是不是出問題了?

既然已經更改為 www 主域名,也還是繼續使用裸域名跳轉 www 的策略吧。

2020-04-17

開始使用又拍雲 CDN,申請了 又拍雲聯盟,拿到了代金券。

后來到了五月,發現百度索引竟然所剩無幾。原本還以為國內 CDN (此前的騰訊雲確實可以)會被收錄的。

測試發現百度 抓取診斷 抓取失敗時錯誤信息為 拒絕訪問

難不成時又拍雲的一些 CDN 點也禁止百度抓取了?

我不斷對抓取的 IP 進行報錯,百度抓取診斷就會換一個 IP 抓,於是乎排除掉一些拒絕訪問的 IP,有些 IP 倒是可以抓取成功了。

2020-05-24

但卻並非如此,索引量仍舊在下降,我提交了又拍雲工單,客服反饋是回源訪問時源站本身便是 403 拒絕訪問。(但我正常訪問均正常。)

所以我猜想的是又拍雲部分 CDN IP 有緩存時,所以回抓取成功,而其他 IP 無緩存時,則會回源,回源的過程中沒有過濾百度爬蟲的 User Agent,所以回源 GitHub Pages 仍舊會被拒絕。

此后我開啟了又拍雲的源站資源遷移,即可將源站靜態資源無縫遷移到又拍雲存儲,當客戶端下次訪問相同的資源時,無需回用戶自主源。

隨后過了幾天,索引量果然回升了……

2021-05-27

后續得到了又拍雲的贊助,寫了一篇又拍雲的軟文?,不過我之前也確實一直在用又拍雲,並列舉了優劣,也算是真心實意地推薦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM