摘要:对于需要进一步注意的是参数的使用,可以传入所定义的所有的状态码常量如等和两个模块内核常量只支持和这两个,如果传入其他的如等则进程住。
序
本文主要解读下nginx lua module的主要方法和api。
ngx_lua运行阶段 initialization phaseinit_by_lua
用在http模块,常用于全局变量的申请
init_worker_by_lua
在每个nginx worker进程启动时调用指定的lua代码rewrite / access phase
set_by_lua:
设置一个变量,计算变量供后续使用
rewrite_by_lua
可替代HttpRewriteModule的rewrite指令来使用的,优先级低于rewrite指令
access_by_lua
可以用来修改请求参数content phase
content_by_lua
由ngx返回内容,而不走proxied后端
header_filter_by_lua
可以用来修改后端response的header
body_filter_by_lua
一般会在一次请求中被调用多次, 因为这是实现基于 HTTP 1.1 chunked 编码的所谓“流式输出”的。log phase
log_by_lua
在请求结束的时候运行,可以做些统计工作nginx api for lua ngx.cookie_time
ngx.cookie_time(ngx.time() + 60 * 30) -- 设置Cookie过期时间为30分钟ngx.ctx
当前请求的上下文ngx.decode_args
decode为table
local decoded_uri=ngx.decode_args("arg1=day1&arg2= monday"); print_t(decoded_uri); function print_t(t) for k, v in pairs(t) do if type(v) == table then ngx.say(k, ": ", table.concat(v), "ngx.encode_args
"); else ngx.say(k, ": ", v, "
"); end end end
将table编码为表单提交格式,a1=arg1&a2=arg2
ngx.say("encode args ", ngx.encode_args({a1="arg1", a2="arg2"}), "ngx.eof
");
标识response结束,ngx.eof()只是结束响应流的输出,中断HTTP连接,后面的代码逻辑还会继续在服务端执行
ngx.req.read_body() local uri_args = ngx.req.get_uri_args(1) ngx.say(cjson.encode{result="refuse"}) ngx.eof()ngx.escape_uri
uri编码
local fileName = "专辑列表.csv" ngx.header.content_type = "text/csv;charset=utf-8" ngx.header["Content-disposition"] = "attachment;filename=" .. ngx.escape_uri(fileName)ngx.exec
内部重定向
location /foo { content_by_lua " return ngx.exec("/some-location", "a=3&b=5&c=6"); "; }ngx.exit
当传入的status >= 200(200即为ngx.HTTP_OK),ngx.exit() 会中断当前请求,并将传入的状态码(status)返回给nginx。当传入的status == 0(0即为ngx.OK)则 ngx.exit() 会中断当前执行的phrase(ngx-lua模块处理请求的阶段,如content_by_lua*),进而继续执行下面的phrase。
对于 ngx.exit() 需要进一步注意的是参数status的使用,status可以传入ngx-lua所定义的所有的HTTP状态码常量(如:ngx.HTTP_OK、ngx.HTTP_GONE、ngx.HTTP_INTERNAL_SERVER_ERROR等)和两个ngx-lua模块内核常量(只支持NGX_OK和NGX_ERROR这两个,如果传入其他的如ngx.AGAIN等则进程hang住)。
文档中推荐的 ngx.exit() 最佳实践是同 return 语句组合使用,目的在于增强请求被终止的语义(return ngx.exit(...))。
if not ngx.var.arg_token then ngx.log(ngx.ERR, "Unauthorized") return ngx.exit(ngx.HTTP_UNAUTHORIZED) end
配合使用return,增强退出语义,防止出错ngx.flush
ngx.say("Hello, Lua!") ngx.flush(true)
设置为true的话,则ngx.print或者ngx.say的内容等写入send buffer之后才返回ngx.get_phase
返回当前的处理阶段,init, init_worker,ngx.http_time
ssl_cert, set, rewrite, balancer, access, content, header_filter, body_filter, log, or
timer这几个之一
ngx.header["Content-Type"] = "application/json; charset=utf-8"; ngx.header["Expires"] = ngx.http_time( ngx.time() + max_age ); ngx.say(ngx.http_time(1290079655)) -- yields "Thu, 18 Nov 2010 11:27:35 GMT"ngx.is_subrequest
如果是subrequest则返回truengx.localtime
从NGINX"s cache中返回yyyy-mm-dd hh:mm:ss格式的时间ngx.location.capture
用于子请求,返回: status, header, body, and truncated (a Boolean to represent if the body is truncated).ngx.log
第一个参数是log基本(one of ngx.STDERR, ngx.EMERG, ngx.ALERT,ngx.CRIT, ngx.ERR, ngx.WARN, ngx.NOTICE, ngx.INFO, and ngx.DEBUG)ngx.now
后续可以接多个参数来打印log
从NGINX"s cache返回epoch time以来的毫秒数
ngx.now() 是有误差的,因为使用了nginx 自身的时间缓存。对于精度要求较高的计时,应使用下面的调用序列:
ngx.update_time() local now = ngx.now()
值得一提的是,ngx.now() 只有毫秒精度。
ngx.parse_http_timelocal time = ngx.parse_http_time("Thu, 18 Nov 2010 11:27:35 GMT") if time == nil then ... endngx.print
打印到response body.ngx.say
打印到response body并换行ngx.status
http status状态码ngx.time
从nginx cached返回epoch time以来的秒数(no syscall involved unlike Lua"s date library).ngx.today
从NGINX"s cache返回当前日期,格式 yyyy-mm-ddngx.unescape_uri
ngx.say(ngx.unescape_uri("b%20r56+7")) -- 返回b r56 7ngx.update_time
更新NGINX"s time cachengx.utctime
从NGINX"s cache返回UTC time,格式yyyy-mm-dd hh:mm:ssdoc
nginx基本配置与参数说明
nginx配置文件说明
nginx与lua的执行顺序和步骤说明
ngx_lua用例说明
ngx_lua 模块
lua-nginx-module模块里ngx_lua的所有指令以及可用ngx所有方法
由一条OpenResty Error log谈谈ngx.exit与ngx.eof的区别
ngx_Lua模块中的重定向
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/39747.html
摘要:例如响应部分通过的形式获取或设置响应头信息。以某个状态码返回响应内容,状态码常量对应关系见部分,也支持数字形式的状态码。重定向当前请求到新的,响应状态码可选列表为默认。具体内容如下相关文章进入的世界在的应用 首发于 樊浩柏科学院 当 Nginx 标准模块和配置不能灵活地适应系统要求时,就可以考虑使用 Lua 扩展和定制 Nginx 服务。OpenResty 集成了大量精良的 Lua 库...
摘要:例如设置响应状态码并退出注意,设置状态码仅在响应头发送前有效,并且该函数调用之后该函数后面的将被忽略掉,因为已经了。 一、介绍 二、安装 三、运行 四、开发 1. 介绍 Tengine:轻量级、高性能、高并发、配置化、模块化、可扩展、可移植的Web和反向代理 服务器,Tengine是nginx超集,但做了很多优化,包含了很多比较有用的模块,比如直接包含了lua、proc等很...
摘要:例如设置响应状态码并退出注意,设置状态码仅在响应头发送前有效,并且该函数调用之后该函数后面的将被忽略掉,因为已经了。 一、介绍 二、安装 三、运行 四、开发 1. 介绍 Tengine:轻量级、高性能、高并发、配置化、模块化、可扩展、可移植的Web和反向代理 服务器,Tengine是nginx超集,但做了很多优化,包含了很多比较有用的模块,比如直接包含了lua、proc等很...
摘要:异常与默认值为默认值为秒。实验请求里头的会发起一个,请求请求一次对逐个请求,都失败,则的返回,对返回的取决于脚本再请求一次该下面的都挂的情况下出现中健康检查机制深入分析容错机制原创胡志广线上的一次分析 异常 upstream server temporarily disabled while connecting to upstream no live upstreams while...
摘要:深度学习篇一动静分离通过中间件将动态请求和静态请求进行分离。原因分离资源,减少不必要的请求消耗,减少请求延时。关闭后,重定向会失效。验证规则保持一致。启动,也会要求你输入密码。根据用户的信息等信息区别根据用户的地址实现灰度发布示意图 Nginx-深度学习篇 一、动静分离 通过中间件将动态请求和静态请求进行分离。原因:分离资源,减少不必要的请求消耗,减少请求延时。 动态和静态请求图例:s...
阅读 2670·2023-04-25 18:10
阅读 1604·2019-08-30 15:53
阅读 2787·2019-08-30 13:10
阅读 3215·2019-08-29 18:40
阅读 1127·2019-08-23 18:31
阅读 1200·2019-08-23 16:49
阅读 3399·2019-08-23 16:07
阅读 876·2019-08-23 15:27