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