2017-09-16 6 views
0

Hallo Ich habe eine Frage ~ Ich möchte Nginx-Proxy verwenden, um Websocket-Verbindung zu anderen Port zu verteilen. so was .Ein Websocket über Nginx-Proxy?

Client ====> Proxy =====> ws Server

aber meine Frage ist das WebSocket-Tunnel ist auf dem Client und ws Server oder Client und Proxy und ws-Server aufzubauen.

Client === Proxy ==== ws Server

Oder

Client ===== ws Server

Dank ~~~

Antwort

1

Sie don Überspringen Sie den Proxy als solchen nicht. Der Proxy stellt die Verbindung für Sie her. Siehe unten stehenden Auszug aus https://www.nginx.com/blog/websocket-nginx/

A WebSocket Anwendung hält ein lang andauernde Verbindung offen zwischen dem Client und dem Server, um die Entwicklung von Echtzeit-Anwendungen zu erleichtern. Der HTTP-Aktualisierungsmechanismus zum Aktualisieren der Verbindung von HTTP zu WebSocket verwendet die Header Upgrade und Connection. Es gibt einige Probleme, die ein Reverse-Proxy-Server bei der Unterstützung von WebSocket bewältigen muss. Eine davon ist, dass WebSocket ein Hop-by-Hop-Protokoll ist. Wenn ein Proxy-Server eine Upgrade-Anforderung von einem Client abfängt, muss er eine eigene Upgrade-Anforderung an den Backend-Server senden, einschließlich der entsprechenden Header. Da WebSocket-Verbindungen im Gegensatz zu den typischen kurzlebigen Verbindungen, die von HTTP verwendet werden, langlebig sind, muss der Reverse-Proxy auch zulassen, dass diese Verbindungen geöffnet bleiben, anstatt sie zu schließen, da sie scheinbar inaktiv sind.

Bearbeiten-1 - Anschlüsse Vergleiche zwischen Nginx und direkter NodeJS

So endlich habe ich einige Tests sicher zu machen. mit http://IP/ in zwei Browserfenster gestartet eine socket.io App auf 3000 und nginx auf 80 zu übermitteln, um die Socket.io

Nginx

Wenn ich die App zugreifen zu beantragen, sind die offene Verbindung, wie unten

$ 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) 

Jetzt, nachdem sowohl die Tabs schließen

$ 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

Öffnen von zwei Browser-Registerkarten mit direkter Verbindung zu NodeJS http://<IP>:3000. Dann sind die Ergebnisse, wie unten

$ 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) 

Diese etwas seltsam aussehen, aber das ist, weil die verwendeten Verbindungen, die Website zu öffnen, auch am Leben für einige Sekunden gehalten. So nach dem Warten auf irgendwann

$ 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) 

Wie Sie nicht sehen können.der Verbindungen wird immer höher sein, wenn Sie Nginx verwenden

+0

danke ~ aber die Websocket-Tunnel durch den Proxy zu Client. Es bedeutet, dass der Nginx TCP öffnen sollte, um den Client und den WS-Server zu verbinden. Wenn ich 1000 Websocket-Verbindung habe, erzeugt das Nginx 1000 TCP. und wenn wir 2 ws server haben, bedeutet das, dass ein ws server 500 tcp erzeugt ??? Ist es richtig ? –

+0

Ich nehme ja an, aber ich habe jetzt kein sehr tiefes Verständnis dafür, um ein klares Ja zu sagen. –

+0

@MarkLin, siehe meine Bearbeitung –

Verwandte Themen