解決SSE流被Nginx緩存的問題
問題
如果你的服務(wù)使用了nginx網(wǎng)關(guān),可能會出現(xiàn)nginx緩沖sse流的問題,導致的現(xiàn)象是,客戶端調(diào)用sse接口時,流數(shù)據(jù)并不是一條條出現(xiàn)的,而是一口氣出現(xiàn)的,原因就是nginx網(wǎng)關(guān)對流數(shù)據(jù)進行了緩存。
單個Nginx的情況
如果你的客戶端和服務(wù)器之間只存在一層nginx網(wǎng)關(guān),可以通過在接口添加X-Accel-Buffering=no的響應(yīng)header,來告訴nginx不要對響應(yīng)數(shù)據(jù)進行緩存。
多個Nginx的情況
但很多時候我們所在的服務(wù)環(huán)境可能不止一個nginx網(wǎng)關(guān)。拿我們的服務(wù)為例子,因為某些歷史遺留原因,客戶端到服務(wù)端實際上存在兩個nginx網(wǎng)關(guān),一個是公司層面的網(wǎng)關(guān),一個是用于k8s反向代理的網(wǎng)關(guān),這個時候單純設(shè)置X-Accel-Buffering=no就無效了。
原因是響應(yīng)數(shù)據(jù)首先到達第一個nginx,此時這個nginx會消耗掉這個header,然后將數(shù)據(jù)透傳到下一個nginx,此時第二個nginx由于默認會緩存數(shù)據(jù),所以sse流就再一次被緩存了。
解決辦法是在第一個nginx的配置里面,繼續(xù)加上這個header,表示這個路徑下的請求需要帶上這個header,這樣第二個nginx才能繼續(xù)收到這個header并且不緩存數(shù)據(jù)。
location /path { ... add_header X-Accel-Buffering "no"; ... }
客戶端與服務(wù)器之間有n個nginx,就要至少在n-1個nginx里面配置好這個header。
到此這篇關(guān)于解決SSE流被Nginx緩存的問題的文章就介紹到這了,更多相關(guān)SSE流被Nginx緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx內(nèi)部訪問特性如何實現(xiàn)靜態(tài)資源授權(quán)訪問
這篇文章主要介紹了nginx內(nèi)部訪問特性如何實現(xiàn)靜態(tài)資源授權(quán)訪問方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06