这是Web开发平台OpenResty系列文章中的一篇。
OpenResty的网站给出了几本关于Lua、Nginx、OpenResty的电子书:
1 OpenResty的主要作者章宜春写的Programming OpenResty,好像是刚开始写…
2 章宜春写的Nginx Tutorials (version 2016.07.21),这本书有中文版
3 360公司的moonbingbing(真名不知道)组织编写的OpenResty 最佳实践,其中对Lua和Nginx也做了不错的介绍。
其中章宜春写的两本都没有完成,不成系统,360公司的那本相对好一些。
后面的内容只是记录OpenResty的大概框架,具体的使用参考Web开发平台OpenResty(四):项目开发中常用的操作。
OpenResty首先是nginx,然后才是OpenResty,因此Nginx的知识依旧适用。
lua-nginx-module是最重要的模块,它赋予了nginx执行lua脚本的功能。这个模块作用于Nginx的Http子系统,因此只能用来处理HTTP协议族(HTTP 0.9/1.0/1.1/2.0, WebSockets)。对于TCP,引入的模块是stream-lua-nginx-module。
lua-nginx-moudle实现了多个XXX_by_lua
样式的配置指令,指令中包含的是要被执行的Lua代码。
这些指令分别作用于一次Http请求处理过程的不同阶段,如下图所示:
例如可以在Location中做如下配置:
location /mixed {
set_by_lua_block $a {
ngx.log(ngx.ERR, "set_by_lua*")
}
rewrite_by_lua_block {
ngx.log(ngx.ERR, "rewrite_by_lua*")
}
access_by_lua_block {
ngx.log(ngx.ERR, "access_by_lua*")
}
content_by_lua_block {
ngx.log(ngx.ERR, "content_by_lua*")
}
header_filter_by_lua_block {
ngx.log(ngx.ERR, "header_filter_by_lua*")
}
body_filter_by_lua_block {
ngx.log(ngx.ERR, "body_filter_by_lua*")
}
log_by_lua_block {
ngx.log(ngx.ERR, "log_by_lua*")
}
}
使用OpenResty启动后,访问时,会在nginx的log中看到如下日志:
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] set_by_lua:2: set_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] rewrite_by_lua(nginx.conf:17):2: rewrite_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] access_by_lua(nginx.conf:20):2: access_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] content_by_lua(nginx.conf:23):2: content_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] header_filter_by_lua:2: header_filter_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] body_filter_by_lua:2: body_filter_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] log_by_lua(nginx.conf:32):2: log_by_lua* while logging request, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
lua-nginx-module/nginx-api-for-lua收录的指令和变量最全。
ngx.ctx,当前请求的lua上下文,类型是table
,请求结束随之销毁。
ngx.ctx的类型是table,可以在其中记录状态,并且将记录的状态带到后续的阶段,例如:
location /test {
rewrite_by_lua_block {
ngx.ctx.foo = 76
}
access_by_lua_block {
ngx.ctx.foo = ngx.ctx.foo + 3
}
content_by_lua_block {
ngx.say(ngx.ctx.foo)
}
}
rewrite
阶段,在上下文中添加变量foo
,然后在access
阶段进行了修改,最后在content
阶段被用于生成返回的内容。
GET /test
返回的结果将是79(76+3)。
ngx.ctx可以在以下处理阶段中使用,ngx.timer.*是全局的定时器:
init_worker_by_lua*
set_by_lua*
rewrite_by_lua*
access_by_lua*
content_by_lua*
header_filter_by_lua*
body_filter_by_lua*
log_by_lua*
ngx.timer.*
balancer_by_lua*