场景

  • 根据来源IP区分production/preview环境
  • 根据来源IP区分限速/非限速
  • 结合上面两者

实现

  • geo, map

不多说,上实现,具体看注释

 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
29
30
31
# ip address classfiy detail:
# ^1 limit
# ^0 unlimit
# lan$ preview
geo $white_ip_list {
    default            1;

    127.0.0.1          0;
    10.0.0.0/8         0;
    192.168.0.0/16     0;

    1.2.3.4            0;
    2.3.4.5            0;

    10.20.30.0/24      0lan;
    20.30.40.50        0lan;
}

# map for limit zone
map $white_ip_list $limit_ip_list {
    ~^1       $binary_remote_addr;
    ~^0       "";
}

limit_req_zone $limit_ip_list zone=limit_yr_sister_ip:500m rate=9999r/s;

# map for preview
map $white_ip_list $address_type {
    default    wan;
    ~lan$      lan;
}

啰嗦一下

其实一切都写在注释里了
最初实现时是很长一坨的正则判断remote_addr是否是指定地址,然后做production/preview的区分。
而limit/unlimited的实现则使用geo和map。
后来我把它们结合到了一起,最后使用正则来判断其属性归属。

使用

  • limit调用
1
limit_req zone=limit_yr_sister burst=5 nodelay;
  • production/preview分离

可参照上一篇blog nginx使用if实现多重判断case一例
设置一个flag,然后正则判断一下就OK了。

-EOF-