Nginx限流和黑名单配置

作者:zhuge···预计阅读 10 分钟·905 阅读·0 评论
Nginx限流和黑名单配置

####简单粗暴设置

#白名单设置,访问根目录 
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 ;
    	}
  	}
}

相关文章

评论

加载中...