加速 Nginx 響應的 5 個措施

核心內容主要是通過修改 Nginx 配置文件來進行調優的!

海軍上將威廉·麥克拉文在 2014 年於德克薩斯大學發表的著名演講中說,如果你想改變世界,就從鋪牀開始吧!有時,一些很小的事情可能會產生很大的影響,無論你是早上起來整理你的牀鋪,還是對網站的 HTTP 服務配置文件做一些小小的改變。

這看起來像是不是有些誇大其詞呢?

但是,在 2020 年的前幾個月裏面,擊垮了人們關於世界,什麼是正常和合理的定義。由於 COVID‑19 的大流行,地球上將近一半的人被困在家中,互聯網已成爲他們交流、娛樂、購買食物、工作和教育的唯一方式。每一週,互聯網的網絡流量和服務器負載都比以往任何時候都要高。根據 BroadbandNow 公司 3 月 25 日發佈的報告顯示,很多城市已經出現一定程度的網絡退化。

這時,我們就需要通過優化網站,對 HTTP 服務器進行一些小的改動,可以減少用戶使用的網絡帶寬和服務器上的負載,就可以給更多用戶提供服務。這裏,我們將介紹一些簡單但功能強大的配置更改,這些改動操作步驟非常簡單,但可以明顯提高網站性能並減少使用的網絡帶寬。

舉一個現實存在的例子,我們有一個電子商務的站點,該站點運行着 Nginx1.15.9 作爲其 web 服務器。爲了便於計算,我們假設該站點每天有 100 個獨立用戶,30% 的用戶是重複訪問者,每個用戶在一個會話中平均訪問 4 個頁面。

1. 啓用 Gzip 壓縮

Enabling Gzip Compression for HTML, CSS, and JavaScript Files

如您所知,在網站上構建頁面的 HTMLCSS 和 JavaScript 文件可能非常龐大。在大多數情況下,Web 服務器可以即時壓縮這些和其他文本文件,以節省網絡帶寬。查看 Web 服務器是否正在壓縮文件的一種方法,就是使用瀏覽器中的開發人員工具。

對於許多瀏覽器,您可以使用 F12 鍵訪問該工具,相關信息在 Network 選項卡上,可以得到如下所示的截圖例子。正如您在左下角看到的,沒有壓縮:文本文件的大小爲 1.15 MB,傳輸了大量數據。

默認情況下,壓縮功能在 Nginx 中是禁用的,但因爲安裝方式或 Linux 發行版的不同,一些情況下可能在默認的 nginx.conf 配置文件中是啓用狀態。這裏,我們在 NGINX 配置文件中啓用了 gzip 壓縮:

gzip on;  
gzip_types application/xml  
    application/json  
    text/css  
    text/javascript  
    application/javascript;  
gzip_vary on;  
gzip_comp_level 6;  
gzip_min_length 500;  

正如下面屏幕截圖中看到的那樣,壓縮後數據傳輸減少到 260KB,相對來收減少了約 80% 數據傳輸!對於頁面上的每個新用戶,您可以節省大約 917KB 的數據傳輸。對於長期使用我們網站的用戶,每天可以節省 62MB 帶寬,每月可以節省 1860MB 帶寬。

2. 設置緩存頭

Setting Cache Headers

瀏覽器檢索網頁文件時,會將副本保留在本地磁盤緩存中。這樣,當你再次訪問該頁面時,瀏覽器就不必從服務器重新獲取文件。每個瀏覽器都有自己的使用邏輯,來決定何時使用該文件對應的本地副本,以及何時在服務器更改了該文件時再次獲取它。但是,作爲網站所有者,你可以在發送的 HTTP 響應中設置緩存控制和過期標頭,以提高瀏覽器的緩存行爲的效率,從而減少很多不必要的 HTTP 請求。

首先,可以爲字體和圖像設置較長的緩存過期時間,這些字體和圖像可能不會經常更改。在下面的示例中,設置客戶端瀏覽器將字體和圖像在本地緩存中保留一個月。

location ~* \.(?:jpg|jpeg|gif|png|ico|woff2)$ {  
    expires 1M;  
    add_header Cache-Control "public";  
}  

3. 啓用 HTTP2 協議

Enabling HTTP/2 Protocol Support

HTTP/2 是用於服務網頁的下一代協議,旨在更好地利用網絡和主機服務器。根據Google 文檔,它可以更快地加載頁面內容和處理請求。

The resulting protocol is more friendly to the network, because fewer TCP  
connections are used in comparison to HTTP/1.x. This means less competition  
with other flows, and longer‑lived connections, which in turn leads to better  
utilization of available network capacity.  

