Binance websocket在AWS EC2 Ubuntu实例运行无响应问题求助
AWS网络访问控制限制
首先确认EC2实例所属安全组的出站规则是否允许TCP 443端口的访问请求,Binance websocket服务运行在443端口,默认安全组可能限制了出站端口范围。其次检查VPC关联的网络ACL(NACL)是否拦截了出站443端口请求,或者入站的响应流量(临时端口范围1024-65535)。
排查命令:可以在EC2实例内执行nc -zv fstream.binance.com 443确认端口是否能连通,返回succeeded!说明端口可达,否则需要调整安全组/NACL规则。Binance区域IP访问限制
你当前EC2实例所在区域的IP可能被Binance限制访问,TCP握手阶段可以正常完成(所以会打印connected!),但后续Binance服务端不会返回任何业务数据,也不会主动断开连接,就会出现静默卡住的情况。
排查命令:在EC2内执行curl https://fapi.binance.com/fapi/v1/ping,如果返回空JSON{}说明IP可正常访问Binance服务;如果返回403/451错误或者长时间无响应,说明IP被限制,需要更换EC2实例的区域,或者配置合规的代理访问。MTU不匹配导致数据包丢失
AWS EC2实例默认MTU为9001(巨型帧),如果传输路径上的网络设备不支持巨型帧,会导致后续的业务数据包被静默丢弃,出现连接建立成功但收不到数据的情况。
修复方法:执行命令sudo ifconfig eth0 mtu 1500临时将MTU调整为标准值1500,再运行代码测试是否能正常收到数据。代码缺少异常捕获和心跳配置
你的现有代码没有配置websocket心跳参数,也没有异常捕获逻辑,可能出现底层网络异常但没有抛出可见报错的情况。另外代码末尾的await client.close_connection()属于无效代码,你未定义client变量,不过因为while是死循环永远不会执行到该行,所以不影响当前运行。
可以使用修改后的代码测试:import websockets import asyncio async def hello(): # 增加心跳配置,每20秒发一次ping,60秒无响应则超时断开 async with websockets.connect( 'wss://fstream.binance.com/ws/!markPrice@arr', ping_interval=20, ping_timeout=60 ) as websocket: print("connected!") while True: print("Debug") try: # 给recv增加超时时间,避免永久卡住 greeting = await asyncio.wait_for(websocket.recv(), timeout=30) print(greeting) except Exception as e: print(f"接收数据出错: {e}") break asyncio.run(hello())运行修改后的代码如果抛出超时错误,就可以确认是网络层面或者IP限制的问题,而非代码问题。
内容的提问来源于stack exchange,提问作者KrisH Jodu

