加速 Nginx 響應(yīng)的 5 個(gè)措施!效果明顯~

2014?年于德克薩斯大學(xué)發(fā)表的著名演講中說,如果你想改變世界,就從鋪床開始吧!有時(shí),一些很小的事情可能會(huì)產(chǎn)生很大的影響,無論你是早上起來整理你的床鋪,還是對(duì)網(wǎng)站的?HTTP?服務(wù)配置文件做一些小小的改變。這看起來像是不是有些夸大其詞呢?但是,在?2020?年的前幾個(gè)月里面,擊垮了人們關(guān)于世界,什么是正常和合理的定義。由于?COVID?19?的大流行,地球上將近一半的人被困在家中,互聯(lián)網(wǎng)已成為他們交流、娛樂、購買食物、工作和教育的唯一方式。每一周,互聯(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í),我們就需要通過優(yōu)化網(wǎng)站,對(duì)?HTTP?服務(wù)器進(jìn)行一些小的改動(dòng),可以減少用戶使用的網(wǎng)絡(luò)帶寬和服務(wù)器上的負(fù)載,就可以給更多用戶提供服務(wù)。這里,我們將介紹一些簡單但功能強(qiáng)大的配置更改,這些改動(dòng)操作步驟非常簡單,但可以明顯提高網(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ù)訪問者,每個(gè)用戶在一個(gè)會(huì)話中平均訪問?4?個(gè)頁面。
1、啟用 Gzip 壓縮
Enabling Gzip Compression for HTML, CSS, and JavaScript Files
如您所知,在網(wǎng)站上構(gòu)建頁面的?HTML,CSS?和?JavaScript?文件可能非常龐大。在大多數(shù)情況下,Web?服務(wù)器可以即時(shí)壓縮這些和其他文本文件,以節(jié)省網(wǎng)絡(luò)帶寬。查看?Web?服務(wù)器是否正在壓縮文件的一種方法,就是使用瀏覽器中的開發(fā)人員工具。
對(duì)于許多瀏覽器,您可以使用?F12?鍵訪問該工具,相關(guān)信息在?Network?選項(xiàng)卡上,可以得到如下所示的截圖例子。正如您在左下角看到的,沒有壓縮:文本文件的大小為?1.15 MB,傳輸了大量數(shù)據(jù)。

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

?2、設(shè)置緩存頭
Setting Cache Headers
瀏覽器檢索網(wǎng)頁文件時(shí),會(huì)將副本保留在本地磁盤緩存中。這樣,當(dāng)你再次訪問該頁面時(shí),瀏覽器就不必從服務(wù)器重新獲取文件。每個(gè)瀏覽器都有自己的使用邏輯,來決定何時(shí)使用該文件對(duì)應(yīng)的本地副本,以及何時(shí)在服務(wù)器更改了該文件時(shí)再次獲取它。但是,作為網(wǎng)站所有者,你可以在發(fā)送的?HTTP?響應(yīng)中設(shè)置緩存控制和過期標(biāo)頭,以提高瀏覽器的緩存行為的效率,從而減少很多不必要的?HTTP?請(qǐng)求。
首先,可以為字體和圖像設(shè)置較長的緩存過期時(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)頁的下一代協(xié)議,旨在更好地利用網(wǎng)絡(luò)和主機(jī)服務(wù)器。根據(jù)Google 文檔,它可以更快地加載頁面內(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)求。通過減少不必要的日志記錄,可以節(jié)省服務(wù)器上的磁盤存儲(chǔ)、CPU?和?I/O?操作。這不僅可以讓我們服務(wù)器更快一些,而且釋放的資源可以用來運(yùn)行其他服務(wù)。
有幾種不同的方法可以減少和優(yōu)化日志記錄,但是在這里,我們重點(diǎn)介紹三個(gè)。
[1] 禁用頁面資源請(qǐng)求的日志記錄
如果我們不需要記錄檢索普通頁面資源的請(qǐng)求,比如圖像文件、JavaScript?文件和?CSS?文件等等,那么這是一個(gè)快速而簡單的解決方案。你所需要做的就是創(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?官方文檔中的示例,讓我們打開條件日志記錄。創(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)求,也可以通過打開訪問日志緩沖來最大程度地減少?I/O?操作。使用此指令,Nginx?將等待將日志數(shù)據(jù)寫入磁盤,直到填滿?512KB?緩沖區(qū)或自上次刷新以來已過了?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?指令來限制特定?URL?的帶寬。在這里,我們將?/download?下每個(gè)文件的傳輸速率限制為每秒?50KB?的速度。
location /download/ {
limit_rate 50k;
}你可能還希望僅對(duì)較大的文件進(jìn)行速率限制,這可以通過?limit_rate_after?指令進(jìn)行。在此示例中,每個(gè)文件(來自任何目錄)的前?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)不要阻止用戶使用下載管理器來繞開速率限制。
翻譯自:《Help the World by Healing Your NGINX Configuration》
我們希望這五個(gè)技巧能幫助你優(yōu)化網(wǎng)站的性能,然而速度和帶寬增益因網(wǎng)站而異。即使調(diào)整你的服務(wù)?Nginx?配置,發(fā)現(xiàn)似乎并沒有顯著釋放帶寬或提高速度,但成千上萬個(gè)網(wǎng)站分別調(diào)整其?Nginx?配置的整體影響加在一起呢?我們的全球網(wǎng)絡(luò)得到更有效的利用,這意味著最關(guān)鍵的服務(wù)將在需要時(shí)提供。
哈哈哈,當(dāng)然我們還可以使用?F5?等負(fù)載均衡器。
轉(zhuǎn)載:https://www.escapelife.site/posts/ebc52dd5.html
文章轉(zhuǎn)自:DevOps技術(shù)棧
有收獲,點(diǎn)個(gè)在看?


