IIS部署Flask-Socket.IO出现WebSocket建立连接前断开错误如何解决
可行解决方案
1. 核心问题根因
WFastCGI本身仅支持短生命周期的普通HTTP请求,无法承载WebSocket全双工长连接,所以无论怎么调整IIS WebSocket配置和Flask侧参数,只要Socket.IO请求走WFastCGI链路就必然会断开。
2. 具体解决步骤
- 第一步:拆分应用运行链路,Socket.IO相关请求不再走WFastCGI
编写独立启动脚本,用eventlet直接运行Flask应用,作为本地后端服务:
可以用NSSM工具将该启动脚本注册为Windows系统服务,实现开机自启、后台稳定运行。import eventlet eventlet.monkey_patch() # 替换为你自己的app实例和socketio实例 from your_app import app, socketio if __name__ == '__main__': socketio.run(app, host='127.0.0.1', port=5000, debug=False) - 第二步:配置IIS反向代理转发Socket.IO请求
先为IIS安装ARR(Application Request Routing)和URL Rewrite模块,开启ARR代理功能,将响应缓冲阈值设为0避免长连接被阻塞。
在站点的web.config中添加重定向规则,将所有socket.io路径的请求转发到本地启动的eventlet服务:<rule name="SocketIO_Proxy" stopProcessing="true"> <match url="socket.io/(.*)" /> <action type="Rewrite" url="http://127.0.0.1:5000/socket.io/{R:1}" /> <!-- 站点用HTTPS的话添加下面的配置,HTTP可忽略 --> <serverVariables> <set name="HTTP_X_FORWARDED_PROTO" value="https" /> </serverVariables> </rule> - 第三步:调整Socket.IO初始化适配配置
socketio.init_app( app, # 生产环境替换为实际业务域名,禁止使用* cors_allowed_origins="*", async_mode="eventlet", # 排查问题时开启日志,稳定运行后可关闭 engineio_logger=False, logger=False ) - 第四步:优化IIS长连接配置
保持IIS的WebSocket Protocol功能为开启状态,将站点socket.io路径的请求超时时间调整为3600秒以上,避免空闲长连接被主动断开。
客户端连接时指定传输优先级,优先使用WebSocket:const socket = io({ transports: ["websocket", "polling"] })
内容的提问来源于stack exchange,提问作者lc-51
相关产品推荐
相关产品推荐

