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