如何減少DNS查詢數量及提升查詢速度

如何減少DNS查詢數量及提升查詢速度

您可以對WordPress進行許多不同的優化,其中一些比其他優化更重要。一個經常被忽視的因素是與DNS相關的查詢時間,以及它對您網站的影響有多大。就像TTFB網路延遲一樣,在計算總頁面載入時間時,這是一個重要的難題。

所以今天我們將深入探討一些關於如何減少DNS查詢並加快它們的速度、為什麼應該這樣做以及它如何在WordPress網站的效能中發揮作用的建議。

什麼是DNS Lookup?

要向您展示什麼是DNS Lookup,您首先需要了解DNS的工作原理。DNS(域名系統)本質上是網際網路的支柱。解釋DNS如何工作的一個常見參考是將其視為全球資訊網的電話簿。您訪問的每個網站和域都對映到一個IP地址。

當您在位址列中鍵入Google.com時,您的ISP會執行DNS查詢以請求與域關聯的名稱伺服器。然後由伺服器在後臺完成到IP地址的對映,然後您就可以使用域名來訪問它。如果沒有DNS,您將必須輸入類似216.58.217.206的內容才能訪問Google。那不是很好玩嗎!

DNS的工作原理

DNS的工作原理

當您瀏覽網站時,必須在下載任何內容之前為請求的每個域進行DNS查詢。但是,不必對每個資源都執行DNS查詢。例如,假設我們有以下HTTP請求:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
https://wpdev.ink/
https://js.stripe.com/v3/
https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/images/header.jpg
https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/skip-link-focus-fix.js
https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/global.js
https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/jquery.scrollTo.js
https://cdn.wpdev.ink/fonts/open-sans-v13-latin-regular.woff2
https://cdn.wpdev.ink/fonts/open-sans-v13-latin-700.woff2
https://wpdev.ink/ https://js.stripe.com/v3/ https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/images/header.jpg https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/skip-link-focus-fix.js https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/global.js https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/jquery.scrollTo.js https://cdn.wpdev.ink/fonts/open-sans-v13-latin-regular.woff2 https://cdn.wpdev.ink/fonts/open-sans-v13-latin-700.woff2
https://wpdev.ink/
https://js.stripe.com/v3/
https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/images/header.jpg
https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/skip-link-focus-fix.js
https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/global.js
https://cdn.wpdev.ink/wp-content/themes/twentyseventeen/assets/js/jquery.scrollTo.js
https://cdn.wpdev.ink/fonts/open-sans-v13-latin-regular.woff2
https://cdn.wpdev.ink/fonts/open-sans-v13-latin-700.woff2

儘管上面總共有八個HTTP請求,但總共只有三個唯一域。這意味著有三個DNS查詢。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
https://wpdev.ink
https://js.stripe.com
https://cdn.wpdev.ink
https://wpdev.ink https://js.stripe.com https://cdn.wpdev.ink
https://wpdev.ink
https://js.stripe.com
https://cdn.wpdev.ink

Pingdom中的DNS查詢

以下是上述請求在Pingdom網站速度測試工具中的顯示方式。DNS表示為粉紅色條,以毫秒為單位。當您第一次通過Pingdom執行您的網站時,它會執行新的查詢,並且必須查詢每個域的DNS記錄以獲取IP資訊。請注意,它不必在cdn.wpdev.ink域上多次查詢DNS。這就是DNS的工作原理。它只需要查詢一個域一次。所以下面總共有8個請求,但只有3個DNS查詢。

此DNS查詢會導致額外的載入時間,因為在DNS查詢完成之前無法載入任何內容。請注意,在一個CDN URL上的DNS查詢耗時超過300毫秒。這不包括在wpdev.ink或js.stripe.com上的查詢。所以你可以看到這會如何隨著時間的推移而累加。

Pingdom中的DNS查詢

Pingdom中的DNS查詢

當您通過Pingdom多次執行您的網站時,它會快取DNS,因為它已經知道IP資訊並且不必再次執行查詢。這就是為什麼您的網站在通過Pingdom多次執行後顯示速度更快的原因之一。正如您在下面的螢幕中看到的,在第二個測試中,CDN URL上的DNS查詢時間為0毫秒。這是很多人誤解的一個領域。但別擔心,我們將在下面深入研究DNS快取。

