openresty开发系列36--openresty执行流程之6日志模块处理阶段 一)header_filter_by_lua 语法:header_filter_by_lua <lua-script-str>语境:http,server,location,location if阶段:output-header-filter一般用来设置cookie和headers,在该阶段不能使用如下几个API:1.output API(ngx.say和ngx.send_headers)2.control AP…
openresty开发系列35--openresty执行流程之5内容content阶段 content 阶段 ---init阶段---重写赋值---重写rewrite---access content 阶段属于一个比较靠后的处理阶段,运行在先前介绍过的 rewrite 和 access 这两个阶段之后.当和 rewrite.access 阶段的指令一起使用时,这个阶段的指令总是最后运行,例如: location /content {    # 重写阶段    set $age 1;    rew…
openresty开发系列34--openresty执行流程之4访问阶段 访问阶段 用途:访问权限限制 返回403 nginx:allow 允许,deny 禁止 allow ip:deny ip: 涉及到的网关,有很多的业务 都是在access阶段处理的,有复杂的访问权限控制nginx:allow deny 功能太弱 一)access_by_lua语法:access_by_lua <lua-script-str>语境:http,server,location,location if阶段:acc…
openresty开发系列33--openresty执行流程之3重写rewrite和重定向 重写rewrite阶段 1)重定向2)内部,伪静态 先介绍一下if,rewrite指令 一)if指令语法:if (condition){...}默认值:无作用域:server,location对给定的条件condition进行判断.如果为真,大括号内的指令将被执行. 上面的if和(之间需要留空格,否则会报错. 1)条件可以为一个变量 如果一个变量名进行条件判断,空字符串'' 或 字符串为'0',都表示为假…
openresty开发系列33--openresty执行流程之2重写赋值阶段 一)重写赋值阶段 1)set_by_lua 语法:set_by_lua $res <lua-script-str> [$arg1 $arg2 …]语境:server.server if.location.location if阶段:rewrite 设置nginx变量,我们用的set指令即使配合if指令也很难实现负责的赋值逻辑: 传入参数到指定的lua脚本代码中执行,并得到返回值到res中.<lua-script…
openresty开发系列32--openresty执行流程之初始化阶段 一)初始化阶段 1)init_by_lua   init_by_lua_block     init_by_lua_file语法:init_by_lua <lua-script-str>语境:http阶段:loading-config当nginx master进程在加载nginx配置文件时运行指定的lua脚本,通常用来注册lua的全局变量或在服务器启动时预加载lua模块: [root@node5 conf]# cat n…
openresty开发系列20--lua的时间操作 在 Lua 中,函数 time.date 和 difftime 提供了所有的日期和时间功能.在 OpenResty 的世界里,不推荐使用这里的标准时间函数,因为这些函数通常会引发不止一个昂贵的系统调用,同时无法为 LuaJIT JIT 编译,对性能造成较大影响.推荐使用 ngx_lua 模块提供的带缓存的时间接口,如 ngx.today, ngx.time, ngx.utctime, ngx.localtime, ngx.now, ngx.ht…
openresty开发系列40--nginx+lua实现获取客户端ip所在的国家信息 为了实现业务系统针对不同地区IP访问,展示包含不同地区信息的业务交互界面.很多情况下系统需要根据用户访问的IP信息,判断用户可能的访问区域,针对不同的区域提供个性化的服务内容.本方案在CentOS7.6环境下基于高性能的Openresty1.13.6.1来实现. 方案介绍 要通过IP地址确认归属地,通常可以使用一些在线查询服务来实现,但使用在线服务查询潜在存在性能问题,同时通过lua来访问外部服务增加额外的代码…
openresty开发系列38--通过Lua+Redis 实现动态封禁IP 一)需求背景为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务. 二)设计方案实现 IP 黑名单的功能有很多途径:1.在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求:2.在 Web Server 层面,通过 Nginx 自身的 deny 选项 或者 lua 插件 配置 IP 黑名单:3.在应用层面,在请求服务之前检查一遍客户端 IP…
openresty开发系列37--nginx-lua-redis实现访问频率控制 一)需求背景 在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次在openresty中,可以找到:set_by_lua,rewrite_by_lua,access_by_lua,content_by_lua等方法.那么访问控制应该是,access阶段.我们用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求. 二)设计方案 我们用redis的key表示…
openresty开发系列31--openresty执行流程 我们先看个例子 location /test {    set $a 32;    echo $a;    set $a 56;    echo $a;} echo nginx第三方模块,是用于做响应输出 输出了 56 Nginx 处理每一个用户请求时,都是按照若干个不同阶段依次处理的.而不是根据配置文件上的顺序. 之上的例子 涉及到了 两个阶段  rewrite和content阶段 set属于rewrite阶段echo属于conte…
openresty开发系列30--openresty中使用全局缓存 Nginx全局内存---本地缓存 使用过如Java的朋友可能知道如Ehcache等这种进程内本地缓存.Nginx是一个Master进程多个Worker进程的工作方式,因此我们可能需要在多个Worker进程中共享数据. 使用ngx.shared.DICT来实现全局内存共享. 一)首先在nginx.conf的http部分分配内存大小 语法:lua_shared_dict <name> <size> 该命令主要是定义一块…
openresty开发系列29--openresty中发起http请求 有些场景是需要nginx在进行请求转发 用户浏览器请求url访问到nginx服务器,但此请求业务需要再次请求其他业务:如用户请求订单服务获取订单详情,可订单详情中需要返回商品信息,也就需要再请求商品服务获取商品信息:这样就需要nginx需要有发起http请求的能力,而不是让用户浏览器再次请求商品信息 nginx服务发起http请求区分内部请求 和 外部请求 图解 下面我们就介绍一下,openResty中如何发起http请求?…
openresty开发系列28--openresty中操作mysql Mysql客户端   应用中最常使用的就是数据库了,尤其mysql数据库,那openresty lua如何操作mysql呢?   默认安装OpenResty时已经自带了该模块. 案例,mysql数据库的常用操作,编辑testmysql.lua # centos7中安装mariadb# yum install -y mariadb-server mariadb# systemctl start mariadb-server# 设…
openresty开发系列27--openresty中封装redis操作 在关于web+lua+openresty开发中,项目中会大量操作redis, 重复创建连接-->数据操作-->关闭连接(或放到连接池)这个完整的链路调用完毕,甚至还要考虑不同的 return 情况做不同处理,就很快发现代码中有大量的重复 推荐一个二次封装的类库---------------------------------# 加入openresty的lib库目录# vim openresty/lualib/resty/…
openresty开发系列26--openresty中使用redis模块 在一些高并发的场景中,我们常常会用到缓存技术,现在我们常用的分布式缓存redis是最知名的, 操作redis,我们需要引入redis模块 require "resty.redis": 我们现在做个可以操作redis进行赋值,读值的案例 一)连接redis服务器 ---定义 redis关闭连接的方法local function close_redis(red)      if not red then       …
openresty开发系列25--openresty中使用json模块 web开发过程中,经常用的数据结构为json,openresty中封装了json模块,我们看如何使用 一)如何引入cjson模块,需要使用requirelocal json = require("cjson") json.encode 将表格数据编码为 JSON 字符串格式:jsonString = json.encode(表格对象)用法示例: table 包含哈希键值对 和 数组键值对 -------------…
openresty开发系列24--openresty中lua的引入及使用 openresty 引入 lua 一)openresty中nginx引入lua方式 1)xxx_by_lua   --->字符串编写方式  2) xxx_by_lua_block ---->代码块方式  3) xxx_by_lua_file  ---->直接引用一个lua脚本文件 我们案例中使用内容处理阶段,用content_by_lua演示 -----------------编辑nginx.conf-------…
openresty开发系列23--lua面向对象 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构.java,c++,.net等都支持面向对象 面向对象特征1) 封装:指能够把一个实体的信息.功能.响应都装入一个单独的对象中的特性.2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,    而新功能也得以扩展.这有利于减少重复编码,提高软件的开发效率.3) 多态:同一操作作用于不同的对象,可以有不同的解…
openresty开发系列22--lua的元表 举个例子,在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作. 那如何计算两个table的相加操作a+b? local t1 = {1,2,3}local t2 = {4,5,6} local t3 = t1 + t2   ---->  {1,2,3,4,5,6} 类似java的一些操作重载 这种类似的需求,lua 提供了元表(Metatable)和元方法,允许我们改变table的行为,每个…
openresty开发系列21--lua的模块 从lua5.1开始,Lua 加入了标准的模块管理机制,Lua 的模块是由变量.函数等已知元素组成的 table, 因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量.函数放入其中,最后返回这个 table 就行. 一)模块定义 模块的文件名 和 模块定义引用名称要一致 -- 文件名为 model.lua-- 定义一个名为 model 的模块model = {} -- 定义一个常量model.constant = "这是一个常量&…
openresty开发系列19--lua的table操作 Lua中table内部实际采用哈希表和数组分别保存键值对.普通值:下标从1开始 不推荐混合使用这两种赋值方式. local color={first="red", "blue", third="green", "yellow"} print(color["first"])                 --> output: redprint…
openresty开发系列18--lua的字符串string操作 string的相关操作 1)string.upper(s)接收一个字符串 s,返回一个把所有小写字母变成大写字母的字符串.print(string.upper("Hello Lua"))  -->output  HELLO LUA 2)string.lower(s)接收一个字符串 s,返回一个把所有大写字母变成小写字母的字符串.print(string.lower("Hello Lua")) …
openresty开发系列16--lua中的控制结构if-else/repeat/for/while 一)条件 - 控制结构 if-else if-else 是我们熟知的一种控制结构.Lua 跟其他语言一样,提供了 if-else 的控制结构. )单个 if 分支 型 if 条件 then --body end 条件为真 ,执行if中的body ----------------------- x = then print("分支一") end ---- x = ) then print…
openresty开发系列15--lua基础语法4表table和运算符 lua中的表table 一)table (表)Table 类型实现了一种抽象的"关联数组".即可用作数组,也可以用作map.lua中没有数组和map,都是用table这个类型 --数组java   int[] intArr = new int[]{1,2,3,4,5,6};intArr[0]intArr[1]--map----> key value HashMap mapmap.add(key,value)…
openresty开发系列14--lua基础语法3函数 一)function (函数) 有名函数: optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)    function_body    return result_params_comma_separatedend optional_function_scope: 该参数是可选的制定函数是全局函数还是局部…
openresty开发系列13--lua基础语法2常用数据类型介绍 一)boolean(布尔)布尔类型,可选值 true/false: Lua 中 nil 和 false 为"假",其它所有值均为"真".比如 0 和空字符串就是"真": local a = truelocal b = 0local c = nil if a then    print("a")        -->output:aelse    prin…
openresty开发系列12--lua介绍及常用数据类型简介 lua介绍  1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的月亮.事实证明她没有糟蹋这个优美的单词,Lua 语言正如它名字所预示的那样成长为一门简洁.优雅且富有乐趣的语言.  Lua 从一开始就是作为一门方便嵌入…
openresty开发系列11--openresty的api入门 1)ngx_lua模块的hello world编辑nginx下conf配置文件nginx.conf# vi nginx.conf在server模块加上location /helloworld {    default_type text/html;    content_by_lua 'ngx.say("hello world")';} 检查配置文件是否正确# /usr/local/openresty/nginx/sbi…
openresty开发系列10--openresty的简单介绍及安装 一.Nginx优点 十几年前,互联网没有这么火,软件外包开发,信息化建设,帮助企业做无纸化办公,收银系统,工厂erp,c/s架构偏多 Nginx设计为一个主进程多个工作进程的工作模式,每个进程是单线程来处理多个连接,而且每个工作进程采用了非阻塞I/O来处理多个连接,从而减少了线程上下文切换,从而实现了公认的高性能.高并发;因此在生成环境中会通过把CPU绑定给Nginx工作进程从而提升其性能;另外因为单线程工作模式的特点,内存占…