--[[
实现请求统计,并且将单位时间内异常次数达到阀值的请求加入到黑名单中
--]] --获取共享内存
local limit_req_store = ngx.shared.limit_req_store --过载保护策略总开关,若开关关闭,则全部策略失效
local overload_protection_switch = limit_req_store:get("overload_protection_switch")
if (overload_protection_switch ~= nil and overload_protection_switch == "N") then
ngx.log(ngx.INFO, "nginx limit strategy has been shutdown.")
return
end --获取返回状态码
local status = ngx.status --获取请求uri
local uri = ngx.var.uri ngx.log(ngx.DEBUG, "current request uri:", uri, ", http status code:", status) local count --记录当前请求的异常次数
local uri_last_decay_time_key="cur_time:"..uri --记录当前请求上一次衰减时间节点的 key
local black_list_key = "black_list:"..uri --记录异常次数达到上限时被加入黑名单的 URI 的 key
local os_cur_time = os.time() --获取当前系统时间,单位是秒
local cur_uri = "cur:"..uri --记录请求异常次数的 key,不能直接用 uri 做 key,会和resty-limit-multiple-strategy.lua文件中的key 冲突 --衰减时间内最大异常次数
local max_fail_time= limit_req_store:get("period_max_fail_time")
if (max_fail_time == nil or max_fail_time == ) then
max_fail_time =
end ngx.log(ngx.DEBUG,"nginx config period_max_fail_time:",max_fail_time) --衰减时间,所有与过期时间相关的设置单位都是秒
local decay_time= limit_req_store:get("period_time")
if (decay_time == nil or decay_time == ) then
decay_time =
end --异常请求加入blacklist的有效时间,单位是秒
local black_list_time = limit_req_store:get("black_list_survival_time")
if (black_list_time == nil or black_list_time == ) then
black_list_time =
end --err_code 默认为执行限流策略时的返回码,不需要后续逻辑处理
if status == err_code then
return
end --只统计400以上的返回异常
if status >= then
count= limit_req_store:get(cur_uri)
if count == nil then
limit_req_store:set(cur_uri,)
limit_req_store:set(uri_last_decay_time_key,os_cur_time)
count =
else
--获取当前异常次数的值
count = limit_req_store:incr(cur_uri,)
end
--print("count-----:",count)
if count >= tonumber(max_fail_time) then
ngx.log(ngx.ERR, "nginx current request uri:", uri," fail time is up to the max_fail_time,and will be added to black_list.")
limit_req_store:set(black_list_key,,black_list_time)
limit_req_store:delete(cur_uri)
limit_req_store:delete(uri_last_decay_time_key)
return
end
local time = limit_req_store:get(uri_last_decay_time_key)
time = os_cur_time-time
if time >= tonumber(decay_time) then
--math.ceil()函数用户取整
count = math.ceil(count/)
ngx.log(ngx.DEBUG, "nginx current request uri:", uri," fail time was be decayed,current count:", count)
limit_req_store:set(cur_uri,count)
limit_req_store:set(uri_last_decay_time_key,os_cur_time)
end
end

request-statistics.lua的更多相关文章

  1. 【lua】LWT HttpdModule

    要使用httpd模块,需要在脚本开头添加: require "httpd" httpd.pairs(apr_table) 用以遍历apr_table for key, value ...

  2. 01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布

    简介 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 ...

  3. Nginx+lua+openresty精简系列

    1. CentOS系统安装openresty 你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum update 命令).运行下面的 ...

  4. PHP7函数大全(4553个函数)

    转载来自: http://www.infocool.net/kb/PHP/201607/168683.html a 函数 说明 abs 绝对值 acos 反余弦 acosh 反双曲余弦 addcsla ...

  5. cf.VK CUP 2015.B.Mean Requests

    Mean Requests time limit per test 4 seconds memory limit per test 256 megabytes input standard input ...

  6. 微软Azure云平台Hbase 的使用

    In this article What is HBase? Prerequisites Provision HBase clusters using Azure Management portal ...

  7. ntopng源码分析

    参数初始化以及ntop主流程启动 #ifndef WIN32 ) && (argv[][] != '-')) rc = prefs->loadFromFile(argv[]); ...

  8. Oracle Applications DBA 基础(二)

    6.OAM及系统管理 2014年9月13日 20:40 参考资料: 1.Oracle Applications System Administrator's Guide - Configuration ...

  9. 性能测试工具Locust的使用

    一.写在前面 官网:https://www.locust.io/ 官方使用文档:https://docs.locust.io/en/latest/ 大并发量测试时,建议在linux系统下进行. 二.L ...

  10. PHP类和函数注释大全

    每次要用PHP的某个功能的时候,都要去查一下,于是决定将PHP所有类和函数都整理出来,加上注释 大致实现 将php.jar文件解压,取出目录stubs 将stubs中的所有php文件中的注释去掉,并做 ...

随机推荐

  1. 一步到位带你入门Selenium

    其实,关于这篇文章发布前还是有很多思考的,我是不想发布的,因为关于selenium的文章博客园里面有很多的介绍,写的详细的,也有写的不详细的,那么我的这篇文章的定位是基于selnium从开始到最后的框 ...

  2. 使用Adobe Illustrator + ArcGIS绘制地图 | Map Design Using ArcGIS + Adobe Illustrator

    国内GIS/Cartography同行大部分使用CorelDraw绘制地图.相比之下,国外同行则更多使用Adobe Illustrator绘制地图.CorelDraw和Illustrator两个软件均 ...

  3. [转]windows7远程桌面连接失败:发生身份验证错误。要求的函数不受支持

    转至:https://jingyan.baidu.com/article/d169e18604ca86436611d821.html 系统升级后出现远程连接报错,“发生身份验证错误.要求的函数不受支持 ...

  4. quartz 使用配置文件配置线程数

    quartz默认的线程数是10个,如果我们要修改这个线程数需要做一个配置文件,在配置文件内修改线程. 一共需要2个操作: 1.找到quartz的XML配置文件,设置加载配置文件(配置文件存放在weba ...

  5. jQuery插件扩展extend的实现原理

    相信每位前端的小伙伴对jQuery都不陌生吧,它最大的魅力之一就是有大量的插件,去帮助我们更轻松的实现各种功能. 前几天晚上,闲来无事,就自己动手写了个简单的jQuery插件,功能很简单,只是让选定的 ...

  6. .netcore2.0 Startup 全局配置文件小技巧

  7. C#调用OCX控件的常用方法[转]

    小伙伴们在使用ICP提供的各种能力进行集成开发时常常会遇到一些技术上的困扰,例如ICP中很多接口是通过OCX控件的方式提供的,如何调用这些接口,就成了一个不大不小的问题,毕竟开发指南上可没这些内容啊~ ...

  8. angular OnChange事件

    import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core'; @Component({ sel ...

  9. Glib之GObject宏介绍

    G_DEFINE_TYPE定义一个静态类型 /** * G_DEFINE_TYPE(`G_DEFINE_TYPE_WITH_CODE`比`G_DEFINE_TYPE`就是多了一个自定义代码参数_C_) ...

  10. NSStream文件流

    1.文件流的使用 NSString *filePath = @"/Users/JHQ0228/Desktop/test.txt"; NSData *data = [@"h ...