OpenResty 实现限流
OpenResty 官方提供了封装好的 lua函数,方便我们开箱即用。支持一下几个场景:
- 根据ip限制并发连接数
- 限制时间窗口的请求数,如:限制 ip 每分钟只能调用 100 次 /order 接口,(允许在时间段开始的时候一次性放过100个请求)
- 平滑限制接口请求数,如:限制 ip 每分钟只能调用 120 次 /order 接口(平滑处理请求,即每秒放过2个请求)
- 漏桶算法限流,如:限制 ip 每分钟只能调用 120 次 /order 接口(平滑处理请求,即每秒放过2个请求),超过的部分进入桶中等待,(桶容量为60),如果桶也满了,则进行限流
流控设置规则,每分钟限制访问3次 Lua脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | server { listen 80 ; server_name localhost; charset utf- 8 ; #access_log logs/host.access.log main; # 限流示例 location /order/limit { default_type 'text/html' ; access_by_lua_block { -- 导入模块 local limit_count = require "resty.limit.count" -- 限流规则: 每分钟 3 次 local lim, err = limit_count. new ( "my_limit_count_store" , 3 , 60 ) if not lim then ngx.log(ngx.ERR, "failed to instantiate a resty.limit.count object: " , err) return ngx.exit( 500 ) end local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, true ) -- 如果请求数在限制范围内,则当前请求被处理的延迟(这种场景下始终为 0 ,因为要么被处理要么被拒绝)和将被处理的请求的剩余数 ngx.log(ngx.ERR, "delay: " ,delay, " err: " ,err) if not delay then if err == "rejected" then ngx.say( "访问太频繁了.." , "delay: " ,delay, " , err: " ,err) -- return ngx.exit( 503 ) end ngx.log(ngx.ERR, "被限流啦...... " , err) return ngx.exit( 500 ) end ngx.say( "success" ) } } |
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
· Windows 提权-UAC 绕过