天堂的魔鬼( ˙-˙ ) 2026-01-01 11:57 采纳率: 0%
浏览 6

关于Websocket连接50s自动断开的问题

Websocket连接50s自动断开的问题

在本地跑正常,在一个服务器上跑出现这个问题,具体的情况是:前后端websocket连接50s左右后出现关闭,重新连接仍可连上,此外发现后端的消息前端能收到,但是前端的消息后端收不到。

前端日志:
WebSocket连接关闭: 1006
WebSocket连接断开
WebSocket重连尝试 1/5
WebSocket连接成功

服务器只配置了80端口,但是上层应该有一个转发,可以使用https访问,本地的相关配置如下:

    location ^~ /ws {
        add_header X-Debug-Upgrade $http_upgrade;
        proxy_pass http://127.0.0.1:50008/ws;     # daphne (ASGI) 端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade "websocket";
        proxy_set_header Connection "upgrade";

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_buffering off; # 关闭缓冲,WebSocket需要实时传输
        tcp_nopush on;
        tcp_nodelay on; 

        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }

注:一开始出现前端尝试连接后端,后端立马连接上了,但是前端显示在等待,然后50s左右后,前端显示连接成功立即断开,后端显示断开的情况,把本地的nginx取消缓冲解决,但是仍有目前的问题。

  • 写回答

4条回答 默认 最新

  • 关注
    1. 1006错误+50s断开:核心是上层转发/防火墙的空闲超时
      你本地Nginx配了proxy_read_timeout,但服务器上层大概率有负载均衡/网关(比如云SLB、公司防火墙),默认超时就是50s,直接砍了TCP连接。先去改上层的空闲超时配置,设成300s以上,比改Nginx管用。

    2. Nginx配置补两个关键坑

      • 别硬编码Connection "upgrade",加个map动态处理(不然非ws请求会出问题);
      • X-Forwarded-Proto改成$scheme,自动适配http/https,避免转发层篡改头信息。
        改完重启Nginx。
    3. 前端消息后端收不到:双向通信没通

      • 前端连的时候必须用wss://(对应https),别写死ws://,不然会被转发层拦截;
      • onopen触发后再发消息,别连接没建好就发;
      • 后端看一下Daphne是不是监听0.0.0.0,别只绑127.0.0.1,不然收不到外部请求。
    4. 兜底:加心跳
      前端每30s发个ping包(比50s短),后端收到回个pong,让连接一直有流量,就不会被判定空闲断开了。

    最后验证:看Nginx日志里ws握手的响应码是不是101,服务器netstat看50008端口是不是ESTABLISHED状态。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月1日