1.引出問(wèn)題
Nginx可以作為靜態(tài)資源服務(wù)器,比如我們?cè)L問(wèn)192.168.110.97:80
,熟悉的nginx歡迎界面,這其實(shí)也是nginx為我們提供的一個(gè)靜態(tài)文件:index.html
。
既然是靜態(tài)資源,那我們能否優(yōu)化一下傳輸效率呢?
1)sendfile文件高效傳輸模式。如何開(kāi)啟?它的原理到底是什么呢?
2)數(shù)據(jù)量大,傳輸效率低,如何進(jìn)行優(yōu)化?
2.sendfile高效傳輸
在nginx.conf
中配置sendfile on;
指令就可以開(kāi)啟文件高效傳輸模式,那么它的原理是什么呢?
話不多說(shuō),走起。
sendfile的實(shí)現(xiàn)原理是通過(guò)調(diào)用內(nèi)核提供的sendfile()調(diào)用來(lái)實(shí)現(xiàn)的。調(diào)用過(guò)程中,內(nèi)核會(huì)將源文件的數(shù)據(jù)直接傳輸?shù)絪ocket中,而不需要將數(shù)據(jù)先拷貝到用戶空間再進(jìn)行傳輸。這樣就可以避免數(shù)據(jù)在用戶空間和內(nèi)核空間之間的多次拷貝,從而提高了文件傳輸?shù)男省?/p>
既然是這樣,那么普通傳輸模式和高效傳輸模式之間的區(qū)別就越發(fā)清晰了。
1)普通傳輸模式
發(fā)起文件讀取命令–》讀取文件到內(nèi)核空間–》拷貝文件到用戶空間–》拷貝文件到socket內(nèi)核空間–》傳輸給socket
2)高效傳輸模式
發(fā)起文件讀取命令–》讀取文件到內(nèi)核空間–》拷貝文件到socket內(nèi)核空間–》傳輸給socket
3)小結(jié)
1)普通傳輸模式涉及到多次內(nèi)核態(tài)與用戶態(tài)之間的切換,這很消耗系統(tǒng)資源。
2)sendfile高效傳輸模式,直接在內(nèi)核態(tài)進(jìn)行數(shù)據(jù)傳輸,不涉及內(nèi)核態(tài)與用戶態(tài)之間的切換,傳輸效率大大提升。
3.gzip文件壓縮
前面我們提到過(guò),開(kāi)啟sendfile文件高效傳輸模式,可以提升傳輸?shù)男?。其?shí),只做到這一步還是不夠的,一旦文件的數(shù)據(jù)量較大,傳輸?shù)乃俣扔謺?huì)大打折扣。
比如一部電影的大小是2G,下載時(shí)間很長(zhǎng),嚴(yán)重影響我們的觀影體驗(yàn),如果能夠壓縮到1G,那傳輸?shù)臅r(shí)間就會(huì)減半。
Nginx為我們提供了gzip相關(guān)的模塊,幫助實(shí)現(xiàn)對(duì)文件的壓縮。
3.1 ngx_http_gzip_moudle
據(jù)nginx官方文檔介紹,通過(guò)ngx_http_gzip_moudle提供的壓縮功能,有助于將數(shù)據(jù)的大小減少一半甚至更多。??
nginx已默認(rèn)為我們安裝該模塊。接下來(lái)我們配置其指令。
1)配置是否開(kāi)啟gzip
作用域:http, server, location, if in location
語(yǔ)法:gzip on | off;
默認(rèn)值:
gzip off;
2)配置gzip可壓縮的響應(yīng)類型
作用域:http, server, location
語(yǔ)法:gzip_types mime-type …;
默認(rèn)值:
gzip_types text/html;
可以看到,我們可以配置多個(gè)mime-type,并且可以使用*
匹配所有的mime-type。
??Tips:通常不會(huì)使用*
進(jìn)行匹配,如果所有的類型都開(kāi)啟壓縮,如果本身靜態(tài)資源的可壓縮性不高,就會(huì)造成系統(tǒng)資源的浪費(fèi)。
到這里,我們可以來(lái)體驗(yàn)一下開(kāi)啟gzip之后的壓縮效果。
1)準(zhǔn)備靜態(tài)文件/usr/local/nginx/html/jquery.js
下載地址:https://code.jquery.com/jquery-3.6.4.js
2)增加location塊
location /jquery {
root html;
}
訪問(wèn)http://192.168.110.98/jquery.js,查看文件大?。?04kb
3)開(kāi)啟gzip
為了保持配置文件清爽,我們只對(duì)gzip壓縮相關(guān)指令進(jìn)行注釋說(shuō)明。
worker_processes 1;
gzip on;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
# 測(cè)試gzip壓縮效果
location /jquery {
# 配置可壓縮的響應(yīng)類型
gzip_types text/javascript;
root html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
訪問(wèn)http://192.168.110.98/jquery.js,查看文件大?。?07kb
3)配置gzip壓縮級(jí)別
作用域:http, server, location
語(yǔ)法:gzip_comp_level level;
默認(rèn)值:
gzip_comp_level 1;
??Tips:gzip默認(rèn)壓縮級(jí)別為1,可設(shè)置的值為1-9,值越高壓縮程度越高,但是不一定值越高效果就越好,我們還是需要根據(jù)文件的可壓縮性設(shè)置合適的壓縮級(jí)別,否則也會(huì)造成系統(tǒng)資源的浪費(fèi)。
4)配置根據(jù)User-Agent禁用gzip
作用域:http, server, location
語(yǔ)法:gzip_disable regex …;
作用:如果請(qǐng)求的User-Agent頭信息與正則表達(dá)式匹配,則禁用gzip壓縮功能
??Tips:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 YaBrowser/23.3.4.594 Yowser/2.5 Safari/537.36
,可以根據(jù)需要配置正則表達(dá)式。
5)配置gzip可壓縮響應(yīng)的最小長(zhǎng)度
作用域:http, server, location
語(yǔ)法:gzip_min_length length;
默認(rèn)值:
gzip_min_length 20;
??Tips:默認(rèn)單位為byte,長(zhǎng)度是由Content-Length
響應(yīng)頭決定,如果長(zhǎng)度低于設(shè)置的值,就關(guān)閉gzip壓縮。建議設(shè)置為1kb以上。
6)gzip與sendfile的沖突問(wèn)題
我們知道,開(kāi)啟sendfile文件高效傳輸模式,文件在內(nèi)核空間直接傳輸給socket,不會(huì)經(jīng)過(guò)用戶程序,開(kāi)啟gzip之后,該模式也就失效了。那么怎么解決這個(gè)問(wèn)題呢?
3.2 ngx_http_gzip_static_module
前面提到的gzip與sendfile的沖突問(wèn)題,我們可以通過(guò)引入
ngx_http_gzip_static_module
模塊來(lái)進(jìn)行解決。該模塊允許發(fā)送文件擴(kuò)展名為.gz
的預(yù)壓縮文件。
??Tips:nginx默認(rèn)不會(huì)添加該模塊,需要我們自行引入。
配置指令:
作用域:http, server, location
語(yǔ)法:gzip_static on | off | always;
默認(rèn)值:
gzip_static off;
gzip_static on;
或gzip_static off;
都會(huì)檢測(cè)是否存在.gz
預(yù)壓縮文件。
gzip_static always;
會(huì)始終使用.gz
預(yù)壓縮文件。
1)對(duì)文件進(jìn)行壓縮,使用gzip命令
cd /usr/local/nginx/html
gzip jquery.js
2)修改配置文件
# gzip on;
gzip_static on;
我們?cè)俅卧L問(wèn)http://192.168.110.98/jquery.js,文件大小為87.5KB,訪問(wèn)的是壓縮過(guò)的.gz
文件。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-438019.html
以上就是Nginx對(duì)靜態(tài)資源傳輸?shù)膬?yōu)化,Nginx是多模塊化的,還有很多高級(jí)功能,我們后面繼續(xù)探索。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-438019.html
到了這里,關(guān)于Nginx靜態(tài)資源傳輸優(yōu)化,文件高效傳輸,事半功倍的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!