nginx + lua 实现 waf
· 阅读需 14 分钟
Lua脚本基础语法
lua是一个简介、轻量、可扩展的脚本语言
nginx + lua的优势:
- 充分的结合 Nginx 的并发处理epoll优势和Lua的轻量实现简单的功能且高并发的场景
//epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
- 场景:
- 统计IP
- 统计用户信息
- 安全WAF
安装lua
~]# yum install lua -y
lua的运行
~]# lua
> print("hello world")
~]# which lua
/usr/bin/lua
~]# vim test.lua
#!/usr/bin/lua
print("hello world")
print("test:",a)
~]# lua ./test.lua
Lua的注释
行注释:
--print("hi,boy")
多行注释:
--[[
xxxxxxx
]]
Lua的基础语法
变量定义
a = 123
~]# vim test.lua
#!/usr/bin/lua
print("test:",a) #不加$
~]# lua ./test.lua
while循环
~]# cat while.lua
#!/usr/bin/lua
sum =0
num =1
while num <= 100 do
sum = sum + num
num = num + 1
end
print("sum=",sum)
//执行结果
~]# lua while.lua
sum = 5050
for循环
~]# cat for.lua
#!/usr/bin/lua
sum = 0
for i = 1,100 do
sum = sum + 1
end
print("sum=",sum)
//执行结果
~]# lua for.lua
sum = 100
if 判断
~]# cat if.lua
#!/usr/bin/lua
if age == 40 and sex == "Man" then
print("男人大于40")
elseif age > 60 and sex ~= "Women" then
print("非女人而且大于60")
else
local age = io.read()
print("Your age is"..age)
end
// ~= 是不等于
// 字符串的拼接操作符 ".."
// io库的分别从stdin和stdout读写,read和write函数
Nginx加载Lua环境
默认情况下Nginx不支持Lua模块,需要安装luaJIT解释器,并且需要重新便宜Nginx,可选择使用openrestry
LuaJIT
Ngx_devel_kit 和 lua-nginx-module
环境准备
~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel openssl-devel
下载最新工具包
下载最新的luajit 和 ngx_devel_kit 以及 lua-nginx-module:
~]# mkdir -p /soft/src && cd /soft/src
~]# wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
~]# wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
~]# wget https://github.com/openresty/lua-nginx-module/archive/v0.9.16.tar.gz ##视频中后又修改为v0.10.13.tar.gz