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