Pingdom中的DNS快取

Pingdom中的DNS快取

GTmetrix中的DNS查詢

每個網站速度測試工具的工作方式略有不同,但幾乎所有工具都會為您計算DNS查詢時間。以下是相同請求在GTmetrix中的顯示方式。DNS用綠色條表示,以毫秒為單位。

GTmetrix中的DNS查詢

GTmetrix中的DNS查詢

WebPagetest中的DNS查詢

這是一個使用WebPageTest的示例。他們實際上對您的請求詳細資訊有一個快速概覽,您可以在其中單擊“DNS查詢”列並按最高響應時間對其進行排序。我們以通過該工具執行usatoday.com為例,僅DNS查詢時間就花了6.5秒!

由於所有的外部請求,許多這些新聞網站沒有被高度優化是很常見的。但是正如您所看到的,他們站點上的DNS查詢時間可能比大多數人的整個站點花費的時間更長。這就是DNS很重要的原因。

較長的DNS查詢時間(網頁測試)

較長的DNS查詢時間(網頁測試)

如何減少和加速DNS查詢

既然您對DNS的工作原理有了更多的瞭解,我們將向您展示一些關於如何減少DNS查詢並在您的WordPress站點上加快查詢速度的建議。在某些網站速度測試工具中,這有時也稱為“最小化DNS查詢”。

最小化Pingdom中的DNS查詢

最小化Pingdom中的DNS查詢

技巧 1 – 使用快速DNS提供商

重要的是要了解,就像託管一樣,有越來越快的DNS提供商。這應該是您修復的第一件事。

通常,GoDaddy和Namecheap等域註冊商提供的免費DNS速度非常慢。DNS提供商通常像CDN一樣工作,他們在全球擁有多個POP。大型DNS提供商,如Amazon、Cloudflare、Dyn和DNS Made Easy,都擁有專門為具有低延遲環境的DNS設計的龐大基礎設施。

我們進行了一些測試來比較一些流行的DNS提供商的速度。我們使用了KeyCDN的效能工具以及SolveDNS的速度測試,取了平均值。速度是從全球多個地點測量的。如您所見,除了Cloudflare,免費DNS提供商的速度肯定較慢。這就是為什麼如果您認真對待您的業務和網站,我們強烈建議您使用優質DNS提供商。

DNS提供商速度

DNS提供商速度

上述某些提供商在某些地區也比其他提供商更快,因此確定您需要快速DNS查詢時間的區域(區域或全球)非常重要。 DNSPerf是另一種較新的DNS速度比較工具,您可以在選擇提供商時使用。您知道嗎,您也可以使用Cloudflare的DNS而無需其CDN功能

技巧 2 – 更改TTL值以利用DNS快取

值得慶幸的是,就像我們上面提到的,由於DNS快取,您不必擔心在每個頁面載入時都會發生查詢。這真的是關於第一次請求。DNS快取的工作方式與快取WordPress站點的方式類似。DNS從快取中提供,直到它過期(這是重新整理DNS快取的方法)。DNS快取的長度由他們所謂的生存時間 (TTL) 值決定。TTL越高,瀏覽器執行另一次DNS查詢的可能性就越小。

可以通過您的域註冊商或第3方DNS提供商更改TTL值,以改善您的 DNS 快取時間。需要注意的是,ISP也會快取DNS。下面是一些常見的TTL值。

  • 300 秒= 5 分鐘
  • 1800 秒= 30 分鐘
  • 3600 秒= 1 小時
  • 43200 秒= 12 小時
  • 86400 秒= 24 小時

Cloudflare TTL

Cloudflare TTL

30分鐘到一個小時通常是最常用的TTL值。但是,有些還將其TTL設定得非常低以允許快速更新。Cloudflare是一個示例,如果您使用其自動TTL,則預設為5分鐘。檢視不同型別的DNS記錄並根據它們更改的頻率相應地設定它們也很有用。下面是一個例子:

  • A和AAAA記錄:更頻繁地更改,從5分鐘到一個小時通常都可以
  • CNAME記錄:幾乎從不改變,更高的TTL(如24小時)通常是可以的
  • NS記錄:幾乎從不改變,更高的TTL,如24小時通常是可以的
  • MX記錄:不經常更改,像12小時這樣的高TTL通常是可以的
  • TXT記錄:不經常更改,12小時之類的高TTL通常就可以了

