为什么要使用nginx作为WebSocket代理?

7
所以我一直在研究这种服务器设置,其中Nginx用作反向代理,使其服务静态内容,同时允许节点执行动态操作。我的问题是,为什么有人想使用nginx前端作为反向代理到websocket?如果nginx提供静态内容(HTML,CSS,JS,媒体等),那么提供的JS文件是否可以直接使用节点JS服务器上正在侦听的IP地址和端口连接服务器?为什么要通过nginx连接到服务器上的websocket?或者我没有清楚地理解这种情况?谢谢!

你可以获得nginx的安全模型。例如,你在主站点上设置的任何IP地址/引荐限制也将适用于WebSocket。 - Marc B
您应该阅读这篇文章...https://dev59.com/eXVC5IYBdhLWcg3wpS7g - JClarke
@Jclarke 对于使用“代理”一词我感到抱歉,我已经编辑了我的问题,改用“反向代理”一词。然而,我的问题仍然存在。 - TheMAAAN
1
我能想到的唯一原因是负载均衡...但如果您没有使用多个Node.js服务器呢?除了@MarcB指出的原因外,仍然有使用Nginx作为WebSocket连接的反向代理的必要吗? - TheMAAAN
2个回答

6
WebSocket应用程序在客户端和服务器之间保持长时间运行的连接,促进了实时应用程序的开发。将连接从HTTP升级到WebSocket所使用的HTTP Upgrade机制使用Upgrade和Connection头。反向代理服务器在支持WebSocket方面面临着一些挑战。其中一个问题是WebSocket是一种逐跳协议,因此当代理服务器拦截来自客户端的升级请求时,它需要向后端服务器发送自己的升级请求,包括适当的头信息。此外,由于WebSocket连接是长期存在的,而不是HTTP使用的典型短期连接,因此反向代理需要允许这些连接保持打开状态,而不是因为它们似乎处于空闲状态而关闭它们。
NGINX通过允许在客户端和后端服务器之间建立隧道来支持WebSocket。为了使NGINX将客户端的Upgrade请求发送到后端服务器,必须显式设置Upgrade和Connection头,如以下示例所示:
location /wsapp/ {
    proxy_pass http://wsbackend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

一旦完成此操作,NGINX 将处理它作为 WebSocket 连接。
欲了解更多详细信息,请访问:- https://www.nginx.com/blog/websocket-nginx/ https://blog.martinfjordvald.com/2013/02/websockets-in-nginx/ 希望这有所帮助!

6
您已经解释了“如何”,但我想知道“为什么”。在不必经过Nginx的情况下直接引用nodejs服务器的IP地址和端口,为什么要使用Nginx作为反向代理?因此,您将使用Nginx来提供所有静态内容,但当静态内容(例如js文件)需要与node通信时,它只需直接设置websocket连接即可。您明白我的观点吗? - TheMAAAN
使用nginx的一个原因是代理传递,您可以使用它来保护您的API,您可以将API暴露或显示给前端不同的API,然后通过proxypass将其重定向到另一个API,实际的API名称由您给出,这将保护您的代码。其次,您可以轻松地使用nginx一步完成gzip压缩和最小化,并提高您的网站排名。您还可以使用nginx索引您的图像和文件。您还可以将nginx用作流媒体服务器。 - Parveen yadav
1
如果直接连接,你将无法使用这些功能(除非你自己编程实现它们)。如果Nginx和Node.js进程在同一台机器上,你仍然能够利用你所列出的功能吗? - TheMAAAN
当然会,因为仅仅使用不同的机器并不能保护您的API,您还可以给在同一台机器上的API取不同的名称,这样没有人会知道API的实际名称,这也是一个要点。例如,您可以将任何公开的API命名为:api/v1/test,并通过nginx代理此API到实际的API,即api/v1/server/actual。因此,在这里,您只公开了一个名称test,实际上它并不存在。 - Parveen yadav

1

我能想到的一个原因是,Nginx 提供更多的灵活性和自定义功能,比如负载均衡、速率限制等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接