场景
- 根据来源IP区分production/preview环境
- 根据来源IP区分限速/非限速
- 结合上面两者
实现
不多说,上实现,具体看注释
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。
后来我把它们结合到了一起,最后使用正则来判断其属性归属。
使用
1
|
limit_req zone=limit_yr_sister burst=5 nodelay;
|
可参照上一篇blog nginx使用if实现多重判断case一例
设置一个flag,然后正则判断一下就OK了。
-EOF-