Nginx之旅-Nginx与Lua的开发

Lua简介

Lua是一个简洁、轻量、可扩展的脚本语言 Lua教程

NginxLua的结合能够充分结合Nginx的并发处理epoll优势和Lua的轻量实现简单的功能且高并发的场景。

Lua 基础语法

安装解释器

1
[root@hongshaorou ~]# yum install lua

可以直接在shell环境下运行

1
2
3
4
[root@hongshaorou ~]# lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print("hello world")
hello world

也可以执行脚本

1
2
3
4
5
6
7
8
9
10
11
# test.lua
#!/usr/bin/lua
print("hello world")

[root@hongshaorou ~]# lua test.lua
hello world

# 或者赋予执行权限
[root@hongshaorou ~]# chmod a+rx test.lua
[root@hongshaorou ~]# ./test.lua
hello world

注释

1
2
3
4
--  行注释
--[[
块注释
--]]

变量

1
2
3
4
a = 'alo\n123"'
a = "alo\n123\""
a = "\97lo\10\04923"' # 包括AscII码
a = [[alo123"]]

布尔值只有nilfalsefalse,数字0,''空字符串(’\0`’)都是true。

lua中的变量如果没有特殊说明,全是全局变量,局部变量前面加个local。

while循环语句

1
2
3
4
5
6
7
sum = 0 
num = 1
while num <= 100 do
sum = sum + num
num = num + 1
end
print("sum = ", sum)

Lua没有 ++ 或是 +=这样的操作

if-else判断语句

1
2
3
4
5
6
7
8
if age == 40 and sex == "Male" then 
print("大于40的男人")
elseif asg > 60 and sex ~= "Femal" then
print("非女人且大于60")
else
local age = io.read()
print("Your age id"..age)
end

~=是不等于

字符串拼接操作符是..

io库分别从stdinstdout读写的函数为readwrite

Nginx + Lua环境

因为Nginx默认是不支持Lua的扩展模块的,我们需要下载一个笔Lua更高效的解释器–LuaJIT。

  1. 安装LuaJIT环境,比自带的lua解析器扩展模块多并且高效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@xiaoyang download]# wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
--2020-12-08 00:20:23-- http://luajit.org/download/LuaJIT-2.0.2.tar.gz
Resolving luajit.org (luajit.org)... 163.172.177.144
Connecting to luajit.org (luajit.org)|163.172.177.144|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 843031 (823K) [application/octet-stream]
Saving to: ‘LuaJIT-2.0.2.tar.gz’

100%[==================================================================================================================>] 843,031 5.66KB/s in 4m 46s

2020-12-08 00:25:11 (2.88 KB/s) - ‘LuaJIT-2.0.2.tar.gz’ saved [843031/843031]

[root@xiaoyang download]# tar -zxvf LuaJIT-2.0.2.tar.gz

[root@xiaoyang download]# cd LuaJIT-2.0.2/

[root@xiaoyang LuaJIT-2.0.2]# ls
COPYRIGHT doc dynasm etc Makefile README src

[root@xiaoyang LuaJIT-2.0.2]# make install PREFIX=/usr/local/LuaJIT

[root@xiaoyang LuaJIT-2.0.2]# export LUAJIT_LIB=/usr/local/LuaJIT/lib

[root@xiaoyang LuaJIT-2.0.2]# export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0

下载ngx_devel_kit和lua-nginx-module

1
2
3
4
5
6
7
8
9
[root@xiaoyang LuaJIT-2.0.2]# cd /opt/download

[root@xiaoyang download]# wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz

[root@xiaoyang download]# tar -zxvf v0.3.0.tar.gz

[root@xiaoyang download]# wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz

[root@xiaoyang download]# tar -zxvf v0.10.9rc7.tar.gz
  1. 重新编译Nginx 将ngx_devel_kit模块和lua-nginx-module模块编译进nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看已经编译的模块
nginx -V

# 下载nginx
[root@xiaoyang download]# wget http://nginx.org/download/nginx-1.12.1.tar.gz

[root@xiaoyang download]# tar -zxvf nginx-1.12.1.tar.gz

[root@xiaoyang download]# cd /opt/download/nginx-1.12.1

[root@xiaoyang download]# ./configure --prefix=/etc/nginx ...(省略其他编译项) --add-module=/opt/download/ngx_devel_kit-0.3.0 --add-module=/opt/download/lua-nginx-module-0.10.9rc7

[root@xiaoyang download]# make && make install

添加ngx_devel_kit模块和lua-nginx-module模块添加到编译参数

加载lua库,加入到ld.so.conf文件

1
2
[root@xiaoyang LuaJIT-2.0.2]# echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
[root@xiaoyang LuaJIT-2.0.2]# ldconfig
nginx调用lua模块指令

nginx的可插拔模块化加载执行,共11个处理阶段

参数 描述
set_by_lua
set_by_lua_file
设置nginx变量,可以实现复杂的复杂逻辑
access_by_lua
access_by_lua_file
请求访问阶段处理,用于访问控制
content_by_lua
content_by_lua_file
内容处理容器,介绍请求处理并输出响应

File 表示Lua文件

Lua调用nginx的api
api 描述
ngx.var nginx变量
ngx.req.get_headers 获取请求头
ngx.req.get_uri_args 获取url请求参数
ngx.redirect 重定向
ngx.print 输出响应内容体
ngx.say 通ngx.print,但是最后会输出一个换行符
ngx.header 输出响应头
灰度发布

按照一定的关系区别 分部分的代码进行上线 使代码的发布能平滑过渡线上

我们可以使用以下场景区分用户访问不同的代码

  1. 用户的信息cookie等信息区别
  2. 根据用户的ip地址

DzryOs.png

上面的一个灰度发布使用Lua访问memcache进行查询校验哪些IP能够访问新的代码。

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!