OpenResty (简称OR) 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的Lua Api,第三方模块以及常用的依赖项,基于这些能力,我们可以利用OR快速方便的搭建能够处理超高并发的,极具动态性和扩展的Web应用、Web服务和动态网关。
这篇文章选择OR中具有重要意义的一些模块、命令、Api和框架介绍如下:
基础的Http处理
OR 作为一款 Web 服务器,提供了如:
ngx.print() | ngx.say()
ngx.req.get_headers()
ngx.resp.get_headers()
ngx.header.HEADER
ngx.exit()
等函数和方法控制http请求的输入和输出,我们可以通过这些 api 灵活的控制 Web Server 中包括输入输出,转发到上游或者发起子请求在内的各个环节。
ngx.print
同ngx.say(), 通过该 api 可以指定返回的请求的消息体,其中每一次函数的调用,都是在nginx的输出链上增加了一个结点,所以我们可以多次调用该函数而不用担心后者会覆盖前者,如:
location =/hello {
content_by_lua_block {
ngx.print("Hello")
ngx.print(" ")
ngx.print("World!")
}
}
GET /hello 将会得到如下结果
======
Hello World!
请求头和响应头控制
ngx.exit() 和 ngx.status
ngx.exit,通过该 api可以指定请求响应体的 http status, 如:
location =/error {
content_by_lua_block {
return ngx.exit(500)
}
}
GET /error
======
500 Internal Server Error500 Internal Server Error
当我们访问 /error 接口的时候,可以得到一个默认的 500 页面,如上所示,当然我们可以通过ngx.status + ngx.print 的组合方式得到自定义的错误页面,如:
location =/error {
content_by_lua_block {
ngx.status = 500
ngx.print("error here!")
return ngx.exit(500)
}
}
GET /erro
======
error here!
以上方式同样适用于其它错误,如 404、502、503 等页面,通过这样的方式我们可以更灵活的控制当这些错误,从而返回更友好的页面或者其它输出,当然你也可用使用 nginx 原生的 error_page 指令对错误页面进行控制,只是灵活性相对差一些
ngx.timer.at
在OR内部通过 nginx 事件机制实现的定时器,我们可以通过它来实现延迟运行的任务逻辑,甚至于通过一些特