搜尋
首頁運維linux運維nginx反向代理webSocket配置

nginx反向代理webSocket配置

May 13, 2019 am 09:33 AM
nginxwebsocket

最近在做專案的時候用到了webSocket協定,而且是在微信小程式中用到了webSocket,微信小程式中使用wss協定的時候不能設定埠,只能使用預設的443埠。我的https已經監聽了443個端口,webSocket再去監聽443,肯定不行啊。要想辦法解決。於是想到了兩種辦法解決。一種解決方法是把webSocket部署到另一台伺服器上,這樣成本也太高了。另一種辦法,就是使用nginx反向代理。

因為webSocket協定是基於http協定升級的(見下圖),所以可以使用nginx反向代理webSocket.

nginx反向代理webSocket配置

從這張圖片上可以看出,webSocket連線的建立是在http協定的基礎上。

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

熟悉HTTP的童鞋可能發現了,這段類似HTTP協定的握手請求中,只是多了幾個東西。

Upgrade: websocket
Connection: Upgrade

這就是Websocket的核心了,告訴Apache、Nginx等伺服器:我發起的是Websocket協定。

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

首先,Sec-WebSocket-Key 是一個Base64 encode的值,這個是瀏覽器隨機產生的,告訴伺服器:泥煤,不要忽悠窩,我要驗證尼是不是真的是Websocket助理。

最後,Sec-WebSocket-Version 是告訴伺服器所使用的Websocket Draft(協定版本),在最初的時候,Websocket協定還在Draft 階段,各種奇怪的協定都有,而且還有很多期奇奇怪怪不同的東西,什麼Firefox和Chrome用的不是一個版本之類的,當初Websocket協議太多可是一個大難題。 。不過現在還好,已經定下來啦大家都使用的一個東西

然後伺服器會回傳下列東西,表示已經接受到請求, 成功建立Websocket啦!

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

這裡開始就是HTTP最後負責的區域了,告訴客戶,我已經成功切換協定啦~

Upgrade: websocket
Connection: Upgrade

依然是固定的,告訴客戶端即將升級的是Websocket協定。至此,HTTP已經完成它所有工作了,接下來就是完全按照Websocket協定進行了。

明白協議的原理了就可以下一步了

首先nginx先配置好https的憑證

伺服器的憑證是老大配置好的,我就直接用了。需要的自己查一下吧0.0

在nginx設定檔的service節點中加入如下設定

location /wss
        {
                 proxy_pass http://127.0.0.1:8888;
                 proxy_http_version 1.1;
                 proxy_set_header Upgrade $http_upgrade;
                 proxy_set_header Connection "Upgrade";
                proxy_set_header X-Real-IP $remote_addr;
         }

解釋一下參數

/wss這個是隨便起的,告訴Nginx要代理的url,現在我的設定為wss,當我訪問的我的伺服器https://abc.com/wss時,Nginx會把我的請求映射到本機的8888端口。

proxy_pass 要代理到的url,我的代理到本機的8888埠。

proxy_http_version 代理程式時使用的 http版本。

重點來了:

代理webSocket的關鍵參數

proxy_set_header Upgrade 把代理程式時http請求頭的Upgrade 設定為原來http請求的請求頭,wss協定的請求頭為websocket

proxy_set_header Connection 因為代理的wss協定,所以http請求頭的Connection設定為Upgrade

proxy_set_header X-Real-IP 給代理程式設定原http請求的ip,填入$remote_addr 即可

至於websocket協定的response的參數,在反向代理的時候不用管。

到這裡,Nginx反向代理webSocket的設定就完成了,重啟Nginx,用websocket連接試試,在原來wss地址的地方填寫wss://abc.com/wss。如果websocket成功連線,說明Nginx反向代理websocket已經成功了。

總結

現在的設定只是反向代理到本機時的設定,如果要反向代理到別的主機,在代理程式時可能會跨域問題,需要在Nginx的反向代理程式中做跨域的設定。

思考

在Nginx的設定檔中能看到這一段

location ~ .php$ {
      root html;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
}

這是Nginx中php的設定檔,我擦,怎麼這麼眼熟,這個配置清單跟剛才的websocket的反向代理這麼像。透過上網查資料才知道,原來Nginx在處理php類型的請求時,把請求發fastcgi管理進程處理,fascgi管理進程選擇cgi子進程處理結果並回傳被nginx,而php-fpm是一個PHP FastCGI管理器, nginx本身不能處理PHP,它只是個web伺服器,當接收到請求後,如果是php請求,則發給php解釋器處理,並把結果傳回給客戶端。所以說Nginx在處理php類型的請求時,本質上也是透過反向代理功能實現的。

