OpenResty 子查询

发布时间: 更新时间: 总字数:553 阅读时间:2m 作者: 分享 复制网址

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}}}
            })
  • 使用场景
    • 很多不同的 API 封装为一个接口

示例

  • 内部调用示例
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;
}

说明:

  • ngx.exec 方法实现内部跳转并且没有引入任何额外 HTTP 信号

  • 可通过 ngx.var.limit_rate 实现下载限速

  • args 参数可以接受字符串或Lua 表的

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)
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数