命令行中执行lua
在命令行中调用lua执行一条输出语句, 如下所示。
1 |
|
C程序中内嵌Lua运行环境
在C语言中创建Lua运行环境,执行同样的Lua语句也相当简单。
1 |
|
Nginx C模块嵌入Lua脚本
主要工作
编写一个简单的Nginx模块,在ACCESS阶段执行配置中指定的Lua脚本, 主要工作有
- 解析配置时创建Lua运行环境
- 在ACCESS阶段挂在回调函数,执行配置中设置的Lua脚本
- 在Nginx配置中的location中增加 access_by_lua “print(‘Hello, Lua!’)”
- 模块名为ngx_http_test_module,源文件为ngx_http_test_module.c, 文件内容如下。
ngx_http_test_module.c文件内容
1 |
|
模块config文件
1 |
|
编译脚本内容
主要是连接Lua库和头文件,这里用的是LuaJIT-2.1.0, 如果用的是其他版本或者lua5.1需要根据需要更改。
1 |
|
nginx.conf
在location中增加access_by_lua指定执行的Lua代码。
1 |
|
运行
编译成功后启动Nginx,用curl或浏览器访问, Nginx会在终端输出
1 |
|
如果以daemon方式运行Nginx,可能无法输出内容。
Nginx与Lua交互
Nginx的ACCESS阶段用来控制是否允许访问,这里为Lua增加一个功能,返回403禁止访问。
增加模块上下文结构
为模块增加一个ngx_http_test_ctx_t结构,保存执行过程中需要的一些信息。
1 |
|
有一个statu的成员,执行Lua脚本后检查status的值, 如果是403的话就返回NGX_HTTP_FORBIDDEN结束请求。
增加ngx.exit API
这里仿照lua-nginx-module的做法,增加一个方法ngx.exit, 在Lua中调用ngx.exit(403)时将status值设置为403。
那么如何在Lua中修改status的值呢?Nginx中的ngx_http_request_t结构体保存了请求的所有信息,包括各个模块的上下文,将这个结构体的指针以lightuserdata的方式保存到lua_State的全局变量中获取即可。
ngx_http_test_handler中保存ngx_http_request_t指针
1 |
|
ngx.exit API的实现
1 |
|
在函数ngx_http_test_create_loc_conf中,创建全局变量ngx, 类型为table,将ngx[“exit”]值设置为函数ngx_http_test_ngx_exit。完成ngx.exit的注册,在Lua脚本中就可以通过ngx.exit()的方式调用。
1 |
|
最终的ngx_http_test_module.c
1 |
|
更改nginx.conf配置
1 |
|
编译后启动Nginx
访问时直接返回403 Forbidden.
1 |
|
同样的方法也可以用于获取请求的URL, 头部等信息。如获取请求方法的实现
1 |
|