使用 GEO 指令操作 IP 后续的动作
geo指令
1
2
3
4
语法: geo [$address] $variable { ... }
默认值: —
配置段: http
定义从指定的变量获取客户端的IP地址。默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量获得。
exp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#如果从 $remote_addr 取, 可以省略这个参数
geo $remote_addr $var {
default 0;
127.0.0.1 1;
}
geo $gomyck_ip $var {
default 0;
127.0.0.1 1;
}
#使用 if 判断 var
if ( $var = 0 ) {
return 403;
}
如果该变量的值不能代表一个合法的IP地址,那么nginx将使用地址 “255.255.255.255” nginx通过CIDR或者地址段来描述地址,支持下面几个参数:
1)delete: 删除指定的网络 2)default: 如果客户端地址不能匹配任意一个定义的地址,nginx将使用此值。 如果使用CIDR(无类型域间路由),可以用”0.0.0.0/0”代替default 3)include: 包含一个定义地址和值的文件,可以包含多个。 4)proxy: 定义可信地址。 如果请求来自可信地址,nginx将使用其“X-Forwarded-For”头来获得地址。 相对于普通地址,可信地址是顺序检测的。 5)proxy_recursive: 开启递归查找地址。 如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用”X-Forwarded-For”中的最 后一个地址来代替原始客户端地址。如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用”X-Forwarded-For”中最后一个与所有可 信地址都不匹配的地址来代替原始客户端地址。 6)ranges: 使用以地址段的形式定义地址,这个参数必须放在首位。为了加速装载地址库,地址应按升序定义。
1
2
3
4
5
6
7
geo $country {
default CN;
include conf/country.conf;
delete 127.0.0.0/16;
proxy 192.168.3.0/24;
proxy 2001:0db8::/32;
}
vim conf/country.conf
1
2
3
4
127.0.0.0/24 US;
127.0.0.1/32 EN;
10.1.0.0/16 HK;
192.168.1.0/24 JP;
map 的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 映射值(http_host)到值(name):
map $http_host $name {
hostnames;
default 0;
example.com 1;
*.example.com 1;
example.org 2;
*.example.org 2;
.example.net 3;
wap.* 4;
}
map $http_user_agent $mobile {
default 0;
"~Opera Mini" 1;
}
limit_conn_zone 的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
http {
# $binary_remote_addr 是压缩变量:请求 IP
# gomyck 是 zone 的名称, 随便定义
# 10m 是连接池的大小, 存储 IP 的大小 1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息
limit_conn_zone $binary_remote_addr zone=gomyck:10m;
...
server {
...
location /download/ {
# gomyck 并发连接数限制为 1 个
limit_conn gomyck 1;
}
}
}