资料参考:
https://github.com/openresty/lua-nginx-module
注:这不是一份全面的资料,全面的资料可以访问上面官方的 github 进行查找,本文只是个人在使用中需要用到的特性
lua_code_cache 默认为 on,lua 脚本会被加载到内存中,修改 lua 文件,需要重新加载配置,生产环境一般使用该配置。调试阶段可以关闭该选项,系统每次执行 lua 脚本时,都会重新去加载 lua 脚本文件,关闭方式如下:
lua_code_cache off;
content_by_lua 和 content_by_lua_file,在 Nginx 的 NGX_HTTP_CONTENT_PHASE 执行的 lua 脚本
content_by_lua_file html/lua/test.lua;
以上的配置方式,系统会在 ~/nginx/html/lua 目录下搜索 test.lua 文件,与其类似的配置还有:
header_filter_by_lua 和 header_filter_by_lua_file,在 Nginx filter_header 阶段执行的 lua 脚本
header_filter_by_lua_file html/lua/filter_header.lua;
与其类似的配置还有 body_filter_by_lua 和 body_filter_by_lua_file
ngx.OK (0)
ngx.ERROR (-1)
ngx.AGAIN (-2)
ngx.DONE (-4)
ngx.DECLINED (-5)
ngx.HTTP_GET
ngx.HTTP_HEAD
ngx.HTTP_PUT
ngx.HTTP_POST
ngx.HTTP_DELETE
ngx.HTTP_OPTIONS
ngx.HTTP_MKCOL
ngx.HTTP_COPY
ngx.HTTP_MOVE
ngx.HTTP_PROPFIND
ngx.HTTP_PROPPATCH
ngx.HTTP_LOCK
ngx.HTTP_UNLOCK
ngx.HTTP_PATCH
ngx.HTTP_TRACE
ngx.HTTP_OK (200)
ngx.HTTP_CREATED (201)
ngx.HTTP_SPECIAL_RESPONSE (300)
ngx.HTTP_MOVED_PERMANENTLY (301)
ngx.HTTP_MOVED_TEMPORARILY (302)
ngx.HTTP_SEE_OTHER (303)
ngx.HTTP_NOT_MODIFIED (304)
ngx.HTTP_BAD_REQUEST (400)
ngx.HTTP_UNAUTHORIZED (401)
ngx.HTTP_FORBIDDEN (403)
ngx.HTTP_NOT_FOUND (404)
ngx.HTTP_NOT_ALLOWED (405)
ngx.HTTP_GONE (410)
ngx.HTTP_INTERNAL_SERVER_ERROR (500)
ngx.HTTP_METHOD_NOT_IMPLEMENTED (501)
ngx.HTTP_SERVICE_UNAVAILABLE (503)
ngx.HTTP_GATEWAY_TIMEOUT (504)
ngx.log会使用这部分变量
此处的 VAR_NAME 可以为NGINX内置变量,也可以为配置文件中的变量,如(这里没有全部列举):
NGINX HTTP核心模块内置变量
scheme
content_length
content_type
host
remote_addr
remote_port
如配置文件:
location /lua {
default_type "text/plain";
set $my_var "my_var";
content_by_lua_file html/lua/test.lua;
header_filter_by_lua_file html/lua/filter_header.lua;
}
Lua脚本示例:
test.lua
ngx.say("my_var: "..ngx.var.my_var)
ngx.say("http_host: "..ngx.var.http_host)
ngx.say("uri: "..ngx.var.uri)
ngx.say("args: "..ngx.var.args)
filter_header.lua
ngx.status = 500
测试结果:
[www@123 ~]$ curl -i "http://127.0.0.1:8080/lua?a=1&b=2"
HTTP/1.1 500 Internal Server Error
Server: openresty/1.9.3.1
Date: Mon, 26 Oct 2015 12:50:44 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
my_var: my_var
http_host: 127.0.0.1:8080
uri: /lua
args: a=1&b=2
可以将变量作为上下文,跨域NGINX多个阶段的脚本进行使用
配置文件:
location /luatest {
rewrite_by_lua_file html/lua/phase.lua;
access_by_lua_file html/lua/phase.lua;
content_by_lua_file html/lua/phase.lua;
}
Lua脚本示例:
if ('rewrite' == ngx.get_phase()) then
ngx.ctx.foo = {}
end
table.insert(ngx.ctx.foo, ngx.get_phase())
if ('content' == ngx.get_phase()) then
for k, v in pairs(ngx.ctx.foo) do
ngx.say(k..": "..v)
end
end
测试结果
[www@123 ~]$ curl -i "http://127.0.0.1:8080/luatest"
HTTP/1.1 200 OK
Server: openresty/1.9.3.1
Date: Mon, 26 Oct 2015 12:55:31 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive
1: rewrite
2: access
3: content
一次执行,分别在 rewrite 阶段,access 阶段和 content 阶段,向 ctx 变量中插入相应的阶段值
可作为内置共享变量,该变量为一个 table,需要在配置中指定变量为共享变量,注意:lua_shared_dict 只能配置在 http 下
配置文件(省略了无关部分):
http {
lua_shared_dict pv 32m;
server {
listen 80;
server_name localhost;
location /lua1 {
lua_code_cache off;
content_by_lua_file html/lua/test1.lua;
}
location /lua2 {
lua_code_cache off;
content_by_lua_file html/lua/test2.lua;
}
}
}
Lua脚本:
test1.lua
ngx.shared.pv:set("count", 100)
ngx.say('set pv count to 100')
test2.lua
ngx.say('get pv count '..ngx.shared.pv:get("count"))
测试结果:
[www@123 conf]$ curl "http://127.0.0.1:8080/lua1"
set pv count to 100
[www@123 conf]$ curl "http://127.0.0.1:8080/lua2"
get pv count 100
访问lua1时,将 pv 的 count 设置为 100,访问 lua2 的时候将该值取出,该方法可以实现变量在系统中的共享
使用共享变量,不能直接使用,需要使用共享变量接口对共享变量中的值进行处理,具体参见:
https://github.com/openresty/lua-nginx-module#ngxshareddict
处理返回的响应,可以直接对 ngx.status 赋值
Lua脚本示例:
ngx.status = ngx.HTTP_INTERNAL_SERVER_ERROR
ngx.say("Hello World")
测试结果:
[www@123 ~]$ curl -i "http://127.0.0.1:8080/lua"
HTTP/1.1 500 Internal Server Error
Server: openresty/1.9.3.1
Date: Mon, 26 Oct 2015 13:00:53 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
Hello World
对头的处理有以下两种方式:
ngx.header.content_type = "text/plain"
ngx.header["Content-Type"] = "text/plain"
如果要删除头有以下两种方式:
ngx.header["Content-Type"] = nil
ngx.header["Content-Type"] = {}
Lua脚本:
ngx.header.content_type = "test"
ngx.header.test = "haha"
ngx.header.server = nil
ngx.say("Hello World")
测试结果:
[www@123 ~]$ curl -i "http://127.0.0.1:8080/lua"
HTTP/1.1 200 OK
Date: Mon, 26 Oct 2015 13:04:09 GMT
Content-Type: test
Transfer-Encoding: chunked
Connection: keep-alive
test: haha
Hello World
从测试结果可以看出,Content-Type 被设置为了 test,新加了一个 test 头值为 haha,Server 头被删除
openresty 日志接口为
ngx.log(level, str)
level 选值如下:
lua脚本:
ngx.log(ngx.WARN, "this ia openresty test!!!!!")
日志输出结果如下:
2015/10/26 21:52:21 [warn] 6156#0: *87 [lua] test.lua:1: this ia openresty test!!!!!, client: 127.0.0.1, server: localhost, request: "GET /lua HTTP/1.1", host: "127.0.0.1:8080"