Nginx代理SignalR/WebSocket时出现连接异常及503错误的排查求助
各位好!最近碰到个棘手的问题,想请有经验的大佬帮忙分析下:我们有个打印应用跑在Nginx反向代理后面,自从迁移到一台装了新版本Nginx的代理服务器后,客户断断续续反馈两类异常,我对比了应用日志和Nginx日志,发现异常和日志里的请求是对应的,先把细节贴出来:
客户侧遇到的异常信息
第一个是WebSocket连接关闭时的异常:
System.Net.WebSockets.WebSocketException (0x80004005): The remote party closed the WebSocket connection without completing the close handshake.
at Domain.Printing.Service.Library.SignalRClient.Execute()
第二个是连接失败的503服务不可用异常:
System.Net.WebSockets.WebSocketException (0x80004005): Unable to connect to the remote server ---> System.Net.WebException: The remote server returned an error: (503) Server Unavailable.
对应时间点的应用日志记录
2024-06-17 08:58:08 10.24.11.16 POST /printing/SignalR/signalr/abort clientProtocol=2.1&transport=webSockets&connectionData=[%7B%22Name%22:%22IntegratedPrintingHub%22%7D]&connectionToken=mLUYvm 80 - 10.24.11.15 SignalR.Client.NetStandard/2.4.1.0+(Microsoft+Windows+NT+6.2.9200.0) - 200 0 0 0
Nginx错误日志片段(与应用日志时间点对应,内容截断)
2024/06/17 08:58:08 [error] ... upstream prematurely closed connection while reading response header from upstream, client: 10.24.11.15, request: "POST /printing/SignalR/signalr/abort?clientProtocol=2.1&transport=webSockets&connectionData=[%7B%22Name%22:%22IntegratedPrintingHub%22%7D]&connectionToken=mLUYvm HTTP/1.1"
我自己核对了时间线,异常出现的时间和日志里的abort请求完全对上了。之前在旧的Nginx代理服务器上从来没遇到过这类问题,换成新版本Nginx后才断断续续出现,所以我怀疑是新版本Nginx的默认配置变化或者和SignalR/WebSocket的兼容性问题。
想请教各位大佬几个问题:
- 有没有遇到过新版本Nginx代理SignalR时出现这类WebSocket连接异常和503的情况?
- 从现有日志来看,我应该优先排查哪些Nginx配置项?比如WebSocket的超时设置、代理缓冲、连接池大小这些?
- 应用日志里abort请求返回了200,但Nginx却报上游连接提前关闭,这种情况有没有什么调试或者排查的方向?
麻烦各位帮忙出出主意,实在是头疼这个间歇性的问题,谢谢大家了!
备注:内容来源于stack exchange,提问作者Rickard Olsson

