socketio连接失败,nginx返回502 connect failed (111: Connection refused)问题解决

问题现象

  • 我们的信控平台,需要实时展示交通信号机的实时灯态(红黄绿、通行进口流向、倒计时等)

  • 现在的信号机,大多都支持国标2007协议或者2017协议,来实现硬件设备与其他平台的通信,主要是通过socket传递消息报文

  • 当灯态变化时,路口前端的信号机设备,会通过socket协议将消息推送给我们的通信服务程序,通信服务将消息解析处理后,关联路口渠化等信息,处理包装后,再把信息通过socket广播推送给浏览器,前端代码使用websocket接收

  • 当用户访问平台时,打开首页,就一直会接收到灯态推送。接收到推送时,前端代码会把灯态信息在界面上实时渲染出来,这样客户就可以实时查看灯态、通行流向、倒计时等

  • 某次平台更新部署后,发现界面上的倒计时没有了,查看了下通信服和网络,没发现问题。又去检查了下数据库里存储的灯态数据,发现数据库里的数据也是对的

  • 按下F12键,打开浏览器的开发者模式,筛选“socket.io”,重新刷新页面,发现socket消息接收502了(很难复现,没有当时的截图,截了个正常的)
    在这里插入图片描述

  • 查看nginx日志,发现报错如下(部分):

"GET /socket.io/ HTTP/1.1" 502 559 [error] 24#24: *1 connect() failed (111: Connection refused) while connecting to upstream
2023/06/26 13:50:12 [error] 24#24: *1839 connect() failed (111: Connection refused) while connecting to upstream, client: 172.16.1.96, server: 172.16.1.100, request: "GET /socket.io/?EIO=3&transport=polling&t=OZsGAi0 HTTP/1.1", upstream: "http://172.18.0.12:7754/socket.io/?EIO=3&transport=polling&t=OZsGAi0", host: "172.16.1.100", referrer: "http://172.16.1.100/main/live-view/map"

排查

  • 我们使用nginx作为web服务器,前端界面和一些请求的访问都通过nginx
  • 我们的nginx是使用docker部署的,它在docker-compose.yml里配置如下:
  # nginx服务,静态文件访问和反向代理
  nginx:
    image: nginx:1.20.2
    container_name: nginx
    ports:
      - 80:80 #信控前端
    depends_on:
      - gateway-app
      - data-center-app
    volumes:
      - ./volumes/nginx-html:/usr/share/nginx/html
      - ./volumes/nginx-config:/etc/nginx/conf.d
      - /etc/localtime:/etc/localtime
    environment:
      - TZ=Asia/Shanghai
    restart: always
  • 根据报错信息搜索了一堆,对照着查看和处理没什么效果,下面是其中一个处理方式:
  • 这个错误通常是因为Nginx无法连接到后端的upstream服务。可能的原因包括:
  1. upstream服务挂掉了或未启动
  2. 防火墙阻止了Nginx连接upstream服务
  3. upstream服务的IP地址或端口号配置错误
  4. upstream服务只监听了本地地址(如127.0.0.1),而Nginx尝试连接外部地址
  • 解决方法也主要是针对以上排查,主要排查了下网络,没发现问题
  1. 确认upstream服务是否正常运行,尝试手动连接upstream服务;
  2. 检查防火墙设置,确保允许Nginx连接upstream服务;
  3. 检查Nginx配置文件中upstream服务的IP地址或端口号是否正确;
  4. 如果upstream服务只监听了本地地址,需要使用IP转发或者配置upstream服务监听所有地址。

解决

  • 检查了网络没问题,代码也没相关变动,就试着把nginx 重启了一下,结果发现,重启后恢复正常了!!!
  • 正常推送,日志如下:
172.16.1.96 - - [26/Jun/2023:13:51:33 +0800] "GET /socket.io/?EIO=3&transport=polling&t=OZsGUNW&sid=a8726ad4-a4f8-420f-8ffe-e27ff82c6a69 HTTP/1.1" 200 42 "http://172.16.1.100/main/live-view/map" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "-" 
  • 这个是偶发现象,后续部署更新平台时,偶尔会出现,但不是必现,很难重现。后续也观察了下,没有重启部署操作时,一次也没出过此问题,一直正常
  • 最后总结规律发现,偶尔出现的时候,是因为应该服务重新部署了,nginx没有重启。但是也有一起使用docker-compose up重启的,这时候怀疑和启动顺序有关系
  • 后续改进了部署更新的shell脚本,部署其他服务结束后几秒,再重启一下nginx服务
  • 然后部署完成后,再检查一下平台信号机状态是否已经上报,没有则重启一下服务器
docker-compose --compatibility up -d
sleep 30s
docker restart nginx
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚持是一种态度

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值