Python中使用nginx代理WebSocket时经常出现消息延迟,请问可能是什么原因?

个人的 nginx 配置如下:

upstream websocket {
    server 127.0.0.1:10300;
    server 127.0.0.1:10301;
    server 127.0.0.1:10302;
  }

server { listen 80; client_max_body_size 4G; access_log /home/work/logs/nginx_access.log; error_log /home/work/logs/nginx_error.log; # 域名 server_name www.example.com;

add_header X-UA-Compatible “IE=edge,chrome=1”; # IE 用最新内核渲染页面

location / { proxy_pass http://websocket; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “Upgrade”;

    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_redirect default;
    add_header "Access-Control-Allow-Origin" "*";
    add_header "Access-Control-Allow-Credentials" "true";
    add_header "Access-Control-Allow-Headers" "X-Requested-With";
    }

}


Python中使用nginx代理WebSocket时经常出现消息延迟,请问可能是什么原因?

2 回复

WebSocket消息延迟通常和Nginx的缓冲区配置有关。默认的proxy_buffering对WebSocket不友好,得关掉。另外超时设置不够大会导致连接过早断开。

核心配置修改:

location /ws/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    
    # 关键配置
    proxy_buffering off;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
    
    # 可选的缓冲区调整
    proxy_buffer_size 4k;
    proxy_buffers 4 4k;
}

主要改这几点:

  1. proxy_buffering off - 禁用缓冲,消息直接转发
  2. 超时设到3600秒,避免心跳间隔导致断开
  3. 用1.1协议和正确的Upgrade头

检查Nginx日志看有没有超时或缓冲相关的错误。如果用了负载均衡,确保所有节点配置一致。

总结:关缓冲、调超时。


对 Nginx 不精通,
两个建议
1. 有可能是缓存, 配置文件还有从别的地方导入的,你上面没贴出缓存相关的配置。
2. 尝试使用最新版本或者稳定版本的 Nginx。

回到顶部