####简单粗暴设置
#白名单设置,访问根目录
location / {
allow 123.34.22.15;
allow 33.56.32.1/100;
deny all;
}
#黑名单设置,访问根目录
location / {
deny 123.34.22.15;
}
#特定目录访问限制
location /tree/list {
allow 123.34.22.15;
deny all;
}
####根据日记生成 在http模块最后加上配置
#黑名单设置
include /etc/nginx/conf.d/blockip.conf;
blokip说明
# 屏蔽单个ip访问
deny IP;
# 允许单个ip访问
allow IP;
# 屏蔽所有ip访问
deny all;
# 允许所有ip访问
allow all;
#屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 123.0.0.0/8
#屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 124.45.0.0/16
#屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令
deny 123.45.6.0/24
创建脚本
vim /etc/nginx/blockip.sh
#!/bin/bash
#取最近5w条数据 日志地址自定义
tail -n50000 /usr/local/nginx/logs/access.log \
#过滤需要的信息行ip等
|awk '{print $1,$12}' \
#过滤爬虫
|grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou|360|bing|soso|403|admin" \
#统计
|awk '{print $1}'|sort|uniq -c|sort -rn \
#超过1000加入黑名单
|awk '{if($1>1000)print "deny "$2";"}' >> /etc/nginx/conf.d/blockip.conf
#重启nginx生效
/usr/sbin/nginx -s reload
加入任务计划
crontab -e
#每半小时检查执行一次脚本
*/30 * * * * . /etc/profile;/bin/sh /etc/nginx/blockip.sh
####Nginx 的限流策略 Nginx 的限流主要是两种方式: 限制访问频率和限制并发连接数。 Nginx 按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。
Nginx 官方版本限制 IP 的连接和并发分别有两个模块: 1、limit_req_zone:用来限制单位时间内的请求数,即速率限制 , 采用的漏桶算法 “leaky bucket”。 2、limit_conn_zone:用来限制同一时间连接数,即并发限制。 ####limit_req_zone限制访问频率 使用语法:limit_req_zone key zone rate key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。 zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。1M 能存储 16000 IP 地址的 访问信息,10M 可以存储 16W IP 地址访问信息。 rate: 用于设置最大访问速率,rate=10r/s 表示每秒最多处理 10 个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每 100 毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续 100 毫秒内又有请求到达,将拒绝处理该请求。
http {
# 定义限流策略
limit_req_zone $binary_remote_addr zone=rateLimit:10m rate=1r/s ;
# 搜索服务的虚拟主机
server {
location / {
# 使用限流策略,burst=5,
#重点说明一下这个配置,burst 爆发的意思,
#这个配置的意思是设置一个大小为 5 的缓冲区(队列)当有大量请求(爆发)过来时,
# 超过了访问频次限制的请求可以先放到这个缓冲区内。
#nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回 503,
#如果没有设置,则所有请求会等待排队。
limit_req zone=rateLimit burst=5 nodelay;
proxy_pass http://192.168.1.100;
}
}
}
####limit_conn_zone限制最大连接数 使用语法:limit_conn_zone key zone key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。 zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。1M 能存储 16000 IP 地址的 访问信息,10M 可以存储 16W IP 地址访问信息。 举例:
http {
# 定义限流策略
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
# 搜索服务的虚拟主机
server {
location / {
# 对应的 key 是 $binary_remote_addr,表示限制单个 IP 同时最多能持有 1 个连接。
limit_conn perip 1;
# 对应的 key 是 $server_name,
#表示虚拟主机(server) 同时能处理并发连接的总数。
#注意,只有当 request header 被
后端 server 处理后,这个连接才进行计数。
limit_conn perserver 10 ;
proxy_pass http://192.168.1.100 ;
}
}
}

评论