1. sendfile 指令
請求靜態(tài)資源的過程:客戶端通過網(wǎng)絡(luò)接口向服務(wù)端發(fā)送請求,操作系統(tǒng)將這些客戶端的請求傳遞給服務(wù)器端應(yīng)用程序,服務(wù)器端應(yīng)用程序會(huì)處理這些請求,請求處理完成以后,操作系統(tǒng)還需要將處理得到的結(jié)果通過網(wǎng)絡(luò)適配器傳遞回去。
sendfile 指令是用于將文件內(nèi)容發(fā)送到客戶端的指令。它可以讓 Nginx 直接將文件內(nèi)容發(fā)送給客戶端,而不需要將文件內(nèi)容先讀入內(nèi)存再發(fā)送。這樣可以減少 CPU 和內(nèi)存的使用,提高文件傳輸?shù)男省?/p>
sendfile 指令的語法如下:
sendfile on | off;
默認(rèn)情況下,sendfile 指令是啟用的。如果您想禁用它,可以將其設(shè)置為off。請注意,sendfile指令只適用于靜態(tài)文件,對于動(dòng)態(tài)生成的內(nèi)容,仍然需要將其讀入內(nèi)存并通過Nginx發(fā)送。
2. tcp_nopush 指令
tcp_nopush 指令必須在 sendfile 打開的狀態(tài)下才會(huì)生效,主要是用來提升網(wǎng)絡(luò)包的傳輸效率。
① 語法:tcp_nopush on | off;
② 默認(rèn)值:tcp_nopush off;
③ 作用:控制是否啟用TCP的TCP_CORK選項(xiàng)(對應(yīng)Linux內(nèi)核選項(xiàng)),該選項(xiàng)用于延遲發(fā)送TCP數(shù)據(jù)包,直到緩沖區(qū)填滿或者達(dá)到一定的時(shí)間閾值。當(dāng)tcp_nopush設(shè)置為on時(shí),表示啟用TCP_CORK選項(xiàng),Nginx會(huì)等待緩沖區(qū)填滿后再發(fā)送數(shù)據(jù)包,以減少網(wǎng)絡(luò)傳輸?shù)拇螖?shù),提高效率。當(dāng)tcp_nopush設(shè)置為off時(shí),表示禁用TCP_CORK選項(xiàng),Nginx會(huì)立即發(fā)送數(shù)據(jù)包,適用于實(shí)時(shí)性要求較高的場景。
總結(jié):當(dāng) tcp_nopush 設(shè)置為on時(shí),Nginx 會(huì)將數(shù)據(jù)緩存起來,直到緩存區(qū)滿或者達(dá)到一定的時(shí)間后再發(fā)送。這樣可以減少發(fā)送的次數(shù),提高傳輸效率。
3. tcp_nodelay 指令
tcp_nodelay 指令必須在keep-alive連接開啟的情況下才生效,來提高網(wǎng)絡(luò)包傳輸?shù)膶?shí)時(shí)性。
① 語法:tcp_nodelay on | off;
② 默認(rèn)值:tcp_nodelay on;
③ 作用:控制是否啟用TCP的TCP_NODELAY選項(xiàng)(對應(yīng)Linux內(nèi)核選項(xiàng)),該選項(xiàng)用于禁用Nagle算法,即禁止TCP延遲發(fā)送小數(shù)據(jù)包。當(dāng)tcp_nodelay設(shè)置為on時(shí),表示啟用TCP_NODELAY選項(xiàng),Nginx會(huì)立即發(fā)送小數(shù)據(jù)包,適用于實(shí)時(shí)性要求較高的場景。當(dāng)tcp_nodelay設(shè)置為off時(shí),表示禁用TCP_NODELAY選項(xiàng),Nginx會(huì)等待一定時(shí)間或者緩沖區(qū)填滿后再發(fā)送數(shù)據(jù)包,以減少網(wǎng)絡(luò)傳輸?shù)拇螖?shù),提高效率。
總結(jié):當(dāng) tcp_nodelay 設(shè)置為on時(shí) ,Nginx 會(huì)立即發(fā)送數(shù)據(jù),而不管數(shù)據(jù)量的大小。這樣可以減少延遲,提高傳輸效率。
tcp_nopush 和 tcp_nodelay 看起來是"互斥的",那么為什么要將這兩個(gè)值都打開?
三個(gè)指令都開啟的好處是,sendfile可以開啟高效的文件傳輸模式,tcp_nopush開啟可以確保在發(fā)送到客戶端之前數(shù)據(jù)包已經(jīng)充分“填滿”, 這大大減少了網(wǎng)絡(luò)開銷,并加快了文件發(fā)送的速度。 然后,當(dāng)它到達(dá)最后一個(gè)可能因?yàn)闆]有“填滿”而暫停的數(shù)據(jù)包時(shí),Nginx會(huì)忽略tcp_nopush參數(shù), 然后 tcp_nodelay 強(qiáng)制套接字發(fā)送數(shù)據(jù)。由此可知,TCP_NOPUSH可以與TCP_NODELAY一起設(shè)置,它比單獨(dú)配置TCP_NODELAY具有更強(qiáng)的性能。文章來源:http://www.zghlxwxcb.cn/news/detail-706803.html
所以我們可以使用如下配置來優(yōu)化Nginx靜態(tài)資源的處理:文章來源地址http://www.zghlxwxcb.cn/news/detail-706803.html
[root@192 conf]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server {
listen 8080;
server_name localhost;
}
}
到了這里,關(guān)于分布式 - 服務(wù)器Nginx:基礎(chǔ)系列之Nginx靜態(tài)資源配置優(yōu)化sendfile | tcp_nopush | tcp_nodelay的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!