F5 iRule优化

2021/7/2 netwirkF5本地负载均衡ltm

# 前言

之前客户使用的F5 LTM设备里有不少iRules都存在着大量使用if...elseif...else判断语句和if...elseif...else的嵌套,这些语句多了不但以后影响代码的可阅读性,也影响性能。因此怎么优化这些语句,减少代码阅读难度,提升处理性能成为需要解决的首要问题。 iRule中尽量少使用if..elseif..elseif..else连续判断,可以使用switch条件判断语句对多域名或对uri路径的进行判断指向。

# 优化场景

如果Virtual Server中引用的irule中存在大量连续的if..elseif..else判断语句,官方建议是尽量少的使用if..elseif..else判断语句,可以使用switch条件语句进行匹配,提高处理效率。

注释使用'#'和直到所在行结尾的所有字符都被看作注释,行中的注释可以使用';#'进行注释。

# 针对域名(host)进行判断

irule大量使用if..elseif..else判断语句,如下:

when HTTP_REQUEST {
  if { [HTTP::host] equals "live.asd.cn" } {
    pool Pool_NGcache_HTTP
  } elseif { [HTTP::host] equals "rtmp1.asd.cn"  } {
    pool Pool_10.176.8.95_80
  } elseif { [HTTP::host] equals "wms1.asd.cn"  } {
    pool Pool_10.176.8.96_80
  }elseif { [HTTP::host] equals "www.asdsa.com"  } {
    pool Pool_10.176.8.106_80    
  } elseif { [HTTP::host] equals "www.sdddd.cn"} {
    pool Pool_10.176.8.116_80   
  } elseif { [HTTP::host] equals "vod.asd.cn"  } {
    pool Pool_10.176.8.121_80
  } elseif { [HTTP::host] equals "ck.asd.cn"  } {
    pool Pool_10.176.8.122_80
  } else {
    discard
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

使用switch语句改下如下:

when HTTP_REQUEST
    switch [HTTP::host] {
        "live.asd.cn" {
            pool Pool_NGcache_HTTP
        }
        "rtmp1.asd.cn" {
            pool Pool_10.176.8.95_80
        }
        "wms1.asd.cn" {
            pool Pool_10.176.8.96_80
        }
        "www.asdsa.com" {
            Pool_10.176.8.106_80
        }
        "www.sdddd.cn" {
            pool Pool_10.176.8.116_80
        }
        "vod.asd.cn" {
            pool Pool_10.176.8.121_80
        }
        "ck.asd.cn" {
            pool Pool_10.176.8.122_80
        }
        default {
            discard
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

针对多个域名指向一个pool的写法,可以使用原来if...else语句,也可以使用switch语句。 原语句:

    elseif { [HTTP::host] equals "www.sdsd.com" || [HTTP::host] equals "www.nsssd.net" } {
        pool Pool_10.176.8.138_80
    }
1
2
3

或者使用Data Group包含多个域名:

    elseif { [class match [HTTP::host] equals Group_10.176.8.134] } {
        pool Pool_10.176.8.134_80
    }
1
2
3

使用switch语句改下如下:

    switch [HTTP::host] {
        "www.sdsd.com" -
        "www.xxds.com" -
        "www.nsssd.net" {
            pool Pool_10.176.8.138_80
        }
1
2
3
4
5
6

后面跟一个'-'表示使用和下一个模式相同的脚本。