首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Nginx代理+ NodeJS WebSocket +>17消息。没有交通。谁是罪魁祸首

Nginx代理+ NodeJS WebSocket +>17消息。没有交通。谁是罪魁祸首
EN

Stack Overflow用户
提问于 2020-10-31 16:33:37
回答 1查看 208关注 0票数 0

不可能增加缓冲区宽度以避免帧丢失

无法正确管理WS碎片

摘要

我的目标:

一个非常简单的事情:有websocket隧道传输至少2/3MB的数据每个隧道。我需要发送目录结构,因此数据可以非常多。

问题:

从A发送到B的超过17 to的WebSocket消息会导致“通信丢失”或数据包丢失/丢失;连接/隧道仍然无法在同一隧道(从A到B)上发送新消息;相反,从B到A继续工作。

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

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

“信号路径”:

代码语言:javascript
运行
复制
GoLang app(Client) ---> :443 NGINX Proxy(Debian) ---> :8050 NodeJS WS Server

测试:

发送每条1000字节的X消息/块的

  • 最多接收到第17块,下面的消息未接收(见下文)

分析:

  • Wireshark on Go应用程序显示Debian机器上所有packets
  • tcpdump,的流,设置为eth (公共),显示Debian机器上所有packets
  • tcpdump,的流,在lo接口上设置为侦听(用于rev代理扫描),显示所有packets
  • NodeJS/fastify-websocket ws.on('message', (msg)=>{console.log(msg)})的流显示到第17块

代码& Config:

GoLang应用相关部分

代码语言:javascript
运行
复制
    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)
    }

NGINX conf:

代码语言:javascript
运行
复制
upstream backend {
    server 127.0.0.1:8050;
}
server {
    server_name my.domain.com;
    
        large_client_header_buffers 8 32k;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        
        proxy_buffers 8 2m;
        proxy_buffer_size 10m;
        proxy_busy_buffers_size 10m;
        proxy_pass http://backend;
        proxy_redirect off;
        #proxy_buffering off; ### ON/OFF IT'S THE SAME 
        
        # enables WS support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade"; ### "upgrade" it's the same
    }
    
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/my.domain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/my.domain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = my.domain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
    server_name my.domain.com;
    listen 80;
    return 404; # managed by Certbot
}

NodeJS代码:

代码语言:javascript
运行
复制
//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
    })

})
EN

Stack Overflow用户

回答已采纳

发布于 2020-11-01 17:14:59

解出

更新了fastify-websocket,问题消失了。太遗憾了!

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

只有npm update

谢谢大家的支持

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64624023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档