在 Nginx1.9.5 及更高版本中已經支持了 HTTP/2 協議,如果需要使用或啓用 HTTP/2 協議的話,在 Nginx 配置文件的 listen 指令上包含 http2 參數,即可。需要請注意的是,在大多數情況下,還需要啓用 TLS 才能正常使用 HTTP/2 協議。

listen 443 ssl http2;  

下面這網站可以驗證自己管理的網站是否支持 HTTP/2 的協議。

4. 優化日誌

Optimizing Logging

我們在管理網站的時候,即使是有對應的監控服務,但是對應日誌分析還是不夠到位。你也可能只關注錯誤(400 和 500 個狀態碼等等),而不是成功的請求。通過減少不必要的日誌記錄,可以節省服務器上的磁盤存儲、CPU 和 I/O 操作。這不僅可以讓我們服務器更快一些,而且釋放的資源可以用來運行其他服務。

有幾種不同的方法可以減少和優化日誌記錄,但是在這裏,我們重點介紹三個。

1、頁面資源請求的日誌記錄

如果我們不需要記錄檢索普通頁面資源的請求,比如圖像文件、JavaScript 文件和 CSS 文件等等,那麼這是一個快速而簡單的解決方案。你所需要做的就是創建一個與這些文件類型匹配的 location 塊,並配置禁用其中的日誌記錄。

location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {  
    access_log off;  
}  

2、禁用成功請求的日誌記錄

這是一種更好的方法,因爲它會丟棄帶有 2xx 或 3xx 的響應查詢,僅記錄錯誤請求。它比方法 1 稍微複雜一點,因爲它取決於您的 Nginx 日誌記錄的配置方式。

使用 Nginx 官方文檔中的示例,讓我們打開條件日誌記錄。創建一個 $loggable 的變量並將其設置爲 0,用於帶有 2xx 和 3xx 響應代碼的日誌請求,否則設置爲 1,即可。然後在 access_log 指令中,將該變量作爲條件引用。

# /etc/nginx/nginx.conf
access_log /var/log/nginx/access.log;
# access_log directive
map $status $loggable {
    ~^[23] 0;
    default 1;
}

access_log /var/log/nginx/access.log combined if=$loggable;

3、最小化 I/O 操作

即使你要記錄所有請求,也可以通過打開訪問日誌緩衝來最大程度地減少 I/O 操作。使用此指令,Nginx 將等待將日誌數據寫入磁盤,直到填滿 512KB 緩衝區或自上次刷新以來已過了 1 分鐘(以先發生者爲準)。

access_log /var/log/nginx/access.log combined buffer=512k flush=1m;  

5. 限制帶寬

Limiting Bandwidth for Particular URLs

如果服務器提供較大的文件(或較小但非常受歡迎的文件,例如表單或報表文件等),則設置客戶端下載文件的最大速度可能是一個非常有用的選擇。如果你的站點已經承受了很高的網絡負載,則限制下載速度會留下更多帶寬,以使應用程序的關鍵部分保持響應,這是硬件製造商使用的非常受歡迎的解決方案。

使用 limit_rate 指令來限制特定 URL 的帶寬。在這裏,我們將 /download 下每個文件的傳輸速率限制爲每秒 50KB 的速度。

location /download/ {  
    limit_rate 50k;  
}  

你可能還希望僅對較大的文件進行速率限制,這可以通過 limit_rate_after 指令進行。在此示例中,每個文件(來自任何目錄)的前 500KB 都不受速度限制地進行傳輸,之後的所有內容均以 50KB/s 的速度爲上限。這樣可以加快網站關鍵部分的交付速度,同時降低其他部分的速度。

location / {  
    limit_rate_after 500k;  
    limit_rate 50k;  
}  

請注意,速率限制適用於瀏覽器和 Nginx 之間的單個 HTTP 連接,因此請不要阻止用戶使用下載管理器來繞開速率限制。

我們希望這五個技巧能幫助你優化網站的性能,然而速度和帶寬增益因網站而異。即使調整你的服務 Nginx 配置,發現似乎並沒有顯着釋放帶寬或提高速度,但成千上萬個網站分別調整其 Nginx 配置的整體影響加在一起呢?我們的全球網絡得到更有效的利用,這意味着最關鍵的服務將在需要時提供。

哈哈哈,當然我們還可以使用 F5 等負載均衡器。

(感謝閱讀,希望對你所有幫助)
來源:https://escapelife.github.io/posts/ebc52dd5.html

    
    
    

本文分享自微信公衆號 - JAVA高級架構(gaojijiagou)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章