2017-09-16 179 views
0

嗨,我有一個問題〜我想用nginx代理來分發websocket連接到其他端口。喜歡這個 。通過nginx代理的websocket?

客戶====>代理=====> WS服務器

但我的問題是WebSocket的隧道是建立在客戶端和WS服務器或客戶端和代理和WS服務器上。

客戶===代理==== WS服務器

或者

客戶===== WS服務器

謝謝~~~

回答

1

你不不要像這樣跳過代理。代理代表您進行連接。請參見下面的內容摘自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

+0

謝謝〜但websocket隧道通過代理傳遞給客戶端時,連接總是會更高。這意味着nginx應該打開tcp來連接客戶端和ws服務器。如果我有1000個websocket連接,nginx將創建1000個tcp。如果我們有2個Ws服務器,這意味着一個Ws服務器將創建500個TCP?這樣對嗎 ? –

+0

我假設是的,但我現在對這個權利沒有很深入的理解來堅定地說出是的。 –

+0

@MarkLin,請參閱我的編輯 –