對於TTL,確實沒有正確或錯誤的答案。但它可以通過選擇與您的站點上的更改頻率一致的TTL來改善您的DNS查詢時間。

技巧 3 – 減少域(主機名)數量

減少站點上DNS查詢的最簡單方法是簡單地刪除查詢不同主機名的請求。 請記住,DNS查詢與請求數量無關,而與不同域的數量有關。通過Pingdom之類的工具執行您的WordPress網站,並確定每個請求是否真的有必要。由於DNS是主機名到IP的對映,您可能想知道為什麼人們不直接指向IP?這是因為IP地址可以頻繁更改,而主機名則不會。

技巧 4 – 使用具有更快DNS的替代服務

雖然簡單地減少域(主機名)的數量說起來容易做起來難,但我們建議首先檢視那些具有更高 DNS 查詢時間的域名。例如,在我們下面測試的這個站點中,我們可以很容易地發現Crazy Egg跟蹤指令碼的DNS查詢時間比其他站點長得多。這很可能是因為他們的DNS提供商不如其他提供商快。

 

查詢較長的DNS查詢時間

查詢較長的DNS查詢時間

在這種情況下,您或許可以檢視其他提供商,例如Hotjar,它們提供相同的服務,但可能正在使用更快的DNS提供商。在向WordPress站點新增外部服務時,評估其效能非常重要。

技巧 5 – 在CDN上移動和託管資源

減少DNS查詢的最簡單方法之一是將盡可能多的資源轉移到CDN提供商。如果您通過Pingdom執行您的站點,您可以按域檢視請求總數。正如您在此示例中看到的,93.8%的請求都指向CDN URL。有一個請求給主機,一個請求給Google Analytics。通過將盡可能多的資源移動到CDN,這減少了涉及的DNS查詢次數,從而減少了載入時間。

按域請求

按域請求

當然,現在並不總是可以將所有內容都移動到您的CDN。總會有一些外部資源或服務需要您從他們的伺服器載入它們。但我們建議您瀏覽您的網站。很多時候,我們看到WordPress使用者有很多資源沒有正確託管在他們的CDN上。通過這樣做,您還可以更好地利用HTTP/2和並行化。以下是我們經常看到的一些可以改進的資源:

Font Awesome

我們偶爾會在WordPress網站上看到外掛開發人員和主題包括Font Awesome,但有時會以這樣的方式將它排入佇列,預設情況下,像CDN啟用程式這樣的外掛將無法捕獲它。在這種情況下,我們建議與開發人員聯絡,詢問他們如何從CDN載入它。

Font Awesome的另一個常見情況是它有時從預設的BootstrapCDN (MaxCDN)載入。雖然這沒有任何問題,但它新增了另一個您不需要的DNS查詢。在大多數情況下,從您自己的CDN載入Font Awesome會更好,這樣就不會再進行查詢了。

Gravatar

如果您使用WordPress原生評論,您可能需要額外查詢secure.gravatar.com以載入gravatars。一種簡單的解決方案是使用延遲載入評論外掛。雖然這不會減少DNS查詢,但會延遲它直到使用者向下滾動頁面。因此,從某種意義上說,您正在減少首頁載入時的DNS查詢。請務必檢視我們的部落格文章,瞭解其他加快評論速度的方法。

谷歌字型

使用Google Fonts,您有一個額外的DNS請求來查詢fonts.googleapis.com以獲取CSS檔案。然後,您可以向fonts.gstatic.com發出其他請求以下載字型檔案。當您在本地託管所有請求時,所有請求都來自同一個域或CDN,並且很可能您不需要另一個CSS檔案,因為它將在您的WordPress主題的CSS檔案中。這樣做有利有弊,但請檢視我們關於如何在本地託管字型的深入文章。

谷歌字型DNS查詢

谷歌字型DNS查詢

