Node.js Nginx代理+;NodeJS-WebSocket+&燃气轮机;17KB的消息。禁止通行。谁是罪魁祸首?

Node.js Nginx代理+;NodeJS-WebSocket+&燃气轮机;17KB的消息。禁止通行。谁是罪魁祸首?,node.js,go,nginx,websocket,buffer,Node.js,Go,Nginx,Websocket,Buffer,无法增加缓冲区宽度以避免丢弃帧 或 无法正确管理WS-fragmentation 总结 我的目标: GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server 一件非常简单的事情:让websocket隧道在每个隧道中传输至少2/3MB的数据。我需要发送目录结构,因此数据可以非常多 问题: GoLang app(Client) ---> :443 NGINX Proxy(Debian

无法增加缓冲区宽度以避免丢弃帧

无法正确管理WS-fragmentation


总结 我的目标:

GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
一件非常简单的事情:让websocket隧道在每个隧道中传输至少2/3MB的数据。我需要发送目录结构,因此数据可以非常多

问题:

GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
从A到B发送超过17KB的WebSocket消息会导致“通信丢失”或数据包丢失/丢失;连接/隧道仍然无法通过同一隧道从A到B发送新消息;相反,从B到A继续工作

我必须重新启动隧道才能恢复功能

这也可能是一个想法,即在达到阈值时重新启动隧道的数据包堆管理,但很明显,我需要一次发送超过阈值的数据包

信号路径:

GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
测试:

GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
  • 发送X条消息/每个1000字节的数据块|在第17个数据块之前收到消息,但未收到以下消息(见下文)
分析:

GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
  • Wiresharkon-Go应用程序显示所有数据包的流量
  • tcpdump,在Debian机器上,设置为侦听
    eth
    (公共),显示所有数据包的流
  • tcpdump,在Debian机器上,设置为侦听
    lo
    接口(用于rev代理扫描),显示所有数据包的流
  • NodeJS/fastfy-websocket
    ws.on('message',(msg)=>{console.log(msg)})
    显示到第17个区块
代码和配置:

GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server
GoLang应用程序相关部分

    websocket.DefaultDialer = &websocket.Dialer{
        Proxy:            http.ProxyFromEnvironment,
        HandshakeTimeout: 45 * time.Second,
        WriteBufferSize:  1000, //also tried with 2000, 5000, 10000, 11000
    }

    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)

    wsConn = c


    bufferChunk := 1000

    bufferSample := ""

    for j := 7; j <= bufferChunk; j++ {
        bufferSample = bufferSample + "0"
    }

    i := 1

    for {

        sendingBytes := i * bufferChunk
        fmt.Println(strconv.Itoa(sendingBytes) + " bytes sent")
        wsConn.WriteMessage(websocket.TextMessage, []byte(bufferSample))     

        i++
        time.Sleep(1000 * time.Millisecond)
    }
NodeJS代码:


//index.js

const config = require("./config.js");
const fastify = require('fastify')();
const WsController = require("./controller");

fastify.register(require('fastify-websocket'), {
  /*these options are the same as the native nodeJS WS*/
  options :{
    maxPayload: 10 * 1024 * 1024,
    maxReceivedFrameSize: 131072,
    maxReceivedMessageSize: 10 * 1024 * 1024,
    autoAcceptConnections: false
  }
});

fastify.ready(err => {
  if (err) throw err
  console.log("Server started")



  fastify.websocketServer
    .on("connection", WsController)

})


//controller.js
module.exports = (ws, req) => {
    ws.on("message", (msg) => {
        log("msg received"); //it is shown as long as the tunnel does not "fill" up to 17KB
    })

})

解决了的 更新fastfyfastfy websocket问题消失。真可惜

我通过创建一个新的云实例并从头开始安装所有东西,提出了这个解决方案

只需
npm更新


谢谢大家的支持

NGIX访问和错误日志文件中有什么?你有没有想过在中间没有NGIX的测试?“O.J.JONE什么都没有,只是<代码> *************************[[ 31 /OCT/2020:22:46:49 + 0100 ] ]当我关闭GO应用程序时,获取/终端HTTP / 1.1“101”63“-”“去HTTP客户机/1.1”< /C>在访问日志上。错误日志为clean@DanielFarrell嗯,我考虑过了。但实际上,真正的问题似乎(我说似乎)是NodeJS,在
lo
接口上看到了tcpdump的结果。数据包正确地通过NGINX,正如我在NGINX节点之后看到的那样。我必须使用chromews客户端进行测试,因为在NodeJS的上下文中,我担心源代码中的错误碎片可能是问题的根源。我会尽量让你know@DanielFarrellChromeWS客户端已测试。总是一样的。