Openrestry(Nginx+Lua)之WAF实现
<div class="page-date">
<span id="busuanzi_container_page_pv"> | 本文阅读量:<span id="busuanzi_value_page_pv"></span>次</span>
</div>
</div>
<h1 id="openrestry简介">openrestry简介:</h1>
OpenResty®是一个基于Nginx与Lua的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty®通过汇聚各种设计精良的 Nginx 模块(主要由 ...
nginx+lua动态改变upstream
在做毕设的时候需要动态改变通过nginx代理的服务器数量。背景大概是我有一个generator不断产生负载打在nginx上,还有一个monitor根据generator生成负载的qps来动态决定需要多少台服务器刚好能够承担这个qps的请求,因此需要动态修改nginx中的upstream。以前在配置nginx的时候,upstream都是写死在nginx.conf文件中的,现在要动态改变upstream,这需要在nginx运行过程中用脚本修改,那么就用Lua来实现吧。
nginx+lua安装之前安装过了nginx,但是没有安装lua模块,下面按照官网的步骤开始集成Lua。需要下载:
LuaJIT:Lua编译器(a Just-In-Time Compiler for Lua),2.0或2.1版本均可
ngx_devel_kit (NDK) module
lua-nginx-module
安装好LuaJIT,解压NDK module和lua-nginx-module,继续。
123456789101112131415 cd ~/work/nginx-1.12.1# 告诉nginx编译程序在 ...
Coroutine协程
Coroutine Manipulation
coroutine.create (f)
Creates a new coroutine, with body f. f must be a function. Returns this new coroutine, an object with type “thread”.
创建一个新的协程。f必须是一个函数。返回值是这个新的协程,返回值的类型是thread。
coroutine.isyieldable ()
Returns true when the running coroutine can yield.
A running coroutine is yieldable if it is not the main thread and it is not inside a non-yieldable C function.
返回true当正在运行的协程可以被yield。
coroutine.resume (co [, val1, ···])
Starts or continues the execution of coroutine ...
Lua 有趣的语法特性
使用函数作为函数返回
table关联数组的多种访问形式
table计数的问题
函数其实也是变量
local 和 global 函数在调用的时候会有所区别
可变参数(5.1)
参数默认值
三元表达式
不同变量类型比较时不存在自动转换
只有 nil 和 false 是假,0,{},"" 都是真
for循环
对象方法的调用
函数多个返回值
泛型调用和 unpack
高级函数 和 函数的本质
多行字符串
使用函数作为函数返回1234567891011121314function (t) local i = 0 local n = table.getn(t) return function () i=i+1 if i <= n then return t[i] end endendt = {1,2,7,8}for e in list_iter(t) do print(e)end
table关联数组的多种访问形式12345u = {name=rming,age=25,hello='hi ...
Lua中关于table对象引用传递的注意事项
最近写了挺长一段时间的Lua,发现Lua这个语言真的是很随意,产生这种感觉的根本原因应该是它把“函数” 作为了“第一类值”,也就是说函数也可以作为变量的“值”,这使得Lua可以随处定义函数,进而改变逻辑的走向,整个流程任你摆布。
虽说把一个函数来回设置方便了许多,但是同样带来了一些不容易发现的问题,如果搞不清定义域和引用关系,常常会导致程序错误,比如最近用Lua写按钮的触发事件时,使用公有函数创建了对应的闭包,一开始感觉table的引用有问题,写了很多中转的代码,最后发现直接就可以使用,浪费了不少时间,最后仔细分析就是闭包最根本的形式,只不过被业务逻辑给干扰了视线,接下来我们一起看看,table和闭包究竟会发生什么关系!
代码测试
table作为函数参数时的操作
123456789101112131415print("nexample 1:");data_table = {a = 1, b = 2, 3, 4, 5, 6};function (data_tb) for k,v in pairs(data_tb) do if v % 2 == 0 th ...
lua中的表及面向对象
在lua中,只有唯一的一种数据结构,表。通过表,却可以用来实现类一样的形式,其关键是对于表的元方法的使用,可以有很多奇妙的用处。
Lua中,所有的值都可以有一个有一个元表(metatable),元表中的元素定义了对于值特定操作的方法,就叫做元方法。当然,这些元表是有默认值的,但我们可以通过改变值元表中的元方法来进行特定操作行为的改变。
可以通过setmetatable()函数来修改一个表的元表,而其他类型的值元表只能通过 C API来改变。
默认情况下,值是没有元表的,所以我们手动去设置,但 string库为字符串类型设置了一个元表。
表tablelua中没有复杂的数据结构,只有表。通过代码:
t = {}
就建立了一个表。可以验证,其确实是没有元表的:
print(getmetatable(t))
getmetatable()用来获取一个表的元表。
输出将是nil。而对于字符串:
print(getmetatable("hello world")
其输出会是类似table: 0x ...这样。表示其有一个元表。
元表的元素一个完整的元表,看起来应该是这样的:
...
Lua 学习 chapter22
目录
具有动态名称的全局变量
非全局环境
环境和模块
只有疯狂过,你才知道自己究竟能不能成功。
具有动态名称的全局变量
在lua中,所有的全局变量都被存在_G中,通过_G[name]可以访问到任意一个全局变量。在lua中,全局变量不需要声明就可以直接使用,但是这个可能会造成非常难以查询的bug,所以我们可以对全局变量进行简单的封装。
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
setmetatable(_G, {
__newindex = function(_, n)
error("attempt to write to undeclared variable" .. n, 2)
end,
__index = function(_, n)
error("attempt to read undeclared variable" ...
Lua中的函数和闭包
<div class="wrap-content">
<p>当Lua<strong>编译一个函数的时候,会产生一个prototype</strong>,这个prototype包含了这个函数的<strong>虚拟机器指令</strong>、<strong>常量值</strong>和<strong>一些调试信息</strong>。</p>
在运行的时候,任何时候,Lua执行一个function…end表达式的时候,会为这个函数创建一个新的闭包(closure)。
每一个闭包包含“两个引用和一个引用数组”:
对prototype的引用
对闭包环境的引用(这个环境是一个table,通过它可以查找全局变量)
对upvalue的引用构成的数组,可以通过这些引用来访问外部的local变量
词法作用域和一流函数的结合为对外部的local变量的访问带来的困难。
add函数 调用 ...
Lua基础
Lua是一种灵活小巧的脚本语言,可以被嵌入应用程序中,为应用程序提供灵活的扩展和定制功能。
注释单行注释12print("Hello World!") -- 另一个单行注释
多行注释1234--[[ 多行注释 另一个多行注释--]]
变量变量标识符Lua的变量标识符用大小写字母、下划线、数字等组成,必须用字母或下划线作为开头。最好不要使用下划线加大写字母的标示符,以免与Lua的保留字冲突。在Lua的变量标识符中,字母需要区分大小写。一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION等)被保留用于 Lua 内部全局变量,_G表示全局作用域,后边还会提到。
变量作用域Lua中作用域分为三种:全局作用域、局部作用域、表内作用域。声明变量时会默认使用全局作用域;声明局部变量需要显式的在变量名之前加上Local关键字。表(table)中存储的是键值对,可以根据键名来获取对应的值。
12345var1 = 1 -- 全局local var2 = 2 -- 局部table1= {}var3 = "key3"table1.var3 = ...
Lua类的实现思路
复习下lua的元表元方法,浅尝辄止。
目标是用lua实现以下C++例子的功能。123456789101112131415161718192021222324252627class {public: std::string mName; Anima(){} Anima(const std::string& str) : mName(str) {} void SetName(const std::string& str); std::string GetName();};class Dog : public Anima{public: std::string mOwnerName; Dog(){} Dog(const std::string& str) : Anima(str) {} void SetOwnerName(const std::string& str); std::string GetOwnerName() void PlayBall();}Dog dog(std::string("旺财"));dog.SetOwnerName( ...