日前,我司在官网服务器前增加了一个前置网关。起因是央行通知我司必须在12月31前完成官网从IPv4到IPv6的升级,然而由于历史遗留原因,官网服务器上有多个服务组件直接使用IPv4地址(而不是域名)相互调用,如果贸然升级到IPv6,必然影响组件运行。综上,经过技术部研究决定,在官网服务器前增加一个IPv6前置网关,将官网域名的DNS映射到这个网关,再由这个网关转发所有的request和response到官网服务器,官网服务器的原IPv4地址保持不变。这样的话,既支持了IPv6,又兼容了IPv4。
然而在实际操作中遇到了问题。由于前置IPv6网关和官网服务器是由两家第三方公司提供的服务(两次招投标,不同的公司中标),而两家公司在沟通中出现失误,导致前置网关的部分出网IP被官网服务器误认为是DDOS攻击者、阻止其访问,导致我司官网偶发的出现502 bad gateway页面。因此,在督促两家公司加快沟通的同时,作为甲方的我司也写了一个简易的Python定时脚本用于检测官网是否出现故障。原理很简单:每隔5分钟,访问一次官网,看页面是否正常。
选择Python的原因无非是写起来快,而且正好我上星期刚开始学Python,正好拿这个练练手。程序逻辑非常直白,调用的都是Python内置函数,也没有什么高深的算法,纯粹是新手入门。代码贴出来就当是给自己写个日记,记录一下这是我写的第一个在生产系统中正式运行的Python程序。
目前国内正在推动IPv6的普及,相信近期应该有很多公司都遇到过我司这种情况。代码贴出来,需要的直接复制粘贴拿去用。
from urllib.request import urlopen
import time
url = urlopen
time_format = "%Y-%m-%d %H:%M:%S"
# 连接官网首页并判断页面源码中是否含有“××有限公司”字符,若无,则表示网站崩溃(此时是502页面)
def test() :
for line in url('http://www.example.com') :
line = line.decode('utf-8')
if '××有限公司' in line :
return True
return False
# 执行定时任务
def run() :
global time_format
while True :
sleep_time = 300 # 定时任务睡眠时间,默认每300秒查询一次官网
try :
if not test() :
sleep_time = 30 # 若发现网站崩溃,则每隔30秒查询一次
ftime = time.strftime(time_format, time.localtime())
with open('C:\\Users\\AL\\Desktop\\err.log', 'a') as f :
f.write('website error! ' + ftime + '\n')
except :
ftime = time.strftime(time_format, time.localtime())
print('program error! ' + ftime)
continue
else :
time.sleep(sleep_time)
if __name__ == '__main__' :
run()