重庆免费网站建站模板,高埗网站建设公司,网站title如何写,包装设计网站排行榜前十名openResty简介#xff1a;
OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台#xff0c;其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty 通过汇聚各种设…openResty简介
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty® 通过汇聚各种设计精良的 Nginx 模块主要由 OpenResty 团队自主开发从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部充分利用 Nginx 的非阻塞 I/O 模型不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
1、下载安装openresty
下载安装openresty。我使用的如下版本的
wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
解压文件tar -zvxf openresty-1.21.4.1.tar.gz
进入文件夹下cd ./openresty-1.21.4.1
执行./configure
然后 make make install
等待以上完成后。就可以到启动了。
具体启动的nginx服务目录在 openresty-1.21.4.1/nginx/sbin下。
启动命令如下
./openresty-1.21.4.1/nginx/sbin/nginx -c ./openresty-1.21.4.1/nginx/conf/nginx.conf
2、配置lua文件
在nginx.conf中配置限流lua文件。
在你要限流的接口下增加。
location /xxx{
access_by_lua_file /x/x/x/access_by_redis.lua;
proxy_pass http://xxxx/;
}
3、编写lua限流内容
access_by_redis.lua文件内容如下
local function close_redis(red) if not red then return end --释放连接(连接池实现) local pool_max_idle_time 10000 --毫秒 local pool_size 100 --连接池大小 local ok, err red:set_keepalive(pool_max_idle_time, pool_size) if not ok then ngx_log(ngx_ERR, set redis keepalive error : , err) end end
-- 连接redis local redis require(resty.redis) local red redis.new() red:set_timeout(1000)
local ip 127.0.0.1 ---修改变量 local port 6379 ---修改变量 local ok, err red:connect(ip,port) if not ok then return close_redis(red) end red:auth(密码) local clientIP ngx.req.get_headers()[X-Real-IP] if clientIP nil then clientIP ngx.req.get_headers()[x_forwarded_for] end if clientIP nil then clientIP ngx.var.remote_addr end
--ngx.say(clientIP)
--if clientIP 101.231.137.70 then -- ngx.exit(ngx.HTTP_FORBIDDEN) -- return close_redis(red) -- end local request_uri ngx.var.request_uri
-- 限制条件user:用户ip:请求地址。做限制条件 local incrKey user:..clientIP..:..request_uri..:freq local blockKey user:..clientIP..:block
local is_block,err red:get(blockKey) -- check if ip is blocked --ngx.say(tonumber(is_block)) if tonumber(is_block) 1 then --ngx.say(3) ngx.exit(403) --ngx.exit(ngx.HTTP_FORBIDDEN) close_redis(red) end
inc red:incr(incrKey)
--5秒内有15次以上访问即视为非法会阻止1分钟的访问
if inc 15 then inc red:expire(incrKey,5) end
if inc 15 then red:set(blockKey,1) --设置block 为 True 为1 red:expire(blockKey,60) end
close_redis(red)