目录

  • 环境搭配入门
  • openresty的Windows版启动方法以及HelloWorld:
  • 1、下载解压后修改以下文件
  • 2、新建文件:
  • 3、启动nginx.exe
  • 4、调试时候使用cmd输入命令
  • 成功截图(浏览器,极速模式):
  • 基础学习
  • 参考资料(从上到下按推荐度及复杂度排序)
  • 个人学习笔记
  • 基础函数
  • 注释
  • 循环
  • 条件判断
  • Lua 字符串
  • 字符串查找关键字
  • 转换为ascii码
  • 字符串长度
  • 字符串截取
  • 字符串格式化
  • 数组


由于公司需要构建软waf(根据应用出口进行防护),在已经有各类标准防火墙以及各种防护的情况下,按照应用特色进行高级防护,以达到在应用访问层面上防住嗅探和漏扫攻击以及特色攻击(比如0day漏洞)的目的。


最终要求实现一个联动的防火墙配置,选用了openresty作为技术栈。


由于本人也是从网络上各类资源当中搜集资料,lua这种小众语言(相对于java、php等大佬来说)没有太好的生态,特此发文记录学习过程以及笔记。本文不断更新,愿意一起学习的可以评论中交流共勉。

环境搭配入门

技术环境:Windows10、openresty、idea/HbuilderX。
(别问我为啥不是linux,问就是嫌麻烦。)
学习版本,直接放教程。想深入研究的,请找相应详细链接(本文涉及的教程和文章链接都会注明出处,请放心食用)。
.

openresty的Windows版启动方法以及HelloWorld:

1、下载解压后修改以下文件

openresty-1.21.4.1rc1-win64\conf\nginx.conf

location / {
	#修改为直接返回text模式,而不是返回文件。默认配置在极速模式下得浏览器会形成下载文件
	default_type text/html;
	#关闭缓存模式,每次都读取lua文件,不使用已经缓存的lua文件(修改nginx.conf文件还是要重启的)
	lua_code_cache off;
	#在返回节点加载lua文件(相对路径即可)
	content_by_lua_file lua/hello.lua;
}

2、新建文件:

\openresty-1.21.4.1rc1-win64\lua\hello.lua

ngx.say('hello world!!!')

3、启动nginx.exe

4、调试时候使用cmd输入命令

nginx -s -reload

效果截图:

openresty window openresty windows重启_openresty window


提示为告警:已关闭缓存模式

成功截图(浏览器,极速模式):

openresty window openresty windows重启_windows_02

基础学习

参考资料(从上到下按推荐度及复杂度排序)

首推:

Openresty最佳案例 | 汇总(从中选择第四篇开始看即可,有利于提高自信心)

第四篇直通车:

中文技术文档(喜欢啃书的建议直接看)【刚才放出来了,再放一遍,真的很重要】
https://www.runoob.com/lua/lua-basic-syntax.html

OpenResty(nginx+lua) 开发入门(看出来了,作者是真的试图教懂我们)

官方维基教程(经常打不开,各种小毛病)
https://wiki.jikexueyuan.com/project/openresty/README.html

腾讯出品(Lua语言、Nginx语言技术文档)【全面、晦涩】腾讯云文档,各类教程从bootstrap到Yii都在里面。很全面,嗯……只能说很全面……(但是没有针对openresty的)
https://cloud.tencent.com/developer/section/1489385 进阶:
Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解(简易进阶)
学习使用nginx echo模块(中等进阶)
https://xuexb.com/post/nginx-echo-module.html?utm_source=tuicool&utm_medium=referral#toc-e65 OpenResty+Lua限流实战

个人学习笔记

基础函数

lua文件:

--获取url中a的值
ngx.say(ngx.var.arg_a);
--获取主机名
ngx.say(ngx.var.remote_addr);
--获取get和post参数
local arg = ngx.req.get_uri_args()
for k,v in pairs(arg) do
   ngx.say("[GET ] key:", k, " v:", v)
end

