林楠
摘 要:IPv4地址资源不足,共享IP一般采用NAT、代理、反向代理等方式,在客户端数量较多的情况下,一般要考虑负载均衡与冗余的情况。文章介绍一种通过定期轮询动态生成PAC脚本,从而达到数台代理服务器的负载均衡与冗余的程序设计,具有低成本、操作简单的特点。
关键词:CSharp;PAC脚本;代理服务器;负载均衡;冗余
中圖分类号:TP393.06 文献标识码:A 文章编号:1006-8937(2015)06-0070-02
目前,IPv4的地址资源严重告急,在日常工作生活中,家庭或企业一般只能通过一个或几个互联网IP地址进行接入,其内部网络如需同时访问互联网,一般使用路由器的NAT(Network Address Translation网络地址转换)功能或代理服务器来实现私网对互联网的访问。但是当内部网络计算机数量过多时,NAT会极大的影响整台路由器的性能,单代理服务器也会因负载过大而经常宕机。此时,我们一般采用以下几种方式来解决这个问题:
①使用防火墙的NAT功能来替代路由器的NAT功能,防火墙的NAT功能是由硬件实现,性能远超路由器,可以支持大数量级的NAT。
②使用多台代理服务器实现负载均衡。将用户请求随机发送到不同的代理服务器,以实现负载均衡。
基于成本等因素考虑,我们选择方案2,通过部署多台代理服务器,并在客户端使用自动代理PAC脚本来实现代理服务器的负载均衡。
1 PAC脚本应用
自动代理脚本(Proxy auto-config Script),简称PAC脚本。一个PAC文件就是一个Javascript脚本,可放置在服务器上,通过远程WEB访问,客户端只需要在代理的使用自动检测脚本中输入PAC脚本的WEB地址,就可以使用该脚本,当代理服务器发生变化时,只需维护Web服务器上的PAC脚本,无需更改客户端配置,方便后期维护,减轻运维成本与负担。
PAC脚本包含一个FindProxyForURL函数,IE通过传入两个参数url(访问地址的完整URL)与host(访问地址的主机名)来判断是直接访问,还是通过函数返回的代理服务器地址与端口来访问。
PAC脚本可以通过取随机数轻松实现负载均衡,但是当其中一台服务器宕机时,脚本依旧有可能返回该服务器,从而导致客户端访问异常。于是我们考虑可以编写一个程序,运行在存放PAC脚本的WEB服务器,通过定时对各代理服务器进行轮询,根据代理服务器状态变化,重写PAC脚本。
2 程序总体设计
程序基于C#的Winform编写,分为两个模块。
2.1 监控模块
程序设置一个timer定时器,定期对各代理服务器进行轮询,根据轮询结果决定是否重写PAC脚本,并显示轮询结果,方便巡检查看。轮询采用TcpClinet.Connect方法来测试代理服务器是否正常工作,如图1所示。
2.2 配置模块
可对代理服务器地址、端口、轮询间隔、PAC文件存放路径与文件名等参数进行配置。配置文件采用XML格式保存,如图2所示。
3 技术实现
3.1 连接测试
如直接使用TcpClient.Connect连接测试端口,当服务器不连通或端口未打开时,需要很长时间才能返回结果,捕获So-
cketException异常。这里希望可以设定一个较短的时间获取结果,超时则判断连接失败。
这里使用了ConnectorState.Completed.WaitOne(int millise-
condsTimeout,bool exitContext)函数,在millisecondsTimeout内未响应,则返回错误,退出线程。
3.2 文件写入
FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,经常使用StreamRea-
der或StreamWriter执行这些功能。FileMode.Create表示当文件不存在时直接创建文件,而文件已存在时删除该文件,然后创建新文件。
3.3 XML读写
可扩展标记语言,简称XML,轻量级的数据存储文件,规范统一,易于阅读、扩展,可被几乎所有的语言所支持。
程序使用XmlDocument来读取XML文件。XML文件可视为由声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树。第一个结点为根结点,每个结点均可以有自己的子结点。可以通过一系列属性或方法得到这个结点的值或其它一些属性。
3.4 功能控制
当监控未开始时,可以重新加载代理服务器,但不能手动轮询。当开始监控时,可以手动轮询,但不可以重新加载代理服务器。
4 后期功能扩展
后期可考虑对以下功能进行扩展,也可以根据实际需求,开发新的功能。
4.1 日志与备份
将轮询结果、文件生成、更改配置等操作记录在日志中备查,并在生成新的PAC文件与配置前,对原文件进行备份。
4.2 服 务
将程序安装为服务,可在WEB服务器启动时自动运行。设置为只运行一个实例,避免不同用户登录重复运行,造成资源浪费。
4.3 异常提醒
运维人员可以根据轮询显示结果及时发现故障。可考虑以发送短信等方式进行实时提醒,缩短故障发现周期,提高可靠性。
5 结 语
本文提供一种思路,使用自动代理脚本PAC实现代理服务器的负载均衡,再编写一个程序,通过定时轮询检测代理服务器的状态,根据状态变化,动态生成PAC文件,实现代理服务器的冗余,低成本地解决代理服务器的负载均衡与冗余。
参考文献:
[1] 董文江,胡轶,李健玲,等.PAC脚本在文献代理数据库中的应用[J].甘肃科技,2006,(9).