lua+redis实现访问频率控制
一)需求背景
在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次 在openresty中,可以找到: set_by_lua,rewrite_by_lua,access_by_lua,content_by_lua等方法。
那么访问控制应该是:access阶段。 我们用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求。

二)设计方案
我们用redis的key表示用户,value表示用户的请求频次,再利用过期时间实现单位时间;
现在我们要求10秒内只能访问10次frequency请求,超过返回403

1)首先为nginx.conf配置文件,nginx.conf部分内容如下:
2)编辑access_by_limit_frequency.lua
请求地址:/frequency
10秒内 超出10次 ,返回403
10秒后,又可以访问了
如果我们想整个网站 都加上这个限制条件,那只要把
这个配置,放在server部分,让所有的location 适用就行了
这个方案对于常用足以够用,毕竟redis理论并发10万。
但是对于更要要求的场景,还需要优化,因为在高并发,多访问时,瓶颈会落到频繁的与redis的交互的网络损耗,可以考虑配合存储到nginx本地缓存里,直接使用内容来判断=》但是实际场景中一定会使用多台nginx的负载均衡,所以需要考虑数据共享的问题,或者如何每次都某一个ip地址固定落到某个固定的nginx业务机器上处理。

解决优化之前方案:
使用两层nginx组。
分发层nginx组:负责分发用户访问的请求到应用层的nginx组
应用层nginx组:负责nginx的业务功能开发:比如限流,缓存本地。
IP:192.168.0.2首先访问分发层nginx组,根据算法,将请求分发到后端应用层上固定的某个nginx上,这样的话后端应用层的nginx就不用担心数据共享访问记录的问题了,也就不需要redis,每次从本地缓存取即可(内存操作效率高)。
Last updated
Was this helpful?