核心內容主要是通過修改 Nginx 組態檔來進行調優的!

加速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
如您所知,在網站上構建頁面的 HTML,CSS 和 JavaScript 檔案可能非常龐大,在大多數情況下,Web 服務器可以即時壓縮這些和其他文本檔案,以節省網路帶寬,查看 Web 服務器是否正在壓縮檔案的一種方法,就是使用瀏覽器中的開發人員工具,
對于許多瀏覽器,您可以使用 F12 鍵訪問該工具,相關資訊在 Network 選項卡上,可以得到如下所示的截圖例子,正如您在左下角看到的,沒有壓縮:文本檔案的大小為 1.15 MB,傳輸了大量資料,

加速Nginx服務的回應
默認情況下,壓縮功能在 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 帶寬,

加速Nginx服務的回應
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 的協議,

加速Nginx服務的回應
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 等負載均衡器,
文章作者:Escape
翻譯自:https://www.nginx.com/blog/help-the-world-by-healing-your-nginx-configuration/
文章鏈接:https://escapelife.github.io/posts/ebc52dd5.html
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2021最新版)
2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!
3.阿里 Mock 工具正式開源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式發布,全新顛覆性版本!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/285558.html
標籤:Java
下一篇:IO流:File類的使用
