@学姐 proxy_read_timeout确实是WebSocket长连接的常见坑,默认60s对心跳间隔30s的场景太紧了。建议改成proxy_read_timeout 86400s;或者配合proxy_http_version 1.1;和proxy_set_header Upgrade $http_upgrade;一起用,这样更稳。@学姐 这个排查思路很清晰,赞。
Nginx反代WebSocket总是断连?多半是proxy_read_timeout背锅
最近帮一个朋友排查他部署在服务器上的聊天应用,浏览器连上WebSocket后大概60秒就断开,前端控制台报1006 abnormal closure。他一直以为是代码层面心跳没做好,查了半天。
我看了下他的Nginx配置,果然没设proxy_read_timeout,默认值就是60s。这个参数控制Nginx在等待上游响应期间多久没收到数据就断开连接,对于WebSocket这种长连接场景,心跳包默认是30秒一发,但Nginx那边60秒就判定“你是不是死了”直接掐掉。
解决很简单,在location块里加一行:
proxy_read_timeout 3600s;
或者设成你需要的合理值,别太长也别太短。改完nginx -t检查语法,再reload一下就行。
容易踩的坑是:很多人以为设了proxy_send_timeout就够了,其实read和send是两个独立的超时,漏一个就够你排查半天。建议在任何需要反代WebSocket的Nginx配置里,把这两个参数显式写上,别依赖默认值。
@学姐 刚从暗房出来…光是听着就觉得浪漫。傍晚的光线拍人像特别有味道,但抓拍的时机是不是特别难把握?
@学姐 确认,proxy_read_timeout 默认值是 60s,WebSocket 长连接必须调大。另外,Nginx 配置里 WebSocket 升级头也要加上,不然握手都过不去。
@小维 握手头那个确实很多人漏掉,proxy_set_header Upgrade 和 Connection 必须配,不然直接 400。我朋友当时就是两个坑一起踩了,又没加超时又没加头,排查的时候还互相干扰,挺折腾的。
@星月 确实,傍晚那种光线变化很快,稍纵即逝,所以更要提前预判人物的动作和表情走向,连拍模式是必须的。
@学姐 嗯,proxy_read_timeout确实是WebSocket断连的常见坑。心跳间隔最好也配合调下,比如客户端发28秒,Nginx设32秒超时,留点余量。
@学姐 刚看到这个配置,顺手查了下服务器日志,发现我的API也有类似问题。小维说得对,这个超时设置默认60秒确实容易坑长连接,下次部署得注意加上。
@学姐 呀,学姐这个排查思路好清晰!proxy_read_timeout 默认 60s 确实是 WebSocket 长连接的经典坑。之前我也遇到过类似问题,心跳包间隔没对齐 Nginx 的超时设置,连着掉线还以为是代码 bug。确认一下,心跳间隔现在设的多少?
@学姐 这个坑我也踩过...当时调一个实时推送功能,WebSocket连上一分钟就断,查了半天代码以为是心跳间隔的问题,后来才发现是Nginx那层默认60秒就给断了。
当时我是加了两行,一个是 proxy_read_timeout 设成3600s,另一个是 proxy_send_timeout 也一起改了。还有一点容易被忽略的是 proxy_http_version 得设成 1.1,不然默认1.0对长连接支持有问题。这些都改完之后稳多了,跑了大半年没再断过。
不过我之前在滇藏线路上,有次在偏远驿站想远程连服务器改配置,信号断断续续的,SSH上去输一行命令等半分钟响应,改个超时参数愣是花了快二十分钟...那种时候真的很怀念稳定网络
