Nginx中的Lua介绍09
Nginx中的Lua操作简介
Lua
轻量小巧的脚本语言, 可以嵌入到其他应用程序中, 提供灵活的扩展定制功能
可用于游戏开发、独立应用脚本、文本应用脚本、扩展和数据库插件、系统安全上
安装lua
1 | wget https://www.lua.org/ftp/lua-5.4.1.tar.gz |

Lua语法
命令行运行与脚本式运行


1 | #! /usr/local/bin/lua |
注释
**单行注释 **
1 | -- print('hello,lua!!!') |
多行注释
1 | --[[ |
取消多行注释
第一个注释符前加一个 -
1 | ---[[ |
标识符
变量名可以使用字母数字下划线, 由于lua保留字使用下划线加大写字母, 如_VERSION , 应避免冲突
关键字
| and | break | do | else |
|---|---|---|---|
| elseif | end | false | for |
| function | if | in | local |
| nil | not | or | repeat |
| return | then | true | until |
| while | goto |
运算符
| 算术运算符 | 关系运算符 | 逻辑运算符 | 其他运算符 |
|---|---|---|---|
+ 加法 |
== 等于 |
and 逻辑与 && |
.. 字符串连接 |
- 减法 |
~= 不等于 |
or 逻辑或 ` |
|
* 乘法 |
> 大于 |
not 逻辑非 ! |
|
/ 除法 |
< 小于 |
||
% 取余 |
>= 大于等于 |
||
^ 乘幂 |
<= 小于等于 |
||
- 负号 |
全局/局部变量
不声明则为全局变量, 若未提前赋值, 默认为nil, 声明局部变量, 需要使用local关键字

数据类型
| 数据类型 | 名称 | 简介 |
|---|---|---|
| nil | 空, 无效值 | 可用于移除变量,只需要将该变量名赋值为nil |
| boolean | 布尔 , true/false | 可用于条件判断, false/nil为假, 其余均为真 |
| number | 数值 | 只包含两种:整型(integer)和双精度浮点型(float) |
| string | 字符串 | 可用单双引号定义, 也可以使用[[ 多行文字 ]] |
| function | 函数 | 使用function关键字定义, 以end结尾 |
| table | 表 | 本质为一种辅助数组, 表示数组,集合,记录等 可以使用用 {}定义, 默认索引从1开始 |
| thread | 线程 | 用于执行协同程序 |
| userdata | 用户数据 | 用于表示由应用程序或C/C++语言库锁创建的类型 |
可以使用type()函数判断给定变量数据类型

function定义及使用
参数可以缺省, 默认为nil, 也可以多传, 多余参数被舍弃

也可以使用可变参数...定义传参

控制结构-条件判断
lua中的条件判断通过if then elseif then else end 完成
1 | -- 语法 |

控制结构-循环语句
whil循环
1 | -- 语法 |
1 | function rangePrint(n) |

repeat循环
1 | -- 语法 |
1 | function rangeRepeat(n) |

for循环
for循环支持数值型循环和泛型循环
数值型for循环
1
2
3
4-- 语法
for i=start,end,step do
循环体
endi 代表当前循环数值, start代表开始数值, end代表结束数值, step代表步长
1
2
3
4
5function rangeStep()
for i=10,50,10 do
print(i)
end
end
泛型for循环
1
2
3
4
5
6
7
8-- 语法
for i,v in ipairs(x) do
循环体
end
-- 或
for i,v in pairs(x) do
循环体
endipairs不会循环非数值型元素, pairs会全部循环
1
2
3
4
5function showArr(x)
for i,v in ipairs(x) do
print(i,v)
end
end

ngx_lua模块
OpenResty文档
1 | https://www.nginx.com/resources/wiki/modules/lua/ |
ngx_lua模块通过将lua解释器集成进Nginx, 可以采用lua脚本实现业务逻辑, 在保证高并发服务能力的同时极大的降低了实现成本
环境搭建
方式一: lua-nginx-module
1.安装LuaJIT
1 | wget https://luajit.org/download/LuaJIT-2.0.5.tar.gz |
2.安装lua-nginx-module
1 | wget https://github.com/openresty/lua-nginx-module/archive/v0.10.16rc4.tar.gz |
3.配置lua路由,查看结果
1 | location /lua{ |

方式二: OpenResty
1 | 官网: https://openresty.org/cn/ |
openresty是一个基于Nginx和Lua的高性能Web平台, 内部集成了Nginx和Lua. 用于方便的搭建处理超高并发, 扩展性极强的动态Web应用服务
1 | wget https://openresty.org/download/openresty-1.15.8.2.tar.gz |
配置lua路由,查看结果
1 | # vim /usr/local/openresty/nginx/conf/nginx.conf |

指令解析

图中 * 作用为:
1 | * : 无, 即 xxx_by_lua, 则后面应该跟的是lua指令 |
初始化阶段指令
init_by_lua*
该指令在每次Nginx重启时执行, 可以完成一些耗时模块的加载, 或初始化全局配置
init_worker_by_lua*
用于启动一些定时任务, 如心跳监测、定时拉取服务器配置等
重写/访问阶段指令
set_by_lua*
用于变量赋值, 该指令每次只能返回一个值, 并赋给指定变量名
rewrite_by_lua*
用于执行内部URL重写或外部重定向, 如伪静态化URL重写, 本阶段在rewrite处理阶段最后默认执行
access_by_lua*
用于访问控制. 如仅允许内网IP访问
ssl_certificate_by_lua*
作用在Nginx和下游服务器开始一个SSL握手操作时, 将允许执行本配置项lua代码
内容处理阶段指令
content_by_lua*
该指令是应用最多的指令, 大部分任务均在本阶段完成, 其他阶段主要是为本阶段准备数据
header_filter_by_lua*
用于设置应答消息的头信息
body_filter_by_lua*
用于对响应数据进行过滤、截断、替换操作
balancer_by_lua*
主要用于实现上游服务器的负载均衡算法
日志阶段指令
log_by_lua*
用于在log请求处理阶段, 用Lua代码处理日志, 但并不替换原有log处理
操作案例
1 | 参考文档: |
1 | 需求: |
1 | # 配置/usr/local/openresty/nginx/conf/nginx.conf文件路由 |
1 | 重启nginx |
