加速 Nginx 響應(yīng)的 5 個(gè)措施!效果明顯~
點(diǎn)擊“程序員面試吧”,選擇“星標(biāo)??”
“下拉至文末”查看更多
海軍上將威廉·麥克拉文在 2014 年于德克薩斯大學(xué)發(fā)表的著名演講中說(shuō),如果你想改變世界,就從鋪床開(kāi)始吧!有時(shí),一些很小的事情可能會(huì)產(chǎn)生很大的影響,無(wú)論你是早上起來(lái)整理你的床鋪,還是對(duì)網(wǎng)站的 HTTP 服務(wù)配置文件做一些小小的改變。
這看起來(lái)像是不是有些夸大其詞呢?但是,在 2020 年的前幾個(gè)月里面,擊垮了人們關(guān)于世界,什么是正常和合理的定義。由于 COVID?19 的大流行,地球上將近一半的人被困在家中,互聯(lián)網(wǎng)已成為他們交流、娛樂(lè)、購(gòu)買食物、工作和教育的唯一方式。每一周,互聯(lián)網(wǎng)的網(wǎng)絡(luò)流量和服務(wù)器負(fù)載都比以往任何時(shí)候都要高。根據(jù) BroadbandNow 公司 3 月 25 日發(fā)布的報(bào)告顯示,很多城市已經(jīng)出現(xiàn)一定程度的網(wǎng)絡(luò)退化。
這時(shí),我們就需要通過(guò)優(yōu)化網(wǎng)站,對(duì) HTTP 服務(wù)器進(jìn)行一些小的改動(dòng),可以減少用戶使用的網(wǎng)絡(luò)帶寬和服務(wù)器上的負(fù)載,就可以給更多用戶提供服務(wù)。這里,我們將介紹一些簡(jiǎn)單但功能強(qiáng)大的配置更改,這些改動(dòng)操作步驟非常簡(jiǎn)單,但可以明顯提高網(wǎng)站性能并減少使用的網(wǎng)絡(luò)帶寬。
舉一個(gè)現(xiàn)實(shí)存在的例子,我們有一個(gè)電子商務(wù)的站點(diǎn),該站點(diǎn)運(yùn)行著 Nginx1.15.9 作為其 web 服務(wù)器。為了便于計(jì)算,我們假設(shè)該站點(diǎn)每天有 100 個(gè)獨(dú)立用戶,30% 的用戶是重復(fù)訪問(wèn)者,每個(gè)用戶在一個(gè)會(huì)話中平均訪問(wèn) 4 個(gè)頁(yè)面。
1、啟用 Gzip 壓縮
Enabling Gzip Compression for HTML, CSS, and JavaScript Files
如您所知,在網(wǎng)站上構(gòu)建頁(yè)面的 HTML,CSS 和 JavaScript 文件可能非常龐大。在大多數(shù)情況下,Web 服務(wù)器可以即時(shí)壓縮這些和其他文本文件,以節(jié)省網(wǎng)絡(luò)帶寬。查看 Web 服務(wù)器是否正在壓縮文件的一種方法,就是使用瀏覽器中的開(kāi)發(fā)人員工具。
對(duì)于許多瀏覽器,您可以使用 F12 鍵訪問(wèn)該工具,相關(guān)信息在 Network 選項(xiàng)卡上,可以得到如下所示的截圖例子。正如您在左下角看到的,沒(méi)有壓縮:文本文件的大小為 1.15 MB,傳輸了大量數(shù)據(jù)。

默認(rèn)情況下,壓縮功能在 Nginx 中是禁用的,但因?yàn)榘惭b方式或 Linux 發(fā)行版的不同,一些情況下可能在默認(rèn)的 nginx.conf 配置文件中是啟用狀態(tài)。這里,我們?cè)?nbsp;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;正如下面屏幕截圖中看到的那樣,壓縮后數(shù)據(jù)傳輸減少到 260KB,相對(duì)來(lái)收減少了約 80% 數(shù)據(jù)傳輸!對(duì)于頁(yè)面上的每個(gè)新用戶,您可以節(jié)省大約 917KB 的數(shù)據(jù)傳輸。對(duì)于長(zhǎng)期使用我們網(wǎng)站的用戶,每天可以節(jié)省 62MB 帶寬,每月可以節(jié)省 1860MB 帶寬。

2、設(shè)置緩存頭
Setting Cache Headers
瀏覽器檢索網(wǎng)頁(yè)文件時(shí),會(huì)將副本保留在本地磁盤緩存中。這樣,當(dāng)你再次訪問(wèn)該頁(yè)面時(shí),瀏覽器就不必從服務(wù)器重新獲取文件。每個(gè)瀏覽器都有自己的使用邏輯,來(lái)決定何時(shí)使用該文件對(duì)應(yīng)的本地副本,以及何時(shí)在服務(wù)器更改了該文件時(shí)再次獲取它。但是,作為網(wǎng)站所有者,你可以在發(fā)送的 HTTP 響應(yīng)中設(shè)置緩存控制和過(guò)期標(biāo)頭,以提高瀏覽器的緩存行為的效率,從而減少很多不必要的 HTTP 請(qǐng)求。
首先,可以為字體和圖像設(shè)置較長(zhǎng)的緩存過(guò)期時(shí)間,這些字體和圖像可能不會(huì)經(jīng)常更改。在下面的示例中,設(shè)置客戶端瀏覽器將字體和圖像在本地緩存中保留一個(gè)月。
location ~* \.(?:jpg|jpeg|gif|png|ico|woff2)$ {
expires 1M;
add_header Cache-Control "public";
}3、啟用 HTTP2 協(xié)議
Enabling HTTP/2 Protocol Support
HTTP/2 是用于服務(wù)網(wǎng)頁(yè)的下一代協(xié)議,旨在更好地利用網(wǎng)絡(luò)和主機(jī)服務(wù)器。根據(jù)Google 文檔,它可以更快地加載頁(yè)面內(nèi)容和處理請(qǐng)求。
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 及更高版本中已經(jīng)支持了 HTTP/2 協(xié)議,如果需要使用或啟用 HTTP/2 協(xié)議的話,在 Nginx 配置文件的 listen 指令上包含 http2 參數(shù),即可。需要請(qǐng)注意的是,在大多數(shù)情況下,還需要啟用 TLS 才能正常使用 HTTP/2 協(xié)議。
listen 443 ssl http2;下面這網(wǎng)站可以驗(yàn)證自己管理的網(wǎng)站是否支持 HTTP/2 的協(xié)議。

