用Python脚本对ASP.NET站点进行预热

很多人可能都会注意到,当一些新的代码部署到一个ASP.NET的站点后,第一次访问的时候是非常慢的,有可能需要等待超过一分钟;如果我们更新了站点的bin目录下的一些dll文件,那么这种情况会变得更加明显。当第一个页面请求到达服务器的时候,IIS会重新编译文件,这时候可以观察到w3wp.exe和csc.exe都会占用很多CPU。我们不希望用户是IIS重启之后第一个访问者,所以每台服务器在上线之前,都需要做预热处理。所谓预热处理,原理很简单,就是向目标服务器发送一些HTTP请求,从而触发服务器对文件进行编译,实现预热。

为什么用Python?一位大师曾经说过,程序员要每6个月就要学习一门新的语言(这个要求还真苛刻),所以决定学习一下Python。

需求:其实这个需求特别简单
1. 发送HTTP请求,Python自带的httplib库就能满足这个需求了
2. 多线程访问不同的站点,现在MySpace常用站点至少有4个
3. 指定服务器的IP,因为测试的服务器也有多台
4. 获取HTTP请求的状态
5. 需要在登录状态下进行预热

这个方法做了大部分的事情,Http请求,带登录状态的,能够指定IP的,指定站点的,指定页面的

def warmwww(inputServer,inputHost,inputPage):
	conn = httplib.HTTPConnection(inputServer)
	headers = {"Host":inputHost,"Cookie": "MYUSERINFO=MIIxxx%3d"}
	conn.request("GET", inputPage,"",headers)
	r1 = conn.getresponse()
	data = r1.read()
	conn.close()
	global results
	results.append((inputHost,r1.status))

主要用到了httplib.HTTPConnection类,获得一个httplib.HTTPConnection的对象;登录就是在Headers里面加一个标志登录的Cookie;由于要支持多个服务器,所以在初始化httplib.HTTPConnection对象的时候,指定的是IP,然后在Headers里面的Host中指定需要预热的站点;最后GET某个站点下的某个页面作为预热;最后获取response的状态码。这里需要import httplib。

接下来要做的就是用多进程来访问需要预热的站点

def run(server,paras):
	threadcount = 0;
	threadList = []
	for pa in paras:
		rm = threading.Thread(target = warmwww, args=(server,pa[0],pa[1]))
		rm.start()
		threadList.append(rm);
	for rt in threadList:
		rt.join()
		threadcount = threadcount + 1
	print threadcount,"Threads started. Run on server", server

threading.Thread()可以实例化一个Thread对象,参数target就是需要运行的方法,在Python里面,方法也是一个对象;如果target是带有参数的,那么就要通过args把参数传递进去。这里需要import threading。

if __name__ == "__main__":
	successFlag = True;
	begintime = time.time()
	run(server,paras)
	endtime = time.time()
	print "Finish the task in", endtime-begintime, "seconds"
	for sr in results:
		if(sr[1]!=200):
			print "Warm up",sr[0], "failed.", "status code:",sr[1]
			successFlag = False
	if successFlag:
		print "all warm up script run successfully."

paras是一个预先定义好的列表。results是一个全局变量,每个预热的结果都会存到results中,等预热程序执行完毕以后,检查其返回的状态码,如果等于200,就算通过;否则,就认为预热失败,并且打印出返回状态码。

经常会看有有人在论坛上提问,例如如何在XXX工具中发送带有cookie的请求,如果在YYY工具中模拟已经登录的用户做操作。其实这当中最根本的问题应该是,登录的原理是什么,知道这个原理以后,就很容易找到实现的方法,不管用的是C#还是Python。工具是手段,原理是根本。

1 thought on “用Python脚本对ASP.NET站点进行预热”

Leave a Reply

Your email address will not be published. Required fields are marked *