返回

一个“反人类”解析记录变更需求的实现

需求

说是“反人类”其实有点标题党了,那么这里列一下具体的需求吧

  • 应用服务器全部在国内某云
  • 通过Nginx反向代理这些应用
  • Nginx放在非大陆的服务器
  • 非大陆服务器与某云的服务器通讯不同时间段通讯质量不一
  • 非大陆服务器某种程序上可能还存在受到长城防火墙的干扰

由于上面最后两点的原因,所以还要做的一个就是

  • 非大陆服务器选两个不同机房(线路)服务器

最后就是: 域名的A记录只指向一个IP,也就是说只有一台服务器对外工作。 当前域名指向的IP所在的服务器一旦发生故障,需要及时更新A记录到另外的线路节点上去。

当然,最坏的情况就是非大陆的服务器全部故障了,还是要把线路切换到某云上来。 还有,切到某云后要在一定时间后再次切换线路出去。

听着可能有点一头雾水的样子….说白了就是要实时根据连接好坏,如果连接情况差就自动切换线路。

那么就用shell写一个吧。

简要说明

依赖服务

目标

  • 根据站点当前的超时状况自动更新记录的解析值
  • 连连超时微信通知
  • 更新记录微信通知结果

实现

TIME_INTERVAL() 函数对上次更新解析记录做间隔判断,切换到最稳定线路后至少1小时后方可再更新解析记录。 TIME_OUT() 函数对监控的服务器进行超时检测,当连续3次超过7秒没有收到其回应认定访问超时。 UPDATE_DNS_1() 脚本

curl -X PUT "https://api.cloudflare.com/client/v4/zones/462fcdeaab0f3e9c4d90d5c06c722dee/dns_records/a2ac6dbb488378c116e4c12989c02b20" \
-H "X-Auth-Email: [email protected]" \
-H "X-Auth-Key: dc70e6beb51a4947bbc2fb7c5312701a26da3" \
-H "Content-Type: application/json" \
--data '{"type":"A","name":"lvmoo.com","content":"3.3.3.3","ttl":1,"proxied":false}

作用:用于更新解析记录 可以参照Cloudflare官方API进行设置。 脚本

curl https://pushbear.ftqq.com/sub --data 'sendkey=3920-fec0e0ffc173ae055c227f65c3748a08&text='$text2'&desp='$desp2''  --compressed

作用:微信通知

举个栗子

我把代码贴到Github

总之,不会再有人会遇到这样的需求吧😓

Licensed under CC BY-NC-SA 4.0
最后更新于 May 08, 2019 16:47 UTC