我們可以把思維展開,用Nginx反向代理可以實現更多的功能,比如代理Tomcat

location /Tomcat
        {
                 proxy_pass http://127.0.0.1:8080;
                 proxy_http_version 1.1;
                proxy_set_header X-Real-IP $remote_addr;
         }

當然,也可以用Nginx反向代理實現負載平衡,這個我還沒有試過,等以後用到了,再來補充。

以上是nginx反向代理webSocket配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:aliyun。如有侵權,請聯絡admin@php.cn刪除
Linux操作系統的5個核心組件Linux操作系統的5個核心組件May 08, 2025 am 12:08 AM

Linux操作系統的5個核心組件是:1.內核,2.系統庫,3.系統工具,4.系統服務,5.文件系統。這些組件協同工作,確保系統的穩定和高效運行,共同構成了一個強大而靈活的操作系統。

Linux的5個基本要素:解釋Linux的5個基本要素:解釋May 07, 2025 am 12:14 AM

Linux的五個核心元素是:1.內核,2.命令行界面,3.文件系統,4.包管理,5.社區與開源。這些元素共同定義了Linux的本質和功能。

Linux操作:安全和用戶管理Linux操作:安全和用戶管理May 06, 2025 am 12:04 AM

Linux用戶管理和安全性可以通過以下步驟實現:1.創建用戶和組,使用命令如sudouseradd-m-gdevelopers-s/bin/bashjohn。 2.批量創建用戶和設置密碼策略,使用for循環和chpasswd命令。 3.檢查和修復常見錯誤,如家目錄和shell設置。 4.實施最佳實踐,如強密碼策略、定期審計和最小權限原則。 5.優化性能,使用sudo和調整PAM模塊配置。通過這些方法,可以有效管理用戶和提升系統安全性。

Linux操作:文件系統,進程等Linux操作:文件系統,進程等May 05, 2025 am 12:16 AM

Linux文件系統和進程管理的核心操作包括文件系統的管理和進程的控制。 1)文件系統操作包括創建、刪除、複製和移動文件或目錄,使用命令如mkdir、rmdir、cp和mv。 2)進程管理涉及啟動、監控和終止進程,使用命令如./my_script.sh&、top和kill。

Linux操作:外殼腳本和自動化Linux操作:外殼腳本和自動化May 04, 2025 am 12:15 AM

Shell腳本是Linux系統中用於自動化執行命令的強大工具。 1)Shell腳本通過解釋器逐行執行命令,處理變量替換和條件判斷。 2)基本用法包括備份操作,如使用tar命令備份目錄。 3)高級用法涉及使用函數和case語句管理服務。 4)調試技巧包括使用set-x開啟調試模式和set-e在命令失敗時退出。 5)性能優化建議避免子Shell,使用數組和優化循環。

Linux操作:了解核心功能Linux操作:了解核心功能May 03, 2025 am 12:09 AM

Linux是一個基於Unix的多用戶、多任務操作系統,強調簡單性、模塊化和開放性。其核心功能包括:文件系統:以樹狀結構組織,支持多種文件系統如ext4、XFS、Btrfs,使用df-T查看文件系統類型。進程管理:通過ps命令查看進程,使用PID管理進程,涉及優先級設置和信號處理。網絡配置:靈活設置IP地址和管理網絡服務,使用sudoipaddradd配置IP。這些功能在實際操作中通過基本命令和高級腳本自動化得以應用,提升效率並減少錯誤。

Linux:進入和退出維護模式Linux:進入和退出維護模式May 02, 2025 am 12:01 AM

進入Linux維護模式的方法包括:1.編輯GRUB配置文件,添加"single"或"1"參數並更新GRUB配置;2.在GRUB菜單中編輯啟動參數,添加"single"或"1"。退出維護模式只需重啟系統。通過這些步驟,你可以在需要時快速進入維護模式,並安全地退出,確保系統的穩定性和安全性。

了解Linux:定義的核心組件了解Linux:定義的核心組件May 01, 2025 am 12:19 AM

Linux的核心組件包括內核、shell、文件系統、進程管理和內存管理。 1)內核管理系統資源,2)shell提供用戶交互界面,3)文件系統支持多種格式,4)進程管理通過fork等系統調用實現,5)內存管理使用虛擬內存技術。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具