當前位置:
首頁 > 最新 > nginx緩衝區排坑

nginx緩衝區排坑

問題回顧

近日,我們一個版本的分支上了預發,一個訂單查詢介面總是報錯,後端伺服器日誌大概如下

一開始排查問題的方向肯定是後端出錯了,但是看這個完整的異常棧,出錯報在框架層,和業務代碼無關,懷疑的方向就是後端數據量太大

然後通過抓包,發現每次前端報錯的時候,那個http返回報文中body里的json被截斷了,只有一部分,這時候就有點懷疑nginx了,畢竟這個請求是nginx代理請求的,極有可能nginx哪裡配置出錯了

那麼就進伺服器看nginx error日誌,看到了如下日誌

把/usr/local/nginx目錄的許可權設置為nginx,讓nginx進程能夠訪問就行了,返回報文被截斷的情況就再也沒發生了,瘋狂吐槽的App開發哥們終於能夠測試了。

這個問題阻礙測試接近1天,調查問題進度也沒上面寫的那麼順風順水,我覺得遇到問題首先要合理分析出問題出在哪裡,問題的初期其實我經過百度,其實和運維提過排查下nginx日誌這個雖然加錯了,凡是方向對了,如果看了nginx日誌,應該能立刻解決問題,但是沒有看,我也沒那台伺服器許可權第二天,我們抓包了,發現返回被截斷,我更加懷疑nginx的問題

嗯,這次對了

一個小小的點,阻礙了這麼多時間,這麼多人力,可見細節決定成敗,以及經驗的重要性

所以以後遇到問題

合理分析問題原因

看日誌,看日誌,看日誌

團隊合作

出現這個問題的原因就是nginx對它的緩衝區目錄沒有許可權,下面我們就來學習下這個緩衝區

緩衝區的作用,就是為了協調客戶端到nginx以及nginx到伺服器的速度不同。如果這兩條鏈路都非常快,那麼沒有緩衝區的事了。如果客戶端到nginx速度快,nginx到伺服器速度慢,沒有緩衝區,一點點數據量就直接發到客戶端,十分浪費性能。有了緩衝區,積累到一定量,再傳輸到客戶端,減少了Tcp請求。相反,客戶端到nginx速度慢,nginx到伺服器速度快,沒有緩衝區,nginx到伺服器的連接就會一直保持在那邊,直到客戶端接受完畢。有了緩衝區,返回內容放到緩衝區後,nginx到伺服器的連接就能斷開了,客戶端從緩衝區拉取即可。

緩衝區這個概念在很多地方都用到,你想到了那些地方?IO?MQ?


nginx緩衝區的配置主要在location模塊下面,主要配置參數如下


後端伺服器的相應頭會放到proxybuffersize當中,這個大小默認等於proxybuffers當中的設置單個緩衝區的大小。 proxybuffersize只是響應頭的緩衝區,沒有必要也跟著設置太大。 proxybuffer_size最好單獨設置,一般設置個4k就夠了。

proxybuffers的緩衝區大小一般會設置的比較大,以應付大網頁。 proxybuffers當中單個緩衝區的大小是由系統的內存頁面大小決定的,Linux系統中一般為4k。 proxy_buffers由緩衝區數量和緩衝區大小組成的。總的大小為number*size。

若某些請求的響應過大,則超過buffers的部分將被緩衝到硬碟(緩衝目錄由temppath指令指定), 當然這將會使讀取響應的速度減慢, 影響用戶體驗. 可以使用proxymaxtempfile_size指令關閉磁碟緩衝.


proxybusybufferssize不是獨立的空間,他是proxybuffers和proxybuffersize的一部分。nginx會在沒有完全讀完後端響應的時候就開始向客戶端傳送數據,所以它會划出一部分緩衝區來專門向客戶端傳送數據(這部分的大小是由proxybusybufferssize來控制的,建議為proxybuffers中單個緩衝區大小的2倍),然後它繼續從後端取數據,緩衝區滿了之後就寫到磁碟的臨時文件中。


臨時文件由proxymaxtempfilesize和proxytempfilewritesize這兩個指令決定。 proxytempfilewritesize是一次訪問能寫入的臨時文件的大小,默認是proxybuffersize和proxy_buffers中設置的緩衝區大小的2倍,Linux下一般是8k。

proxymaxtempfilesize指定當響應內容大於proxy_buffers指定的緩衝區時, 寫入硬碟的臨時文件的大小. 如果超過了這個值, Nginx將與Proxy伺服器同步的傳遞內容, 而不再緩衝到硬碟. 設置為0時, 則直接關閉硬碟緩衝.

緩衝區分為內存和文件兩部分,不可能所有Response都在內存中緩衝,畢竟需要用內存去建立更多連接,所以超過一定的量會刷到磁碟,我們出現的問題就是刷到磁碟這一步被許可權阻礙了,導致客戶端拿到的部分報文是內存中的

但是我們的Response並不是全部被截斷,百分之60的Response是正常的,我猜測要麼是這些Response沒有超過緩衝區大小,要麼寫的緩衝目錄部分存在許可權

注意下上面的默認配置,緩衝區是默認開啟的


默認的配置應該夠用,也可以根據應用平均的Response大小做優化,畢竟直接走內存肯定要比走IO快


看到這裡的觀眾,關注吧,關於技術的一切我都有可能分享

還有參考的文章https://www.cnblogs.com/me115/p/5698787.htmlhttps://www.cnblogs.com/bethal/p/5606062.htmlhttps://nginx.org/en/docs/http/ngxhttpproxymodule.html#proxytempfilewrite_size


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java後端筆記 的精彩文章:

TAG:Java後端筆記 |