ngx.req.read_body() -- 解析 body 参数之前一定要先读取 body
local arg = ngx.req.get_post_args()
for k,v in pairs(arg) do
   ngx.say("[POST] key:", k, " v:", v)
end

效果

openresty window openresty windows重启_nginx_03


postman中:

openresty window openresty windows重启_nginx_04

注释

openresty window openresty windows重启_字符串_05

循环

for循环

for var=exp1,exp2,exp3 do  
    <执行体>  
end

为每个数组元素循环(泛型for循环)

--days为table型,可以理解为数组。

days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} 
for i,v in ipairs(days) do 
 print(v) 
 end

.

条件判断

lua当中,false和nil为假,0为真。

--[ 0 为 true ]
if(0)
then
    print("0 为 true")
end

if句式

if(布尔表达式)
then
   --[ 布尔表达式为 true 时执行该语句块 --]
else
   --[ 布尔表达式为 false 时执行该语句块 --]
end

if-elseif句式

if( 布尔表达式 1)
then
   --[ 在布尔表达式 1 为 true 时执行该语句块 --]

elseif( 布尔表达式 2)
then
   --[ 在布尔表达式 2 为 true 时执行该语句块 --]

elseif( 布尔表达式 3)
then
   --[ 在布尔表达式 3 为 true 时执行该语句块 --]
else 
   --[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
end

if-if句式

if( 布尔表达式 1)
then
   --[ 布尔表达式 1 为 true 时执行该语句块 --]
   if(布尔表达式 2)
   then
      --[ 布尔表达式 2 为 true 时执行该语句块 --]
   end
end

Lua 字符串

字符串或串(String)是由数字、字母、下划线组成的一串字符。

Lua 语言中字符串可以使用以下三种方式来表示:

单引号间的一串字符。
双引号间的一串字符。
[[ 与 ]] 间的一串字符。

字符串查找关键字

string.find("Hello Lua user", "Lua", 1)

返回79 参数1删除无影响,有2个以上的关键字只返回第一个。

转换为ascii码

string.byte("A")

返回65

字符串长度

string.len("abc")

返回3

字符串截取

-- 索引越界,输出原始字符串
local fourth_sub = string.sub(sourcestr, -100)
print("\n第四次截取", string.format("%q", fourth_sub))

注意,对于输入的字符串一定要使用string.format("%q", strings)其中%q意为修改为lua语言能够安全读取的格式

字符串格式化

Lua 提供了 string.format() 函数来生成具有特定格式的字符串, 函数的第一个参数是格式 , 之后是对应格式中每个代号的各种数据。

由于格式字符串的存在, 使得产生的长字符串可读性大大提高了。这个函数的格式很像 C 语言中的 printf()。

以下实例演示了如何对字符串进行格式化操作:

格式字符串可能包含以下的转义码:

  • %c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
  • %d, %i - 接受一个数字并将其转化为有符号的整数格式
  • %o - 接受一个数字并将其转化为八进制数格式
  • %u - 接受一个数字并将其转化为无符号整数格式
  • %x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
  • %X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
  • %e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
  • %E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
  • %f - 接受一个数字并将其转化为浮点数格式
  • %g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
  • %q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
  • %s - 接受一个字符串并按照给定的参数格式化该字符串

为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:

  • (1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
  • (2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
  • (3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
  • (4) 宽度数值
  • (5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.

实例

string1 = "Lua"
string2 = "Tutorial"
number1 = 10
number2 = 20
-- 基本字符串格式化
print(string.format("基本格式化 %s %s",string1,string2))
-- 日期格式化
date = 2; month = 1; year = 2014
print(string.format("日期格式化 %02d/%02d/%03d", date, month, year))
-- 十进制格式化
print(string.format("%.4f",1/3))

结果:

基本格式化 Lua Tutorial
日期格式化 02/01/2014
0.3333

数组

array = {"Lua", "Tutorial"}
ngx.say(array[1])

结果:

Lua

注意:在lua中,数组角标是从1开始的。