欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

贴几个自己写的BigIP F5的iRule 博客分类: T_专_负载均衡器 应用服务器TclCMS活动Yahoo 

程序员文章站 2024-02-09 20:50:22
...

折腾了几天的BigIP F5的iRule,终于折腾出了项目需要的,顺便也把几个练习和测试的iRule在这儿贴一下,给有需要的兄弟参考吧。

Tcl/Tk  代码
  1. #======================================#   
  2. #    几个BigIP F5 iRule的习作           #   
  3. # Author: BrokenStone                  #   
  4. # mail: wdmsyf@yahoo.co                #   
  5. # 2006.11.30                           #   
  6. #======================================#   
  7.   
  8.  
  9. iRule name: Redirect_when_Busi_Down    
  10. #当业务功能Pool里没有活动成员时,则转向到信息发布Pool   
  11. when LB_FAILED {   
  12.   #如果当前Pool中没有active的成员时才进行转换   
  13.   if { [active_members BUSI_HTTP_POOL] == 0 } {   
  14.     set DEBUG 1   
  15.     set internal_host "145.24.216.106";       #网站内网地址    
  16.      set external_host "www.shineauto.cn";  #网站域名    
  17.      set msg_url "/common/xtwh.do";            #错误提示URL   
  18.     set internal_IP "145.24.216";             #认为是内网地址的关键字   
  19.      set cip [IP::client_addr];                #客户端IP    
  20.     set host $external_host;                  #要转向的服务器地址    
  21.   
  22.     #如果客户端IP包含 $internal_IP (内部IP),则使用内部IP进行转向;   
  23.     #否则认为是外部用户,使用域名进行转向   
  24.      if { $cip starts_with $internal_IP }{   
  25.       set host $internal_host   
  26.     } else {   
  27.       set host $external_host   
  28.     }   
  29.     if { $DEBUG } {   
  30.       log local0. "URL:  http://$host/$msg_url"   
  31.     }   
  32.     HTTP::fallback "http://$host/$msg_url"   
  33.   } else {   
  34.     #如果当前Pool中还有Active的member,则重新选择   
  35.     LB::reselect   
  36.   }   
  37. }   
  38. #这是测试rule   
  39. when HTTP_REQUEST {   
  40.   set DEBUG 1   
  41.   if { $DEBUG } {   
  42.     set internal_IP "145.24.216";             #认为是内网地址的关键字   
  43.     set cip [IP::client_addr];                #客户端IP    
  44.     if { $cip starts_with $internal_IP } {   
  45.       log local0. "From internal..."   
  46.     } else {   
  47.       log local0. "From external..."   
  48.     }   
  49.   }   
  50. }   
  51.   
  52. ##====================================   
  53. iRule name: Insert_ClientIP_to_header   
  54. #在往服务器上提交的Http请求头中增加客户端实际IP地址,   
  55. #在应用中可以这样取客户端IP(java代码):   
  56. #String clientIP = request.getHeader("Client-IP");   
  57. when HTTP_REQUEST {   
  58.   HTTP::header insert Client-IP [IP::client_addr];   
  59. }   
  60. #when HTTP_RESPONSE {   
  61. #  #HTTP::header insert Server-IP [IP::server_addr]   
  62. #  clientside { HTTP::header replace Host [IP::server_addr] }   
  63. #}   
  64.   
  65. ##====================================   
  66. iRule name: Select_Pool_By_Query_String   
  67. #根据URI中的关键字选择相应的POOL   
  68. when HTTP_REQUEST {   
  69.   #报表报送功能转向到报表专用POOL   
  70.   if { [HTTP::uri] starts_with "/bbbs" } {   
  71.     pool REPORT_HTTP_POOL   
  72.   }   
  73.   #其他要特殊处理的情况   
  74.   #elsif {} {}   
  75. }   
  76.   
  77. ##======================================   
  78. iRule name: Replace_Host_String_For_External    
  79. #对于外部访问的请求,把页面中本地地址替换成域名   
  80. when HTTP_RESPONSE_DATA  {   
  81.   set find "145.24.216.106"   
  82.   set replace "www.shineauto.cn"   
  83.   set payload [HTTP::payload]   
  84.   set cip "[IP::client_addr]"   
  85.   #if { not ( [IP::addr [IP::remote_addr] equals 145.24.0.0 netmask 255.255.248.0] ) } {   
  86.   #  if {[regsub -all $find $payload $replace new_response] > 0} {   
  87.   #    HTTP::payload replace 0 [HTTP::payload len] $new_response    
  88.   #  }   
  89.   #}   
  90.   
  91.   #下面是测试时内部地址时使用的   
  92.   #if { [ $cip starts_with 145.24.32] } {   
  93.     if {[regsub -all $find $payload $replace new_response] > 0} {   
  94.       HTTP::payload replace 0 [HTTP::payload len] $new_response    
  95.     }   
  96.   #}   
  97. }   
  98.   
  99. ##========================================   
  100. iRule name: Check_Client_IP_Select_POOL    
  101. #根据客户端IP选择不同的Pool   
  102. when CLIENT_ACCEPTED {   
  103.   if { [IP::addr [IP::remote_addr] equals 145.24.32.0/255.255.248.0] } {   
  104.     pool BUSI_HTTP_POOL   
  105.   } else {   
  106.     pool CMS_HTTP_POOL   
  107.   }   
  108. }   
  109.   
  110. ##========================================   
  111. ##替换Server返回页面中的所有匹配内容, 好像别的产品都没法做到吧   
  112. when HTTP_RESPONSE_DATA {   
  113.   set find "145.24.216.212"   
  114.   set replace "==It's bad(服务器信息)==145.24.216.212"   
  115.   set payload [HTTP::payload]   
  116.   if {[regsub -all $find $payload $replace new_response] > 0} {   
  117.     HTTP::payload replace 0 [HTTP::payload len] $new_response    
  118.   }   
  119. }