可编写脚本在应用交付(负载均衡)中是个相当关键的功能,它是负载均衡策略灵活性的最佳体现。虽然对于没有软件开发基础的技术同仁来说,脚本编写可能是一个“噩梦”,面对着那“神奇”的字符串,敝人也感同身受。为此,我搜集了一些脚本范例,特别是针对常用的HTTP流量的优化,为大家做个借鉴。

范例一:将HTTP的请求自动转换为HTTPS。这个脚本比较简单,但在很多电商网站或基于HTTPS访问的客户会用得比较多。

when HTTP_REQUEST {

HTTP::redirecthttps://[HTTP::host][HTTP::uri]

}

脚本说明:只要负载均衡收到HTTP的请求包,就以HTTP重定向的方式转换为HTTPS://加上域名和路径。


范例二:根据客户端请求的URI路径不同,分发至指定的服务器组(pool)。在一些客户的业务设计中,后台只有一台物理服务器(同一个IP地址同一个服务端口),但可根据路径的不同发布不同的业务,这时候就需要根据路径的关键字来区分业务。

when HTTP_REQUEST {

if {[HTTP::uri] starts_with"/test1" } {

pool pool_server1

} elseif {[HTTP::uri] starts_with"/test2" } {

pool pool_server2

} else } {

pool pool_server

}

}

脚本说明:当客户端请求的路径为“/test1”则分配给server1,当客户端请求的路径为“/test2”则分配给server2,其它请求都转发至默认的服务器组。


范例三:根据客户端浏览器默认语言设定自动选取对应国家语言的服务器群集。

when HTTP_REQUEST {

if { [HTTP::headeraccept-language] contains “es” } {

poolSpanish

} elseif { [HTTP::headeraccept-language] contains “ja” } {

poolJapanese

} elseif { [HTTP::headeraccept-language] contains “zh” } {

pool Chinese

} else {

poolEnglish

}

}

应用交付脚本工具在HTTP服务中的应用

范例四:判断某虚拟服务器某端口业务(vport)的当前链接数,超过阀值后重定向到指定页面!~既能保护后台服务器,也能在接收到异常的大并发连接时提供友好的备份服务。

when HTTP_REQUEST {

set total1 [STATS::get virtual-servervs_192.168.111.45 8080 http current-connection]

if { $total1 > 100 } {

HTTP::redirect"http://www.163.com/"

}

}

脚本说明:当访问虚拟服务器192.168.111.45的8080端口的并发连接数大于100,后续请求都重定向至其他可访问的站点,如www.163.com


范例五:根据HTTP报文头的sessionID来做会话保持。某些网站是不能简单的采用源IP会话保持的策略,在开发时采用sessionID来标示会话信息。通过HTTPwatch工具,查看到客户的sessionID 是藏于cookies中:

Cookie内容:

ASP.NET_SessionId=rrwjbhbv1w4qgm553usoqqq3;MyCook=visitCount=1

使用以下脚本,在URI中查找“ASP.NET_SessionId”字段,就可以获取到sessionID,并进行会话保持。

when HTTP_REQUEST {

set session_id [findstr[HTTP::uri] "ASP.NET_SessionId=" 18 ";"]

if { ( $session_id eq"" ) and ( [HTTP::cookie exists ASP.NET_SessionId] ) } {

set session_id[HTTP::cookie ASP.NET_SessionId]

}

if { $session_id ne"" } {

persist uie $session_id

}

}

应用交付脚本工具在HTTP服务中的应用

以上只是在HTTP环境中会经常遇到的脚本应用,脚本工具的强大远不止于此,藉此也希望更多的技术同仁能领略脚本工具的魅力所在,编写出更具Power的脚本范例,大家共同进步。


(ZJM)