Lua在Nginx的应用 nginx lua开发实战pdf
liebian365 2024-11-14 18:02 28 浏览 0 评论
首发于公众号 后端搬运工《Lua在Nginx的应用》
当 Nginx 标准模块和配置不能灵活地适应系统要求时,就可以考虑使用 Lua 扩展和定制 Nginx 服务。OpenResty 集成了大量精良的 Lua 库、第三方模块,可以方便地搭建能够处理超高并发、扩展性极高的 Web 服务,所以这里选择 OpenResty 提供的 lua-nginx-module 方案。
安装Lua环境
lua-nginx-module 依赖于 LuaJIT 和 ngx_devel_kit。LuaJIT 需要安装,ngx_devel_kit 只需下载源码包,在 Nginx 编译时指定 ngx_devel_kit 目录。
系统依赖库
首先确保系统已安装如下依赖库。
|
安装LuaJIT
首先,安装 LuaJIT 环境,如下所示:
|
设置 LuaJIT 有关的环境变量。
|
下载相关模块
下载 ngx_devel_kit 源码包,如下:
|
接下来,下载 Lua 模块 lua-nginx-module 源码包,为 Nginx 编译作准备。
|
加载Lua模块
Nginx 1.9 版本后可以动态加载模块,但这里由于版本太低只能重新编译安装 Nginx。下载 Nginx 源码包并解压:
|
编译并重新安装 Nginx:
|
配置Nginx环境
现在只需配置 Nginx,即可嵌入 Lua 脚本。首先,在 http 部分配置 Lua 模块和第三方库路径:
|
接着,配置一个 Lua 脚本服务:
|
测试安装和配置是否正常:
|
Lua调用Nginx
lua-nginx-module 模块中已经为 Lua 提供了丰富的 Nginx 调用 API,每个 API 都有各自的作用环境,详细描述见 Nginx API for Lua。这里只列举基本 API 的使用 。
先配一个 Lua 脚本服务,配置文件如下:
|
请求部分
- ngx.var
可以通过ngx.var.var_name形式获取或设置 Nginx 变量值,例如 request_uri、host、request 等。
|
- ngx.req.get_headers()
该方法会以表的形式返回当前请求的头信息。查看请求的头信息:
|
当然,通过 ngx.req.set_header() 也可以设置头信息。
|
- ngx.req.get_uri_args()
该方法以表形式返回当前请求的所有 GET 参数。查看请求 query 为?name=fhb的 GET 参数:
|
同样,可以通过 ngx.req.set_uri_args() 设置请求的所有 GET 参数。
|
- get_post_args()
该方法以表形式返回当前请求的所有 POST 参数,POST 数据必须是 application/x-www-form-urlencoded 类型。查看请求curl --data 'name=fhb' localhost/lua_api的 POST 参数:
|
通过 ngx.req.get_body_data() 方法可以获取未解析的请求 body 体内容字符串。
- ngx.req.get_method()
获取请求的大写字母形式的请求方式,通过 ngx.req.set_method() 可以设置请求方式。例如:
|
响应部分
- ngx.header
通过ngx.header.header_name的形式获取或设置响应头信息。如下:
|
- ngx.print()
ngx.print() 方法会填充指定内容到响应 body 中。如下所示:
|
- ngx.say()
如上述使用,ngx.say() 方法同 ngx.print() 方法,只是会在后追加一个换行符。
- ngx.exit()
以某个状态码返回响应内容,状态码常量对应关系见 HTTP status constants 部分,也支持数字形式的状态码。
|
- ngx.redirect()
重定向当前请求到新的 url,响应状态码可选列表为 301、302(默认)、303、307。
|
其他
- ngx.re.match
该方法提供了正则表达式匹配方法。请求?name=fhb&age=24匹配 GET 参数中的数字:
|
- ngx.log()
通过该方法可以将内容写入 Nginx 日志文件,日志文件级别需同 log 级别一致。
- ngx.md5() | ngx.encode_base64() | ngx.decode_base64()
它们都是字符串编码方式。ngx.md5() 可以对字符串进行 md5 加密处理,而 ngx.encode_base64() 是对字符串 base64 编码, ngx.decode_base64() 为 base64 解码。
Nginx中嵌入Lua
上面讲述了怎么在 Lua 中调用 Nginx 的 API 来扩展或定制 Nginx 的功能,那么编写好的 Lua 脚本怎么在 Nginx 中得到执行呢?其实,Nginx 是通过模块指令形式在其 11 个处理阶段做插入式处理,指令覆盖 http、server、server if、location、location if 这几个范围。
模块指令列表
这里只列举基本的 Lua 模块指令,更多信息参考 Directives 部分。
指令 | 所在阶段 | 使用范围 | 说明 |
init_by_lua | 加载配置文件 | http | 可以用于初始化全局配置 |
set_by_lua | rewrite | server | 复杂逻辑的变量赋值,注意是阻塞的 |
rewrite_by_lua | rewrite | http | 实现复杂逻辑的转发或重定向 |
content_by_lua | content | location | 处理请求并输出响应 |
header_filter_by_lua | 响应头信息过滤 | http | 设置响应头信息 |
body_filter_by_lua | 输出过滤 | http | 对输出进行过滤或修改 |
使用指令
注意到,每个指令都会有*_lua和*_lua_file两个指令,*_lua指令后为 Lua 代码块,而*_lua_file指令后为 Lua 脚本文件路径。下面将只对*_lua指令进行说明。
- init_by_lua
该指令会在 Nginx 的 Master 进程加载配置时执行,所以可以完成 Lua 模块初始化工作,Worker 进程同样会继承这些。
nginx.conf配置文件中的 http 部分添加如下代码:
|
init.lua初始化脚本为:
|
- set_by_lua
我们直接使用 set 指令很难实现很复杂的变量赋值逻辑,而 set_by_lua 模块指令就可以解决这个问题。
nginx.conf配置文件 location 部分内容为:
|
set.lua脚本内容为:
|
上述赋值逻辑,请求 query 为?a=10&b=2时响应内容为 12。
- rewrite_by_lua
可以实现内部 URL 重写或者外部重定向。nginx.conf配置如下:
|
rewrite.lua脚本内容:
|
- access_by_lua
用于访问权限控制。例如,只允许带有身份标识用户访问,nginx.conf配置为:
|
access.lua脚本内容为:
|
- content_by_lua
该指令在 Lua 调用 Nginx 部分已经使用过了,用于输出响应内容。
案例
访问权限控制
使用 Lua 模块对本站的 ES 服务做受信操作控制,即非受信 IP 只能查询操作。nginx.conf配置如下:
|
访问频率控制
在 Nginx 配置文件的 location 部分配置 Lua 脚本基本参数,并配置 Lua 模块指令:
|
Lua 脚本实现频率控制逻辑,使用 Redis 对单位时间内的访问次数做缓存,key 为访问 uri 拼接 token 后的 md5 值。具体内容如下:
|
相关推荐
- go语言也可以做gui,go-fltk让你做出c++级别的桌面应用
-
大家都知道go语言生态并没有什么好的gui开发框架,“能用”的一个手就能数的清,好用的就更是少之又少。今天为大家推荐一个go的gui库go-fltk。它是通过cgo调用了c++的fltk库,性能非常高...
- 旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗
-
这几天老毛桃整理了几个微型Linux发行版,准备分享给大家。要知道可供我们日常使用的Linux发行版有很多,但其中的一些发行版经常会被大家忽视。其实这些微型Linux发行版是一种非常强大的创新:在一台...
- codeblocks和VS2019下的fltk使用中文
-
在fltk中用中文有点问题。英文是这样。中文就成这个样子了。我查了查资料,说用UTF-8编码就行了。edit->Fileencoding->UTF-8然后保存文件。看下下边的编码指示确...
- FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库
-
FLTK(FastLightToolkit)是一个轻量级的跨平台GUI库,特别适用于开发需要快速、高效且简单界面的应用程序。本文将介绍Python中的FLTK库,包括其特性、应用场景以及如何通过代...
- 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
-
IT之家1月29日消息,去年6月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能RISC-V处理器核心——香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后...
- Linux 5.13内核有望合并对苹果M1处理器支持的初步代码
-
预计Linux5.13将初步支持苹果SiliconM1处理器,不过完整的支持工作可能还需要几年时间才能完全完成。虽然Linux已经可以在苹果SiliconM1上运行,但这需要通过一系列的补丁才能...
- Ubuntu系统下COM口测试教程(ubuntu port)
-
1、在待测试的板上下载minicom,下载minicom有两种方法:方法一:在Ubuntu软件中心里面搜索下载方法二:按“Ctrl+Alt+T”打开终端,打开终端后输入“sudosu”回车;在下...
- 湖北嵌入式软件工程师培训怎么选,让自己脱颖而出
-
很多年轻人毕业即失业、面试总是不如意、薪酬不满意、在家躺平。“就业难”该如何应对,参加培训是否能改变自己的职业走向,在湖北,有哪些嵌入式软件工程师培训怎么选值得推荐?粤嵌科技在嵌入式培训领域有十几年经...
- 新阁上位机开发---10年工程师的Modbus总结
-
前言我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。我一直认为Modbus协议的存...
- 创建你的第一个可运行的嵌入式Linux系统-5
-
@ZHangZMo在MicrochipBuildroot中配置QT5选择Graphic配置文件增加QT5的配置修改根文件系统支持QT5修改output/target/etc/profile配置文件...
- 如何在Linux下给zigbee CC2530实现上位机
-
0、前言网友提问如下:粉丝提问项目框架汇总下这个网友的问题,其实就是实现一个网关程序,内容分为几块:下位机,通过串口与上位机相连;下位机要能够接收上位机下发的命令,并解析这些命令;下位机能够根据这些命...
- Python实现串口助手 - 03串口功能实现
-
串口调试助手是最核心的当然是串口数据收发与显示的功能,pzh-py-com借助的是pySerial库实现串口收发功能,今天痞子衡为大家介绍pySerial是如何在pzh-py-com发挥功能的。一、...
- 为什么选择UART(串口)作为调试接口,而不是I2C、SPI等其他接口
-
UART(通用异步收发传输器)通常被选作调试接口有以下几个原因:简单性:协议简单:UART的协议非常简单,只需设置波特率、数据位、停止位和校验位就可以进行通信。相比之下,I2C和SPI需要处理更多的通...
- 同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理
-
串口通讯在各种外设通讯中是常见接口,因为各种嵌入式CPU中串口标配,工业控制中如果不够还通过各种串口芯片进行扩展。比如spi接口的W25Q128FV.对于软件而言,因为驱动接口固定,软件也相对好写,因...
- 嵌入式linux为什么可以通过PC上的串口去执行命令?
-
1、uboot(负责初始化基本硬bai件,如串口,网卡,usb口等,然du后引导系统zhi运行)2、linux系统(真正的操作系统)3、你的应用程序(基于操作系统的软件应用)当你开发板上电时,u...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- go语言也可以做gui,go-fltk让你做出c++级别的桌面应用
- 旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗
- codeblocks和VS2019下的fltk使用中文
- FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库
- 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
- Linux 5.13内核有望合并对苹果M1处理器支持的初步代码
- Ubuntu系统下COM口测试教程(ubuntu port)
- 湖北嵌入式软件工程师培训怎么选,让自己脱颖而出
- 新阁上位机开发---10年工程师的Modbus总结
- 创建你的第一个可运行的嵌入式Linux系统-5
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)