通过nginx代理的websocket?

时间:2017-09-16 13:22:03

标签: nginx websocket

您好我有问题〜我想使用nginx代理将websocket connect分配给其他端口。像这样。

  

客户====> proxy =====> ws服务器

但我的问题是websocket隧道是在客户端和ws服务器或客户端以及代理和ws服务器上构建的。

  

客户端=== proxy ==== ws server

     

或者

     

客户端===== ws服务器

谢谢~~~

1 个答案:

答案 0 :(得分:1)

您不能跳过代理。代理代表您建立连接。请参阅以下https://www.nginx.com/blog/websocket-nginx/

的摘录
  

WebSocket应用程序在客户端和服务器之间保持长时间运行的连接,从而促进实时应用程序的开发。用于将连接从HTTP升级到WebSocket的HTTP升级机制使用升级和连接标头。逆向代理服务器在支持WebSocket时面临一些挑战。一个是WebSocket是逐跳协议,因此当代理服务器拦截来自客户端的升级请求时,它需要将自己的升级请求发送到后端服务器,包括适当的头。此外,由于WebSocket连接存在很长时间,与HTTP使用的典型短期连接相反,反向代理需要允许这些连接保持打开状态,而不是关闭它们,因为它们似乎处于空闲状态。

编辑-1 - Nginx与直接NodeJS之间的连接比较

所以最后我做了一些测试以确保。在3000上启动了socket.io应用程序,在80上启动了nginx以转发请求到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

时,连接总是会更高