request-statistics.lua
--[[
实现请求统计,并且将单位时间内异常次数达到阀值的请求加入到黑名单中
--]] --获取共享内存
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的更多相关文章
- 【lua】LWT HttpdModule
要使用httpd模块,需要在脚本开头添加: require "httpd" httpd.pairs(apr_table) 用以遍历apr_table for key, value ...
- 01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布
简介 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 ...
- Nginx+lua+openresty精简系列
1. CentOS系统安装openresty 你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum update 命令).运行下面的 ...
- PHP7函数大全(4553个函数)
转载来自: http://www.infocool.net/kb/PHP/201607/168683.html a 函数 说明 abs 绝对值 acos 反余弦 acosh 反双曲余弦 addcsla ...
- cf.VK CUP 2015.B.Mean Requests
Mean Requests time limit per test 4 seconds memory limit per test 256 megabytes input standard input ...
- 微软Azure云平台Hbase 的使用
In this article What is HBase? Prerequisites Provision HBase clusters using Azure Management portal ...
- ntopng源码分析
参数初始化以及ntop主流程启动 #ifndef WIN32 ) && (argv[][] != '-')) rc = prefs->loadFromFile(argv[]); ...
- Oracle Applications DBA 基础(二)
6.OAM及系统管理 2014年9月13日 20:40 参考资料: 1.Oracle Applications System Administrator's Guide - Configuration ...
- 性能测试工具Locust的使用
一.写在前面 官网:https://www.locust.io/ 官方使用文档:https://docs.locust.io/en/latest/ 大并发量测试时,建议在linux系统下进行. 二.L ...
- PHP类和函数注释大全
每次要用PHP的某个功能的时候,都要去查一下,于是决定将PHP所有类和函数都整理出来,加上注释 大致实现 将php.jar文件解压,取出目录stubs 将stubs中的所有php文件中的注释去掉,并做 ...
随机推荐
- Linux下安装Pcntl PHP扩展
//解压源码包 [root@centos src]# tar -zxvf php-5.5.35.tar.gz //进入pcntl扩展库 [root@centos src]# cd php-5.5.35 ...
- Jquery 页面元素事件绑定
场景: 用一个Table来展示数据信息列表,通过鼠标点击Table中的Tr来获取到当前选中的数据行信息. <table class="Table" width="1 ...
- 【[APIO/CTSC2007]动物园】状压DP
题目测评:https://www.luogu.org/problemnew/show/P3622 题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围 ...
- plantix插件工具,eclipse工具
代码修改后部署流程: 修改代码-->自动构建工作空间(将修改的代码或配置文件复制到classes文件夹)-->发布到tomcat环境中-->重启服务器运行 常见报错:java.lan ...
- [Swift]八大排序算法(五):插入排序
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
- 在 MVC 中使用 ninject Lazy Load的一个想法
这这里先声明一下,引用了一个 (http://www.edcourtenay.co.uk/musings-of-an-idiot/2012/11/23/lazy-binding-with-ninjec ...
- C# 委托的三种调用示例(同步调用、异步调用、异步回调)
首先,通过代码定义一个委托和下面三个示例将要调用的方法: 代码如下: public delegate int AddHandler(int a,int b); public class 加法类 { p ...
- leetcode-229.求众数(二)
题目: 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为O(n),空间复杂度为O(1). 示例 1: 输入: [3,2,3] 输出: [3 ...
- TX2 自制底板不识别USB
目的:解决自制的底板无法识别USB,使能3个UART接口,使能3个SPI接口. Jetpack版本:Jetpack-3.1 虚拟机:ubuntu14.04 使用dtb文件夹下的文件替换刷机包../64 ...
- Qt 学习之路 2(37):文本文件读写
Qt 学习之路 2(37):文本文件读写 豆子 2013年1月7日 Qt 学习之路 2 23条评论 上一章我们介绍了有关二进制文件的读写.二进制文件比较小巧,却不是人可读的格式.而文本文件是一种人可读 ...