嗨,我有一個問題〜我想用nginx代理來分發websocket連接到其他端口。喜歡這個 。通過nginx代理的websocket?
客戶====>代理=====> WS服務器
但我的問題是WebSocket的隧道是建立在客戶端和WS服務器或客戶端和代理和WS服務器上。
客戶===代理==== WS服務器
或者
客戶===== WS服務器
謝謝~~~
嗨,我有一個問題〜我想用nginx代理來分發websocket連接到其他端口。喜歡這個 。通過nginx代理的websocket?
客戶====>代理=====> WS服務器
但我的問題是WebSocket的隧道是建立在客戶端和WS服務器或客戶端和代理和WS服務器上。
客戶===代理==== WS服務器
或者
客戶===== WS服務器
謝謝~~~
你不不要像這樣跳過代理。代理代表您進行連接。請參見下面的內容摘自https://www.nginx.com/blog/websocket-nginx/
一個WebSocket的應用程序保持一個長期運行的連接的客戶端和服務器之間的開放,有利於實時應用程序的開發。用於將連接從HTTP升級到WebSocket的HTTP升級機制使用升級和連接標頭。反向代理服務器在支持WebSocket時面臨一些挑戰。一種是WebSocket是逐跳協議,因此當代理服務器截獲來自客戶端的升級請求時,它需要將自己的升級請求發送到後端服務器,包括適當的標頭。另外,由於WebSocket連接的壽命很長,與HTTP使用的典型的短暫連接相反,反向代理需要允許這些連接保持打開狀態,而不是關閉它們,因爲它們看起來是空閒的。
編輯-1 - Nginx的和直接的NodeJS
之間的連接比較所以最後我做了一些測試,以確保。開始於3000和80 nginx的一個socket.io應用程序轉發請求到Socket.io
Nginx的
當我在兩個瀏覽器窗口訪問使用http://IP/應用,開放連接情況如下
$ lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 4443 vagrant 11u IPv6 25730 0t0 TCP *:3000 (LISTEN)
node 4443 vagrant 13u IPv6 28591 0t0 TCP localhost:3000->localhost:42698 (ESTABLISHED)
node 4443 vagrant 14u IPv6 28626 0t0 TCP localhost:3000->localhost:42712 (ESTABLISHED)
nginx 5144 vagrant 6u IPv4 28402 0t0 TCP *:http (LISTEN)
nginx 5144 vagrant 13u IPv4 28589 0t0 TCP 192.168.33.100:http->192.168.33.1:64799 (ESTABLISHED)
nginx 5144 vagrant 14u IPv4 28590 0t0 TCP localhost:42698->localhost:3000 (ESTABLISHED)
nginx 5144 vagrant 15u IPv4 28625 0t0 TCP localhost:42712->localhost:3000 (ESTABLISHED)
nginx 5144 vagrant 16u IPv4 28624 0t0 TCP 192.168.33.100:http->192.168.33.1:64826 (ESTABLISHED)
現在都關閉的選項卡後
$ lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 4443 vagrant 11u IPv6 25730 0t0 TCP *:3000 (LISTEN)
nginx 5144 vagrant 6u IPv4 28402 0t0 TCP *:http (LISTEN)
NodeJS
打開兩個瀏覽器選項卡,並直接連接到NodeJS http://<IP>:3000
。那麼結果如下
$ lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 4443 vagrant 11u IPv6 25730 0t0 TCP *:3000 (LISTEN)
node 4443 vagrant 13u IPv6 30014 0t0 TCP 192.168.33.100:3000->192.168.33.1:52550 (ESTABLISHED)
node 4443 vagrant 14u IPv6 30015 0t0 TCP 192.168.33.100:3000->192.168.33.1:52551 (ESTABLISHED)
node 4443 vagrant 15u IPv6 30016 0t0 TCP 192.168.33.100:3000->192.168.33.1:52552 (ESTABLISHED)
node 4443 vagrant 16u IPv6 30017 0t0 TCP 192.168.33.100:3000->192.168.33.1:52553 (ESTABLISHED)
node 4443 vagrant 17u IPv6 30018 0t0 TCP 192.168.33.100:3000->192.168.33.1:52554 (ESTABLISHED)
node 4443 vagrant 18u IPv6 30020 0t0 TCP 192.168.33.100:3000->192.168.33.1:52556 (ESTABLISHED)
node 4443 vagrant 19u IPv6 30024 0t0 TCP 192.168.33.100:3000->192.168.33.1:52578 (ESTABLISHED)
nginx 5144 vagrant 6u IPv4 28402 0t0 TCP *:http (LISTEN)
這看起來有點奇怪,但是這是因爲用於打開該網站的連接也保持存活幾秒鐘。所以等待一段時間後
$ lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 4443 vagrant 11u IPv6 25730 0t0 TCP *:3000 (LISTEN)
node 4443 vagrant 18u IPv6 30020 0t0 TCP 192.168.33.100:3000->192.168.33.1:52556 (ESTABLISHED)
node 4443 vagrant 19u IPv6 30024 0t0 TCP 192.168.33.100:3000->192.168.33.1:52578 (ESTABLISHED)
nginx 5144 vagrant 6u IPv4 28402 0t0 TCP *:http (LISTEN)
正如你所看到的沒有。當您使用Nginx
謝謝〜但websocket隧道通過代理傳遞給客戶端時,連接總是會更高。這意味着nginx應該打開tcp來連接客戶端和ws服務器。如果我有1000個websocket連接,nginx將創建1000個tcp。如果我們有2個Ws服務器,這意味着一個Ws服務器將創建500個TCP?這樣對嗎 ? –
我假設是的,但我現在對這個權利沒有很深入的理解來堅定地說出是的。 –
@MarkLin,請參閱我的編輯 –