OpenResty 子查询 Capture 模块可以捕获和处理 HTTP 请求,使用 Lua 脚本编写调度策略,支持灵活、动态的路由,并可以与 Nginx 内置的负载均衡和缓存机制相结合,以提高应用的性能和可用性。
子查询
OpenResty 的 Capture 模块是一种高性能的 Nginx 模块,可以帮助开发者快速构建和管理灵活的弹性 Web 服务器,从而提升整体 Web 应用性能。Capture 模块可以帮助用户更好地管理 Web 应用,减少错误率,提升 Web 性能,改善终端用户的体验,支持开发者快速开发和配置 Web 应用,是一款十分实用的 Nginx 扩展模块
- nginx 中每个 location 只做一个功能
- 子查询的特点
- 模拟 HTTP 接口的形式,没有 HTTP/TCP 流量
- 是内部的发起的、非阻塞的请求访问目标location
- 发起子请求前,用户程序应总是读取完整的 HTTP 请求体,缓冲整个请求体到内存
- 通过调用
ngx.req.read_body
或设置 lua_need_request_body: on;
- 使用方法:
ngx.location.capture
ngx.location.capture_multi
- 返回一个包含四个元素的 Lua 表
(res.status, res.header, res.body, res.truncated)
- 调用格式
local res = ngx.location.capture("/some-url")
local res2 = ngx.location.capture_multi({
{"/some-url", {args={a=3, b=8}}}
})
示例
location = /sum {
# 只允许内部调用
internal;
content_by_lua_block {
local args = ngx.req.get_uri_args()
ngx.say(tonumber(args.a) + tonumber(args.b))
}
}
location = /app/test {
content_by_lua_block {
local res1 = ngx.location.capture(
"/sum", {args={a=3, b=8}}
)
ngx.say("status:", res1.status, " response:", res1.body)
local res2 = ngx.location.capture_multi( {
{"/sum", {args={a=3, b=8}}}
})
ngx.say("status:", res2.status, " response:", res2.body)
}
}
location ~ ^/static/([-_a-zA-Z0-9/]+).jpg {
set $image_name $1;
content_by_lua_block {
ngx.exec("/download_internal/images/"
.. ngx.var.image_name .. ".jpg");
};
}
location /download_internal {
internal;
# 这里还可以有其他统一的 download 下载设置,例如限速等
alias ../download;
}
说明:
local res = ngx.location.capture('/print_param',
{
method = ngx.HTTP_POST,
args = {a = 1, b = '2&'},
body = 'c=3&d=4%26'
}
)
ngx.say(res.body)