nginx静态资源优化配置方法
Nginx對靜態(tài)資源如何進行優(yōu)化配置。這里從三個屬性配置進行優(yōu)化:
sendfile on; tcp_nopush on; tcp_nodeplay on;sendfile
sendfile,用來開啟高效的文件傳輸模式。sendfile系統(tǒng)調(diào)用在兩個文件描述符之間直接傳遞數(shù)據(jù)(完全在內(nèi)核中操作),從而避免了數(shù)據(jù)在內(nèi)核緩沖區(qū)和用戶緩沖區(qū)之間的拷貝,操作效率很高,被稱之為零拷貝。
| 默認值 | sendfile off; |
| 位置 | http,server,location |
請求靜態(tài)資源的過程:客戶端通過網(wǎng)絡接口向服務端發(fā)送請求,操作系統(tǒng)將這些客戶端的請求傳遞給服務器端應用程序,服務器端應用程序會處理這些請求,請求處理完成以后,操作系統(tǒng)還需要將處理得到的結(jié)果通過網(wǎng)絡適配器(網(wǎng)卡)傳遞回去。
原理解釋:
read/write:
在傳統(tǒng)的文件傳輸方式(read、write/send方式),具體流程細節(jié)如下:
在這個過程當中,文件數(shù)據(jù)實際上是經(jīng)過了四次拷貝操作:
硬盤—>內(nèi)核緩沖區(qū)—>用戶緩沖區(qū)—>內(nèi)核socket緩沖區(qū)—>協(xié)議引擎
sendfile:
sendfile系統(tǒng)調(diào)用則提供了一種減少拷貝次數(shù),提升文件傳輸性能的方法。
這里沒有用戶態(tài)和內(nèi)核態(tài)之間的切換,也沒有內(nèi)核緩沖區(qū)和用戶緩沖區(qū)之間的拷貝,大大提升了傳輸性能。
這個過程數(shù)據(jù)經(jīng)歷的拷貝操作如下:
硬盤—>內(nèi)核緩沖區(qū)—>內(nèi)核socket緩沖區(qū)—>協(xié)議引擎
帶有DMA收集拷貝功能的sendfile
對于帶有DMA收集拷貝功能的sendfile系統(tǒng)調(diào)用,還可以再減少一次內(nèi)核緩沖區(qū)之間的拷貝。具體流程如下:
這個過程數(shù)據(jù)經(jīng)歷的拷貝操作如下:
硬盤—>內(nèi)核緩沖區(qū)—>協(xié)議引擎
tcp_nopush
tcp_nopush:該指令必須在sendfifile打開的狀態(tài)下才會生效,主要是用來提升網(wǎng)絡包的傳輸’效率’
| 默認值 | tcp_nopush off; |
| 位置 | http,server,location |
語法tcp_nppush的含義,當有數(shù)據(jù)時,先別著急發(fā)送,確保數(shù)據(jù)包已經(jīng)裝滿數(shù)據(jù),避免了網(wǎng)絡擁塞。他可以配置一次發(fā)送數(shù)據(jù)的包大小。也就是說,它不是按時間累計0.2秒后發(fā)送包,而是當包累計到一定大小后就發(fā)送。
當使用sendfile函數(shù)時,tcp_nopush才起作用,它和指令tco_nodelay是互斥的。tcp_cork是linux下tcp/ip傳輸?shù)囊粋€標準了,這個標準的大概的意思是,一般情況下,在tcp交互的過程中,當應用程序接收到數(shù)據(jù)包后馬上傳送出去,不等待,而tcp_cork選項是數(shù)據(jù)包不會馬上傳送出去,等到數(shù)據(jù)包最大時,一次性的傳輸出去,這樣有助于解決網(wǎng)絡堵塞,已經(jīng)是默認了。
也就是說tcp_nopush = on 會設(shè)置調(diào)用tcp_cork方法,這個也是默認的,結(jié)果就是數(shù)據(jù)包不會馬上傳送出去,等到數(shù)據(jù)包最大時,一次性的傳輸出去,這樣有助于解決網(wǎng)絡堵塞。
對于nginx配置文件中的tcp_nopush,默認就是tcp_nopush,不需要特別指定,這個選項對于www,ftp等大文件很有幫助
tcp_nodelay
tcp_nodelay:該指令必須在keep-alive連接開啟的情況下才生效,來提高網(wǎng)絡包傳輸?shù)摹瘜崟r性’.
你怎么可以強制 socket 在它的緩沖區(qū)里發(fā)送數(shù)據(jù)?
一個解決方案是 TCP 堆棧的 TCP_NODELAY選項。這樣就可以使緩沖區(qū)中的數(shù)據(jù)立即發(fā)送出去。
Nginx的 TCP_NODELAY 選項使得在打開一個新的 socket 時增加了TCP_NODELAY選項。但這時會造成一種情況:
終端應用程序每產(chǎn)生一次操作就會發(fā)送一個包,而典型情況下一個包會擁有一個字節(jié)的數(shù)據(jù)以及40個字節(jié)長的包頭,于是產(chǎn)生4000%的過載,很輕易地就能令網(wǎng)絡發(fā)生擁塞。為了避免這種情況,TCP堆棧實現(xiàn)了等待數(shù)據(jù) 0.2秒鐘,因此操作后它不會發(fā)送一個數(shù)據(jù)包,而是將這段時間內(nèi)的數(shù)據(jù)打成一個大的包。這一機制是由Nagle算法保證。
| 默認值 | tcp_nodelay on; |
| 位置 | http,server,location |
在平時使用的時候可以將兩個值都打開。“tcp_nopush"和”tcp_nodelay“是"互斥的”,那么為什么要將這兩個值都打開,這個大家需要知道的是在linux2.5.9以后的版本中兩者是可以兼容的,三個指令都開啟的好處是,sendfifile可以開啟高效的文件傳輸模式,tcp_nopush開啟可以確保在發(fā)送到客戶端之前數(shù)據(jù)包已經(jīng)充分“填滿”, 這大大減少了網(wǎng)絡開銷,并加快了文件發(fā)送的速度。 然后,當它到達最后一個可能因為沒有“填滿”而暫停的數(shù)據(jù)包時,Nginx會忽略tcp_nopush參數(shù), 然后,tcp_nodelay強制套接字發(fā)送數(shù)據(jù)。由此可知,TCP_NOPUSH可以與TCP_NODELAY一起設(shè)置,它比單獨配置TCP_NODELAY具有更強的性能。所以我們可以使用如下配置來優(yōu)化Nginx靜態(tài)資源的處理
sendfile on; tcp_nopush on; tcp_nodelay on;參數(shù)sendfile on 用于開啟文件高效傳輸模式,同時將tcp_nopush on 和tcp_nodelay on 兩個指令設(shè)置為on,可防止網(wǎng)絡及磁盤I/O阻塞,提升Nginx工作效率。
總結(jié)
以上是生活随笔為你收集整理的nginx静态资源优化配置方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机概念性的文字怎么降重,论文降重概念
- 下一篇: html特效代码 枫叶,jQuery飘落