nginx将websocketapi数据视为http请求

nginx将websocketapi数据视为http请求,nginx,Nginx,我正在尝试使用AWS Lightsail为使用NGINX和node.js的API设置反向代理,但NGINX似乎没有正确处理web套接字连接的初始设置 当我查看access.log/error.log文件时,我可以看到 1.没有错误 2.我通过连接发送的JSON格式的数据在access.log文件中是可见的,我认为不应该在那里显示 乍一看,nginx似乎正试图像处理HTTP请求一样处理我的数据 使用node的net模块,我在客户端应用程序上收到这个响应,表明出现了问题,如果我们假设nginx试图将

我正在尝试使用AWS Lightsail为使用NGINX和node.js的API设置反向代理,但NGINX似乎没有正确处理web套接字连接的初始设置

当我查看access.log/error.log文件时,我可以看到 1.没有错误 2.我通过连接发送的JSON格式的数据在access.log文件中是可见的,我认为不应该在那里显示

乍一看,nginx似乎正试图像处理HTTP请求一样处理我的数据

使用node的net模块,我在客户端应用程序上收到这个响应,表明出现了问题,如果我们假设nginx试图将我的API数据(JSON)作为http请求处理,这是有意义的

Received: HTTP/1.1 400 Bad Request
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 06 Oct 2019 15:59:58 GMT
Content-Type: text/html
Content-Length: 182
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.14.0 (Ubuntu)</center>
</body>
</html>
我已经确认,当我打开端口4000(node.js正在侦听的端口)时,API可以工作。当我切换回端口80时,客户端连接回调函数启动。这至少表面上表明初始连接已经发生。从那以后,一切都停止了


编辑:我很抱歉,在wireshark中找不到任何对初始http请求的引用,fiddler似乎也没有从我的客户端节点进程中检测到任何请求。

我的问题是我使用的是节点套接字模块,它没有实现web套接字。相反,这为简单的TCP而不是web套接字创建了一个接口。这是非常重要的,因为这两件事是非常不同的。TCP的运行级别基本上低于HTTP,当然也远低于web套接字,web套接字最初是HTTP连接,经过升级后可创建web套接字连接

这可能会让人非常困惑,因为当您在本地主机上工作时,这些TCP连接似乎会完全满足您的需要。当您尝试在Nginx或Apache中设置反向代理或类似的东西时,问题就开始了。这两种协议都不是为了在TCP级别上使用,而是在HTTP域中操作。简单地说,尝试在反向代理中使用TCP套接字只会带来挫折,就我所知,在Apache和Nginx环境中实际上是不可能的


如果您正在寻找web套接字的实现,请查看NPM上的
WS
(web套接字的缩写)模块,这正是我实际需要的。

web套接字连接从HTTP请求开始。您的客户端正在抛出错误,不是因为它收到了意外数据,而是因为服务器给了它一个
400
,而不是处理到web套接字连接的升级请求。在任何情况下,您能否显示导致上面显示的响应的完整请求数据?不幸的是,我在实际查看流量时遇到了问题。如果我能看到它,我一定会提供请求。
 server {

        listen 80;
        server_name xx.xxx.xxx.xx;
        location / {
            proxy_pass http://localhost:4000;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header Upgrade upgrade;
            proxy_set_header Connection upgrade;
        }

}