CDN是什麼:CDN的意思、使用原因與WordPress連接方式

測試環境 RHEL 系列AlmaLinux 9.82026-10-16 確認

CDN(Content Delivery Network)是把原始伺服器的檔案存放在多個地區的邊緣伺服器上,並由離訪客最近的伺服器回應的內容傳遞網路。為了確認邊緣伺服器是否從快取回應,我們查看了jsDelivr這類公開函式庫發布服務的回應標頭,結果jQuery檔案是以快取副本回應。連接WordPress的檔案網址變更方式與DNS代理方式,則依官方文件比較。

1️⃣ CDN的意思:邊緣伺服器與原始伺服器

POP(Point of Presence)是指設有邊緣伺服器的資料中心,訪客的請求會送到最近的POP。

收到請求的邊緣伺服器若已存有檔案就會直接回應;若沒有,則向原始伺服器取得檔案後回應,並存放在邊緣伺服器上。AWS的CDN服務CloudFront在第一個位元組從原始伺服器抵達時,就開始傳送給訪客(依AWS官方文件)。

CDN邊緣伺服器與原始伺服器

邊緣伺服器只會存放訪客請求過的檔案,因此即使是同一個檔案,每台邊緣伺服器的第一次請求仍會傳到原始伺服器。

像這樣在請求進來時才取得檔案的方式稱為拉取(pull)方式,另外也有事先把檔案上傳到CDN的推送(push)方式。

2️⃣ 使用CDN的原因:距離與原始伺服器負載

訪客與伺服器的距離越遠,每個請求的往返時間(RTT)就越長。開啟一個頁面時,除了HTML之外還會同時產生圖片、CSS和JavaScript的請求,所以由附近的邊緣伺服器回應時,每個請求的往返時間都會縮短。

由邊緣伺服器回應的請求不會傳到原始伺服器,因此原始伺服器的CPU使用量與傳輸量(頻寬)也會減少。透過Cloudflare代理連接DNS時,原始伺服器的IP不會曝光,DDoS攻擊也會先在CDN被阻擋(依Cloudflare官方文件)。

訪客集中在與原始伺服器同一地區的網站,從距離得到的好處很小。這類網站使用CDN更大的好處,不是縮短回應時間,而是減輕原始伺服器負載與節省傳輸量。

3️⃣ 會被快取的檔案:靜態檔案與HTML

Cloudflare在預設設定下,只會快取依副檔名判定的圖片、CSS、JavaScript等靜態檔案(依Cloudflare官方文件)。頁面HTML和JSON不在預設快取範圍內,所以連接Cloudflare之後仍由原始伺服器回應。

若要連HTML一起快取,就必須在CDN另外建立快取規則。這時要把登入使用者或購物車這類內容因人而異的頁面排除在規則外,避免其他訪客的畫面混進來。

4️⃣ 連接WordPress:檔案網址變更與DNS代理

在WordPress連接CDN時,可以只把靜態檔案的網址改成CDN網址,或把網域的DNS設定到CDN代理,讓所有請求都經過CDN。

方式連接的位置經過CDN的請求原始伺服器IP
檔案網址變更在快取外掛的CDN設定中輸入CDN位址(CNAME)圖片、CSS、JavaScript等靜態檔案維持公開
DNS代理把網域的DNS記錄連接到CDN代理網站所有的HTTP與HTTPS請求隱藏在CDN後方

檔案網址變更方式是在 WP Rocket 這類快取外掛的CDN設定中,輸入CDN業者提供的位址(CNAME)。輸入後,頁面HTML中圖片、CSS和JavaScript的網址就會改成CDN網址(依WP Rocket官方文件)。HTML仍由原始伺服器直接回應。

WP Rocket設定畫面:Content Delivery分頁的Other CDN、Your CDN開關與CDN CNAME(s)列
在[設定 › WP Rocket]的[Content Delivery]分頁開啟[Other CDN],就會看到輸入CDN位址的[CDN CNAME(s)]列。輸入CDN位址並開啟上方的[Your CDN]開關後,檔案網址就會改成CDN位址;位址有多個時,用[+ Add CNAME]新增列。

使用DNS代理方式時,網域的DNS會交由CDN業者管理。Cloudflare也提供不搬移名稱伺服器、只在現有DNS業者新增CNAME記錄來連接代理的方式。這個方式只能在Business以上的方案使用(依Cloudflare官方文件)。

5️⃣ 確認快取命中:cf-cache-status與age標頭

CDN是否從快取回應檔案,可以從回應標頭確認。下面是我們查看jsDelivr發布的jQuery檔案回應標頭所用的指令與結果。

curl -sI https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js | grep -iE "^(cache-control|cf-cache-status|age|server):"
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
age: 45920
cf-cache-status: HIT
server: cloudflare

[server: cloudflare]表示這個回應是由Cloudflare邊緣伺服器送出,Cloudflare加上的[cf-cache-status: HIT]則代表從快取回應。[age: 45920]表示這個檔案存入快取後約經過12小時45分。[max-age=31536000]是原始伺服器允許存放1年的指示。

值不是[HIT]而是[MISS]、[DYNAMIC]、[BYPASS]時,請求會走到哪裡,可以在下方圖表按值的按鈕確認。

🧩 cf-cache-status 各個值的請求去向
說明圖解
📨 cf-cache-status
🧑‍💻 訪客
收到的回應標頭cf-cache-status: HITcf-cache-status: MISScf-cache-status: DYNAMICcf-cache-status: BYPASS
直接從快取回應以取得的檔案回應轉送原始回應轉送原始回應→
🌐 附近的邊緣伺服器(POP)
💾 快取有存放的檔案沒有存放的檔案,存放取得的檔案不在快取範圍(HTML),不確認屬於快取範圍但不存放
離訪客近的伺服器
不會傳到原始伺服器取得檔案不確認快取直接轉送取得檔案→
🖥️ 原始伺服器
沒有請求回應檔案HTML 回應回應標頭 Cache-Control: no-store 或 private
[cf-cache-status: HIT]代表邊緣伺服器直接從快取回應,這個請求不會傳到原始伺服器。
快取中沒有、從原始伺服器取得的檔案會顯示為[MISS],邊緣伺服器會在回應時存放該檔案。
不在快取範圍內、因此不確認快取就轉送到原始伺服器的HTML,會顯示為[DYNAMIC]。
原始伺服器的回應中若有[Cache-Control: no-store]或[private]指示,即使是快取範圍內的檔案也會顯示為[BYPASS],且不會存放。

🔢 FAQ & 推薦內容

網站主機是存放網站原始檔案與資料庫的伺服器,CDN則是位在它前方、以檔案副本回應的網路。即使連接了CDN,仍然需要原始伺服器。

Varnish在原始伺服器前方的一個地方存放回應,CDN則在世界各地的邊緣伺服器做同樣的事。jQuery官方CDN(code.jquery.com)的回應標頭中有[via: 1.1 varnish, 1.1 varnish]。從這個標頭可以確認code.jquery.com的邊緣伺服器是經過Varnish回應的。

用CDN管理畫面的清除快取(Purge)功能,刪除特定網址或全部快取。有些WordPress快取外掛也提供在修改文章時,一併清除已連接CDN快取的功能。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。