openresty学习笔记(windows版),nginx+lua学习笔记——不停更新【伸手党福利】


由于公司需要构建软waf(根据应用出口进行防护),在已经有各类标准防火墙以及各种防护的情况下,按照应用特色进行高级防护,以达到在应用访问层面上防住嗅探和漏扫攻击以及特色攻击(比如0day漏洞)的目的。
最终要求实现一个联动的防火墙配置,选用了openresty作为技术栈。
由于本人也是从网络上各类资源当中搜集资料,lua这种小众语言(相对于java、php等大佬来说)没有太好的生态,特此发文记录学习过程以及笔记。本文不断更新,愿意一起学习的可以评论中交流共勉。
邮箱wwppp987@qq.com,有需求的可以发邮件或者私信交流。谢谢!

环境搭配入门

技术环境:Windows10、openresty、idea/HbuilderX。
(别问我为啥不是linux,问就是嫌麻烦。)
学习版本,直接放教程。想深入研究的,请找相应详细链接(本文涉及的教程和文章链接都会注明出处,请放心食用)。
程序下载地址:
http://openresty.org/cn/download.html
官网教程(纯英文的,使用谷歌翻译看完了,帮助有限)
https://github.com/openresty/lua-nginx-module#name
中文技术文档(喜欢啃书的建议直接看)
https://www.runoob.com/lua/lua-basic-syntax.html

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最佳案例 | 汇总(从中选择第四篇开始看即可,有利于提高自信心)
https://blog.csdn.net/forezp/article/details/78616856
第四篇直通车:
https://blog.csdn.net/weixin_30644369/article/details/98955888
中文技术文档(喜欢啃书的建议直接看)【刚才放出来了,再放一遍,真的很重要】
https://www.runoob.com/lua/lua-basic-syntax.html

OpenResty(nginx+lua) 开发入门(看出来了,作者是真的试图教懂我们)
https://blog.csdn.net/enweitech/article/details/78519398

官方维基教程(经常打不开,各种小毛病)
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 接口详解(简易进阶)
https://www.cnblogs.com/tinywan/p/6538006.html
学习使用nginx echo模块(中等进阶)
https://xuexb.com/post/nginx-echo-module.html?utm_source=tuicool&utm_medium=referral#toc-e65
OpenResty+Lua限流实战
https://blog.csdn.net/xvktdmjg/article/details/115100592

个人学习笔记

基础函数

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

效果
在这里插入图片描述
postman中:
在这里插入图片描述

注释

在这里插入图片描述

循环

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  

https://www.runoob.com/lua/lua-for-loop.html

条件判断

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开始的。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值