nginx设置连接限制和限制白名单

要求

设置ip白名单,需用到nginx geo 与 nginx map

nginx默认加载了ngx-http-geo-module和ngx-http-map-module相关内容;

ngx-http-geo-module可以用来创建变量,变量值依赖于客户端 ip 地址;

ngx-http-map-module可以基于其他变量及变量值进行变量创建,其允许分类,或者映射多个变量到不同值并存储在一个变量中;



Nginx geo 格式说明

Syntax ( 语法格式 ): geo [$address] $variable { ... }
Default ( 默认 ): -
Content ( 配置段位 ): http
Nginx map 格式说明
Syntax ( 语法格式 ): map String $variable { ... }
Default ( 默认 ):-
Content ( 配置段位 ): http

开启nginx连接限制

对指定请求路径不设置限制,如对请求路径为api目录下的请求不做限制,则可写为

server{
        location /app {
            proxy_pass http://192.168.1.111:8095/app;

            limit_conn conn 50;

            limit_rate 500k;
            limit_req zone=foo burst=5 nodelay; 
        }

        location /app/api {
            proxy_pass http://192.168.1.111:8095/app/api
        }
}

# 因nginx会优先进行精准匹配,所以以上写法即接触了对api目录下属路径的限制

白名单配置示例

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

http{
# ... 其他配置内容

##################################
## /etc/nginx/http.d/map.conf

#定义白名单ip列表变量
geo $whiteiplist {
default 1;
10.250.250.0/24 0;
127.0.0.1 0;
}
#使用map指令映射将白名单列表中客户端请求ip为空串
map $whiteiplist $limit{
1 $binary_remote_addr ;
0 "";
}

##################################
## /etc/nginx/http.d/limit.conf

## 配置前端代理,获取客户端真实IP
real_ip_header X-Forwarded-For;
set_real_ip_from 139.219.193.17;
#set_real_ip_from 0.0.0.0/0;
#real_ip_recursive on;

# $limit defined in /etc/nginx/http.d/map
limit_conn_zone $limit zone=conn:30m;
limit_conn_status 444;
limit_conn_log_level info;

limit_req_zone $limit zone=perip:30m rate=5r/s;
limit_req_status 444;
limit_req_log_level info;

##################################

server{

location /app {

## 单IP同时连接数限制
limit_conn conn 5;

## 单IP单位时间内请求数限制
limit_req zone=perip burst=5 nodelay;

##每个请求最大传输速率
limit_rate 500k;

proxy_pass http://192.168.1.111:8095/app;

}
}
}
白名单配置可用于对合作客户,搜索引擎等请求过滤限制

特殊情况处理

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
32
33
34
35
36
37
38
39
40
41

#如果想仅限制指定的请求,如:只限制Post请求,则:
http{
# 其他请求..
#请求地址map映射
map $request_method $limit {
default "";
POST $binary_remote_addr;
}
#限制定义
limit_req_zone $limit zone=perip:20m rate=10r/s;
server{
... #与普通限制一致
limit_req zone=perip burst=5 nodelay;
}
}
#在此基础上,想进行指定方法的白名单限制处理,则:
http{
#...
#定义白名单列表
map $whiteiplist $limitips{
1 $binary_remote_addr;
0 "";
}

#基于白名单列表,定义指定方法请求限制
map $request_method $limit {
default "";
# POST $binary_remote_addr;
POST $limitips;
}

#限制定义
limit_req_zone $limit zone=perip:20m rate=10r/s;

#在server中进行引用
server{
#... 与普通限制相同
limit_req zone=perip burst=5 nodelay;
}
}