摘要:什么是傳統(tǒng)的通訊模式是客戶端發(fā)起請求,服務(wù)端接收請求并作出響應(yīng)。而協(xié)議復(fù)用了的握手通道,具體指的是,客戶端通過請求與服務(wù)端協(xié)商升級協(xié)議。第二步,交換數(shù)據(jù),客戶端與服務(wù)端可以使用協(xié)議進行雙向通訊。
問題
一天更新完主分支后啟動nginx,結(jié)果報錯:nginx: [emerg] unknown "connection_upgrade" variable
網(wǎng)上查,發(fā)現(xiàn)是nginx配置文件出了問題,將下面map代碼塊補上即可。
http { map $http_upgrade $connection_upgrade { default upgrade; "" close; } server { location / { #… proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } }思考
雖然問題解決了,但后來我想知道為什么會出現(xiàn)這種情況,以及解決方法的真正原理。
在這篇博客可以知道問題出在了nginx代理websocket上。
傳統(tǒng)的http通訊模式是:客戶端發(fā)起請求,服務(wù)端接收請求并作出響應(yīng)。
而websocket協(xié)議復(fù)用了http的握手通道,具體指的是,客戶端通過HTTP請求與WebSocket服務(wù)端協(xié)商升級協(xié)議。
第一步,建立連接,客戶端使用http報文的格式發(fā)起協(xié)議升級的請求,服務(wù)端響應(yīng)協(xié)議升級。
第二步,交換數(shù)據(jù),客戶端與服務(wù)端可以使用websocket協(xié)議進行雙向通訊。
首先,客戶端發(fā)起協(xié)議升級的請求,而nginx在攔截時需要識別出這是一個協(xié)議升級(upgrade)的請求,所以必須顯式設(shè)置升級(Upgrade head)和連接頭(Connection head),如下:
location /sockjs-node/ { proxy_pass http://127.0.0.1:4200/sockjs-node/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; }
完成后,nginx將其作為WebSocket連接處理。
接著,服務(wù)器響應(yīng)升級請求,由nginx做代理進行處理,這時,需要進行如下配置:
http { map $http_upgrade $connection_upgrade { default upgrade; "" close; } server { ... } }
這時就出現(xiàn)了一開始我所修改的地方,結(jié)合上面那段的內(nèi)容,我大概可以猜出來map 代碼段該作用主要是根據(jù)客戶端請求中 $http_upgrade 的值,來構(gòu)造改變 $connection_upgrade 的值,即根據(jù)變量 $http_upgrade 的值創(chuàng)建新的變量 $connection_upgrade。
由于我沒有進行map映射,它不知道connection_upgrade是什么,所以就會出現(xiàn)unknown "connection_upgrade" variable錯誤。
即使是小小的一點改動,背后也會隱藏龐大的信息。如果止步于解決問題,而不是探索問題,就永遠不會有進步。
本人水平有限,歡迎各位在評論區(qū)指出不足,你們的反饋就是我的進步動力!
參考文檔:
https://www.nginx.com/blog/we...
https://www.cnblogs.com/chyin...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/40394.html
摘要:個人的理解參考資料的關(guān)于官方文檔開發(fā)者的博客文檔介紹的章節(jié) 最近有一個需求,就是需要使用 nginx 反向代理 websocket,經(jīng)過查找一番資料,目前已經(jīng)測試通過,本文只做一個記錄 注: 看官方文檔說 Nginx 在 1.3 以后的版本才支持 websocket 反向代理,所以要想使用支持 websocket 的功能,必須升級到 1.3 以后的版本,因此我這邊是下載的 Te...
摘要:昨天晚上忘記對開發(fā)環(huán)境做了什么改動,導(dǎo)致今天來了在進行接口調(diào)試的時候提示這個大多數(shù)情況下來說是一個很簡單的問題配置里面的錯誤。然而我檢查了我的配置,發(fā)現(xiàn)并沒有什么問題。 昨天晚上忘記對開發(fā)環(huán)境做了什么改動,導(dǎo)致今天來了在進行接口調(diào)試的時候nginx提示Primary script unknown,這個大多數(shù)情況下來說是一個很簡單的問題:nginx配置里面的script_filename...
from http://oyanglul.us 1 [x/2 for x in range(2,10,2)]
摘要:在反向代理一個帶有功能的程序源代碼地址時,發(fā)現(xiàn)訪問接口時總是出現(xiàn)響應(yīng),的配置參考的是官方文檔相關(guān)配置唯一不同的是我們的配置了。 在Nginx反向代理一個帶有WebSocket功能的Spring Web程序(源代碼地址)時,發(fā)現(xiàn)訪問WebSocket接口時總是出現(xiàn)403響應(yīng),Nginx的配置參考的是官方文檔: http { // ssl 相關(guān)配置 ... map...
閱讀 3294·2021-10-11 11:08
閱讀 4435·2021-09-22 15:54
閱讀 919·2019-08-30 15:56
閱讀 873·2019-08-30 15:55
閱讀 3547·2019-08-30 15:52
閱讀 1359·2019-08-30 15:43
閱讀 1940·2019-08-30 11:14
閱讀 2511·2019-08-29 16:11