先把当时的情况摆出来。聊天功能上线后,用户反馈页面开着不动,大约一分钟后新消息就收不到了,刷新页面又能恢复,后端日志里连接是正常关闭的。

原因不止一个,得分开看。反向代理默认读超时偏短,空闲连接被主动关掉。也可能是没有透传升级请求头,长连接根本没有建立。

少数情况下是中间还有一层负载均衡同样设了超时限制。

第一件事是确认代理是否透传升级头

grep -n 'Upgrade|Connection' /etc/nginx/conf.d/site.conf

然后把读超时调到十分钟以上

proxy_read_timeout 600s;

再往下查看当前长连接数量

ss -tn state established '( sport = :8080 )' | wc -l

等前面都确认过,再重载配置并观察断连日志

systemctl reload nginx && tail -f /var/log/nginx/error.log

别只看报错消失,验证要多做一步。页面放置十分钟以上仍能实时收到消息,代理日志里不再出现上游超时的记录。

补一句。超时要两级一起改,负载均衡和后端服务各自的时间都不能比最外层短;心跳间隔也要小于超时时间,否则连接照样会被回收。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189