Font Awesome、Gravatars和Google Fonts只是通過確保它們從CDN載入來減少DNS查詢的幾個示例。您目前是否正在從CDN載入所有可能的內容?看看總是好的。

技巧 6 – 利用DNS預取

另一個加速DNS的技巧是使用DNS預取。這允許瀏覽器在後臺在頁面上執行DNS查詢。您可以通過在WordPress網站的Header中新增一些程式碼行來實現。請參閱下面的一些示例。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<!-- Prefetch DNS for external assets -->
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="dns-prefetch" href="//www.google-analytics.com">
<link rel="dns-prefetch" href="//cdn.domain.com">
<!-- Prefetch DNS for external assets --> <link rel="dns-prefetch" href="//fonts.googleapis.com"> <link rel="dns-prefetch" href="//www.google-analytics.com"> <link rel="dns-prefetch" href="//cdn.domain.com">
<!-- Prefetch DNS for external assets -->
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="dns-prefetch" href="//www.google-analytics.com"> 
<link rel="dns-prefetch" href="//cdn.domain.com">

除iOS Safari、Opera Mini和Android瀏覽器外,所有主要瀏覽器也支援DNS預取 。

DNS預取瀏覽器支援

DNS預取瀏覽器支援

或者,如果您執行的是WordPress 4.6或更高版本,您可能需要使用資源提示。開發人員可以使用wp_resource_hints過濾器為dns-prefetch、preconnect、prefetch或prerender新增自定義域和URL。

技巧 7 – 延遲JavaScript的載入

如果您推遲JavaScript的載入,這可以防止在文件完全載入之前載入內容。這不會減少所需的DNS查詢次數,但會阻止立即呼叫它們,從而可以加快使用者體驗。Varvy對如何延遲JavaScript有很好的解釋。他在他的網站上使用的一個例子是他的Google Analytics指令碼,因為它沒有理由載入到首屏。

在WordPress中,您可以使用Async JavaScript等免費外掛來延遲JavaScript的載入。但是,重要的是要知道您很可能必須瀏覽並列出您希望從延遲應用中排除的任何指令碼。為什麼?因為需要一些JavaScript才能在首屏呈現。Async JavaScript也與Autooptimize外掛完全相容。

在WordPress中推遲JavaScript

在WordPress中推遲JavaScript

請務必檢視我們關於如何消除阻塞渲染的JavaScript和CSS的深入文章。

技巧 8 – 利用ANAME記錄和CNAME Flatten

還有來自DNS Made Easy和Cloudflare等提供商的額外記錄,可以幫助減少後端的請求數量。

使用DNS輕鬆記錄ANAME

ANAME記錄為您提供CNAME記錄的功能,但在根級別。例如,假設您為www.domain.com配置了CNAME。www必須首先解析為主機名,然後解析為IP地址。這需要兩個請求。使用ANAME記錄,您可以跳過這些請求之一!如果設定正確,這些也可以與CDN結合使用。

CNAME

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ANSWER SECTION:
www.domain.com. 1799 IN CNAME domain.com.
domain.com. 1799 IN A 192.168.1.2
ANSWER SECTION: www.domain.com. 1799 IN CNAME domain.com. domain.com. 1799 IN A 192.168.1.2
ANSWER SECTION:
www.domain.com. 1799 IN CNAME domain.com.
domain.com. 1799 IN A 192.168.1.2

ANAME

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ANSWER SECTION:
www.domain.com. 1799 IN A 192.168.1.2
ANSWER SECTION: www.domain.com. 1799 IN A 192.168.1.2
ANSWER SECTION:
www.domain.com. 1799 IN A 192.168.1.2

然而,這並不總是正確的。如果主機名在同一DNS區域中,則可能會在同一請求中檢索A記錄。

使用Cloudflare的CNAME Flattening

與ANAME記錄類似,Cloudflare在區域頂點(或根)為其客戶提供自動CNAME Flattening

小結

DNS通常是那些被忽視的效能因素之一,但如果您不小心,它很容易佔整個載入時間的很大一部分。瞭解DNS的工作原理很重要,那裡有越來越快的提供商,以及如何減少查詢以加快站點速度。

評論留言