4、優(yōu)化日志
Optimizing Logging
我們?cè)诠芾砭W(wǎng)站的時(shí)候,即使是有對(duì)應(yīng)的監(jiān)控服務(wù),但是對(duì)應(yīng)日志分析還是不夠到位。你也可能只關(guān)注錯(cuò)誤(400 和 500 個(gè)狀態(tài)碼等等),而不是成功的請(qǐng)求。通過(guò)減少不必要的日志記錄,可以節(jié)省服務(wù)器上的磁盤存儲(chǔ)、CPU 和 I/O 操作。這不僅可以讓我們服務(wù)器更快一些,而且釋放的資源可以用來(lái)運(yùn)行其他服務(wù)。
有幾種不同的方法可以減少和優(yōu)化日志記錄,但是在這里,我們重點(diǎn)介紹三個(gè)。
[1] 禁用頁(yè)面資源請(qǐng)求的日志記錄
如果我們不需要記錄檢索普通頁(yè)面資源的請(qǐng)求,比如圖像文件、JavaScript 文件和 CSS 文件等等,那么這是一個(gè)快速而簡(jiǎn)單的解決方案。你所需要做的就是創(chuàng)建一個(gè)與這些文件類型匹配的 location 塊,并配置禁用其中的日志記錄。
location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
access_log off;
}[2] 禁用成功請(qǐng)求的日志記錄
這是一種更好的方法,因?yàn)樗鼤?huì)丟棄帶有 2xx 或 3xx 的響應(yīng)查詢,僅記錄錯(cuò)誤請(qǐng)求。它比方法 1 稍微復(fù)雜一點(diǎn),因?yàn)樗Q于您的 Nginx 日志記錄的配置方式。
使用 Nginx 官方文檔中的示例,讓我們打開(kāi)條件日志記錄。創(chuàng)建一個(gè) $loggable 的變量并將其設(shè)置為 0,用于帶有 2xx 和 3xx 響應(yīng)代碼的日志請(qǐng)求,否則設(shè)置為 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 操作
即使你要記錄所有請(qǐng)求,也可以通過(guò)打開(kāi)訪問(wèn)日志緩沖來(lái)最大程度地減少 I/O 操作。使用此指令,Nginx 將等待將日志數(shù)據(jù)寫入磁盤,直到填滿 512KB 緩沖區(qū)或自上次刷新以來(lái)已過(guò)了 1 分鐘(以先發(fā)生者為準(zhǔn))。
access_log /var/log/nginx/access.log combined buffer=512k flush=1m;5、限制帶寬
Limiting Bandwidth for Particular URLs
如果服務(wù)器提供較大的文件(或較小但非常受歡迎的文件,例如表單或報(bào)表文件等),則設(shè)置客戶端下載文件的最大速度可能是一個(gè)非常有用的選擇。如果你的站點(diǎn)已經(jīng)承受了很高的網(wǎng)絡(luò)負(fù)載,則限制下載速度會(huì)留下更多帶寬,以使應(yīng)用程序的關(guān)鍵部分保持響應(yīng),這是硬件制造商使用的非常受歡迎的解決方案。
使用 limit_rate 指令來(lái)限制特定 URL 的帶寬。在這里,我們將 /download 下每個(gè)文件的傳輸速率限制為每秒 50KB 的速度。
location /download/ {
limit_rate 50k;
}你可能還希望僅對(duì)較大的文件進(jìn)行速率限制,這可以通過(guò) limit_rate_after 指令進(jìn)行。在此示例中,每個(gè)文件(來(lái)自任何目錄)的前 500KB 都不受速度限制地進(jìn)行傳輸,之后的所有內(nèi)容均以 50KB/s 的速度為上限。這樣可以加快網(wǎng)站關(guān)鍵部分的交付速度,同時(shí)降低其他部分的速度。
location / {
limit_rate_after 500k;
limit_rate 50k;
}請(qǐng)注意,速率限制適用于瀏覽器和 Nginx 之間的單個(gè) HTTP 連接,因此請(qǐng)不要阻止用戶使用下載管理器來(lái)繞開(kāi)速率限制。
翻譯自:《Help the World by Healing Your NGINX Configuration》
我們希望這五個(gè)技巧能幫助你優(yōu)化網(wǎng)站的性能,然而速度和帶寬增益因網(wǎng)站而異。即使調(diào)整你的服務(wù) Nginx 配置,發(fā)現(xiàn)似乎并沒(méi)有顯著釋放帶寬或提高速度,但成千上萬(wàn)個(gè)網(wǎng)站分別調(diào)整其 Nginx 配置的整體影響加在一起呢?我們的全球網(wǎng)絡(luò)得到更有效的利用,這意味著最關(guān)鍵的服務(wù)將在需要時(shí)提供。
哈哈哈,當(dāng)然我們還可以使用 F5 等負(fù)載均衡器。
![]()
