主机 | IP | 备注 |
---|---|---|
master1 | 10.0.0.63 | |
master2 | 10.0.0.64 |
1. NGINX MAP模块与NGINX GEO模块
在通常情况下,使用
nginx
基于 ip 限制访问请求频率等限制内容,我们会需要对特定ip进行限制排除操作,因此本文引入了基于nginx geo 与 nginx map 进行此类情景相关配置
这两个模块默认已经安装.
Nginx geo 格式说明
Syntax ( 语法格式 ): geo [$address] $variable { ... }
Default ( 默认 ): -
Content ( 配置段位 ): http
Nginx map 格式说明
Syntax ( 语法格式 ): map String $variable { ... }
Default ( 默认 ):-
Content ( 配置段位 ): http
2. NGINX MAP配置实例
10.0.0.63 配置nginx map
#----------------------------------------------------------------------------#
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$request_time" "$remote_addr" "$binary_remote_addr"';
geo $whiteiplist {
default $binary_remote_addr; # 设置默认值
127.0.0.1 0; # 0 是不受限制的网段
10.0.0.0/24 1; # 1 是受限制的网段
}
map $whiteiplist $limit {
1 $binary_remote_addr;
0 "";
}
limit_req_zone $limit zone=leilei:1m rate=5r/m;
limit_req_log_level warn;
server {
listen 80;
server_name localhost;
limit_req zone=leilei burst=1;
limit_req_log_level warn;
access_log /var/log/nginx/access.log main;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
#----------------------------------------------------------------------------#
理解:
limit_req_zone $limit zone=leilei:1m rate=5r/m;
limit_req_log_level warn;
zone=leilei:1m :定义的缓存空间
rate=5r/m : 每分钟可以请求的次数 [还可以设置 5r/s 为每秒请求5次]
burst=1 : 在请求值超出后,不会马上返回错误,而是等待时间过了之后再返回,如果这个时间范围超出后,才会返回503错误
这个缓冲区,还可以在后添加nodelay; 代表返回503
爆发流量时会写入进缓冲区.如果缓冲区被写满就会返回503, 也就是允许的队列个数的意思.
$whiteiplist : 定义哪些会被限制. 0 为不限制 1为限制,1的点至就是 map下的limit_req_zone 控制速度
一分钟内的请求会被缓存到nginx中,超出1分钟后未被请求的自动放开, 如: 漏斗一样,一分钟请求 60个,在1分零1秒的时候,它在处理完第一个请求后会自动释放第一次请求,此时请求数会多出一个被允许的请求空位,用于响应下一个用户请求.
测试
[root@master ~]# curl -I 10.0.0.64
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Mon, 27 Apr 2020 06:01:02 GMT
Content-Type: text/html
Content-Length: 67703
Last-Modified: Mon, 27 Apr 2020 02:11:23 GMT
Connection: keep-alive
ETag: "5ea63f4b-10877"
Accept-Ranges: bytes
[root@master ~]# curl -I 10.0.0.64
HTTP/1.1 503 Service Temporarily Unavailable ## 超出限制 自动503
Server: nginx/1.16.1
Date: Mon, 27 Apr 2020 06:01:03 GMT
Content-Type: text/html
Content-Length: 3693
Connection: keep-alive
ETag: "5d958342-e6d"
对爬虫进行限流:
location / {
limit_req zone=leilei burst=2 nodelay;
if ($http_user_agent ~* "spider|Googlebot") {
set $anti_spider $http_user_agent;
}
}