前言:
现在小伙伴们对“nginx日志lua”大概比较注重,姐妹们都想要了解一些“nginx日志lua”的相关文章。那么小编在网摘上网罗了一些对于“nginx日志lua””的相关知识,希望姐妹们能喜欢,咱们一起来了解一下吧!案例一:Lua脚本获取URL中的参数通过ngx_lua模块的内置方法ngx.req.get_uri_args()获取URL后面的请求参数通过Nginx内置变量$arg_PARAMETER获取请求参数的值
#ngx.req.get_uri_args()方法Lua脚本获取URL中的参数location /add_params_demo { set_by_lua $sum ' local args = ngx.req.get_uri_args(); local a = args["a"]; local b = args["b"]; return a + b; ';echo "$arg_a + $arg_b = $sum";}#ngx.arg获取请求参数值location /add_params_demo_2 { set_by_lua $sum ' local a = tonumber(ngx.arg[1]); local b = tonumber(ngx.arg[2]); return a + b; ' $arg_a $arg_b; echo "$arg_a + $arg_b = $sum";}
Nginx Lua的内置方法
Nginx Lua的内置方法
方法说明
ngx.log(log_lever, ...)
按照log_level设定的等级输出到error.log日志文件
Pring(...)
输出到error.log日志文件,等价于ngx.log(ngx.NOTICE, ...)
ngx.print(...)
输出响应内容到客户端
ngx.say(...)
输出响应内容到客户端,自动添加'\n'换行符
ngx.exit(status)
如果status>=200,此方法就会结束当前请求处理,并且返回status状态码到客户端;若status==0,此方法就会结束请求处理的当前阶段,进入下一个请求处理阶段
ngx.send_header()
显示地发送响应头
ngx.exec(uri, args?)
内跳转URI地址
ngx.redirect(uri,status?)
外部跳转URI地址
ngx.location.capture(uri, options?)
发起一个子请求
ngx.location.capture_multi(uris)
发起多个子请求。参数uris是一个table,格式为{{uri, options?},{uri, options?},...}
ngx.is_subrequest()
当前请求是不是子请求
ngx.sleep(seconds)
无阻塞休眠秒数(定时器实现)
ngx.get_phase()
获取当前Lua脚本的执行阶段名称。
ngx.req.start_time()
请求开始时间
ngx.req.http_version()
请求的HTTP版本号
ngx.req.raw_header
获取原始的请求头(包括请求行)
ngx.req.get_method()
获取请求方法
ngx.req.set_method(method)
覆盖当前的请求方法
ngx.req.get_uri_args()
获取请求参数
ngx.req.get_post_args()
获取post请求内容,调用此方法之前必须调用ngx.req.read_body()来读取body体
ngx.req.get_headers()
默认获取前100个请求头
ngx.resp.get_headers()
获取响应头
ngx.req.read_body()
获取当前请求的请求体
ngx.req.set_header(name, value)
为当前请求设置请求头
ngx.req.clear_header(name)
为当前请求删除名称为name的请求头
ngx.req.set_body_data(data)
设置当前请求的请求体为data
ngx.req.init_body(buffer_size?)
为当前请求创建一个空的请求体。如果buffer_size参数不为空,那么新请求体的大小为buffer_size。若为空,那么新请求体的大小为client_body_buffer_size指令设置的请求体大小。若未设置,默认大小为8KB(32位系统、x86-64)或者16KB(其他的64位系统)
ngx.escape_uri(str)
对uri字符串进行编码
ngx.unescape_uri(str)
对编码过的URL字符串进行解码
ngx.encode_args(table)
将Lua table编码为一个参数字符串
ngx.decode_args(str)
将参数字符串解码为一个Lua table
ngx.encode_base64(str)
将字符串str编码成base64摘要
ngx.decode_base64(str)
将base64摘要解码成原始字符串
ngx.hmac_sha1(secret, str)
将字符串str编码成二进制格式的hmac_sha1,并使用secret进行加密
ngx.md5(str)
将字符串str编码成十六进制MD5摘要
ngx.md5_bin(str)
将字符串str编码成二进制的MD5摘要
ngx.quote_sql_str(str)
SQL语句转译,按照MySQL的格式进行转义
ngx.today()
获取当前日期
ngx.time()
获取UNIX时间戳
ngx.now()
获取当前时间
ngx.update_time()
刷新时间后再返回
ngx.localtime()
获取yyyy-mm-dd hh:mm:ss格式的本地时间
ngx.cookie_time()
获取可用于cookie值的时间
ngx.http_time()
获取可用于HTTP头的时间
ngx.parse_http_time()
解析HTTP头的时间
ngx.config.nginx_version()
获取Nginx版本号
ngx.config.ngx_lua_version()
获取ngx_lua模块版本号
ngx.worker.pid()
获取当前Worker进程的pid
案例二:通过ngx.header设置HTTP响应头
ngx_lua模块可以通过内置变量ngx.header来访问和设置HTTP响应头字段,ngx.header的类型为table,可以通过ngx.header.HEADER形式应用某个响应头。
例如:使用ngx.header.set_cookie变量设置响应头set-cookie的值,使用table类型的对象可以一次设置多个set-cookie值。
#模拟上游服务location /header_demo { content_by_lua_block { ngx.header["header1"] = "value1"; ngx.header.header2 = 2; ngx.header.set_cookie = {'Foo=bar; test=ok; path=/','age=18; path=/'}; ngx.say("演示程序: ngx.header的使用"); }}#模拟网关反向代理location /header_filter_demo { proxy_pass ; header_filter_by_lua_block { local cookies = ngx.header.set_cookie; if cookies then if type(cookies) == "table" then local cookie = {} for k, v in pairs(cookies) do cookie[k]= v..";Secure;httponly" end ngx.header.set_cookie = cookie else ngx.header.set_cookie = cookies..";Secure;httponly" end end }}
响应结果如下
Cookie是通过请求的set-cookie响应头来保存的,HTTP响应内容中可以包含多个set-cookie响应头,一个set-cookie响应头的值通常为一个字符串。该字符串大致包含如下Cookie信息或属性
Cookie名称:只能使用可以用于URL中的字符,一般为字母和数字,不能包含特殊字符,否则需要转码。Cookie值: 同Cookie名称。expires: Cookie过期日期。path: Cookie的访问路径。此属性设置指定路径下的页面才可以访问该Cookie。访问路径的值一般设为“/”。domain: Cookie的访问域名。此属性设置指定域名下的页面才可以访问该Cookie。Secure: Cookie的安全属性,此属性设置该Cookie是否只能通过HTTPS协议访问。只有值,没有名称。HttpOnly: 如果设置了该属性,那么通过程序将无法读取到Cookie信息。只有值,没有名称。
当设置了HttpOnly属性时,通过脚本将无法获取到Cookie信息,主要用于防止XSS攻击。
而一旦设置了Secure属性,前后端之间只能在HTTPS协议通信的情况下,浏览器才能访问Cookie,使用HTTP协议时,浏览器无法获取Cookie信息,同样是对Cookie信息的保护。通常都是在内网环境继续使用HTTP通信协议,然后通过Nginx网关完成外部HTTPS协议到内部HTTP协议的转换。此时,Nginx外部网关可以对Cookie属性进行修改,增加Secure安全属性。
案例三:Lua访问Nginx变量
无论是Nginx内部变量还是自定义变量,都可以在Lua代码中通过ngx.var进行访问。
#通过ngx.var访问Nginx变量location /lua_var_demo { #自定义Nginx变量,名为hello,值为world set $hello world; content_by_lua_block { local basic = require("conf.luaScript.module.common.basic"); --定义一个Lua table,暂存需要输出的Nginx内置变量 local vars = {}; vars.remote_addr = ngx.var.remote_addr; vars.request_uri = ngx.var.request_uri; vars.query_string = ngx.var.query_string; vars.uri = ngx.var.uri; vars.nginx_version = ngx.var.nginx_version; vars.server_protocol = ngx.var.server_protocol; vars.request_method = ngx.var.request_method; vars.request_filename = ngx.var.request_filename; vars.document_root = ngx.var.document_root; vars.body_bytes_sent = ngx.var.body_bytes_sent; vars.binary_remote_addr = ngx.var.binary_remote_addr; vars.args = ngx.var.args; --通过内置变量访问请求参数 vars.foo = ngx.var.arg_foo; ngx.say("演示程序: 将内置变量返回给客户端<br>"); --使用自定义函数将Lua table转换成字符串,然后输出 local str = basic.tableToStr(vars, ",<br>"); ngx.say(str); ngx.say("<br>演示程序: 将普通变量返回给客户端<br>"); --访问自定义Nginx变量hello local hello = ngx.var.hello; ngx.say("hello = "..hello); } }
重启OpenResty后,浏览器访问
案例四:Lua访问请求上下文变量
Nginx执行Lua脚本涉及很多阶段,每个阶段都可以嵌入不同的Lua脚本,不同阶段的Lua脚本可以通过ngx.ctx进行上下文变量共享。ngx.ctx上下文实质上是一个Lua table,其生存周期与当前请求相同,当前请求不同阶段嵌入的Lua脚本都可以读写ngx.ctx表中的属性。这些属性可以在请求处理的rewrite、access、content等各处理阶段进行共享。另外,在ngx_lua模块中,每个请求,包括子请求,都有一份独立的ngx.ctx表。
演示示例
#Lua访问请求上下文变量location /ctx_demo { rewrite_by_lua_block { -- 在上下文设置属性var1 ngx.ctx.var1 = 1; } access_by_lua_block { -- 在上下文设置属性var2 ngx.ctx.var2 = 10; } content_by_lua_block { local basic = require("conf.luaScript.module.common.basic"); -- 在上下文设置属性var3 ngx.ctx.var3 = 100; -- 3个上下文求和 local result = ngx.ctx.var1 + ngx.ctx.var2 + ngx.ctx.var3; ngx.say(result); ngx.ctx.sum = result; -- 使用自定义函数将Lua table转换成字符串 local str = basic.tableToStr(ngx.ctx, ",<br>"); ngx.say("<br>"); ngx.say(str); }}
运行结果:
下一篇介绍复杂案例!
标签: #nginx日志lua #nginx打印lua返回值 #nginxlocationelse #nginx变量实现 #nginx作为内网网关