nginx对同一个IP进行限流

nginx通过对同一IP进行限流,在一定程度上可以防止应用层DDOS攻击。
下面来看一下怎么配置。

修改nginx.conf配置文件

http {
	......
	# 在http节点中添加下面这一行
	limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
	server {
		# 在server节点中添加这一行
		limit_req zone=one burst=10 nodelay;;
		......
	}
}

limit_req_zone的参数详解

  • $binary_remote_addr:表示客户端ip地址的二进制,当此nginx前方还存在代理时,需进行处理
  • zone=one:10m:为session会话状态分配一个大小为10m内存存储区,并且设定名称为one.
  • rate=1r/s:表示请求频率不能超过每秒一次。

limit_req的参数详解

  • zone=one:表示这个server服务收到的请求放在one的那个内存区域,等待被处理
  • burst=10:表示请求队列的长度,比如我设置了rate=1r/s,而同一时刻有15个请求发过来,那么第一个请求会被处理,10个请求会被存在队列里等待被处理,而剩下4个请求就会直接响应503状态码。
  • nodelay:表示不延时。比如rate=1r/s,如果不设置nodelay就会严格按照1秒处理一个请求的频率,直观的看就是页面数据卡了,过了一秒后才加载出来。

这里有人就会疑惑了,既然nodelay设置不延时,那么设置处理频率rate=1r/s又有什么意义呢。我们假设一个案例来做分析:
我们设置rate=1r/s,burst=10,nodelay不延时,然后同时有15个请求发过来,其中一个请求被处理的时候,有10个请求会在队列中等待,而另外4个请求就会直接响应503状态码。由于设置了nodelay,一旦处理完一个请求之后立刻就会处理队列中的下一个请求。在1秒钟内,队列钟的请求全部都被处理完了,但是这个时候队列中的请求并不会被清除掉,而是会等到满1秒钟后才会被清除。这期间如果还有请求发来,由于队列中的请求并没有被清除,所以直接就响应503。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值