serverless

    这两个插件接收的参数都是一样的。

    需要注意的是,这里只接受函数,而不接受其他类型的 Lua 代码。比如匿名函数是合法的:

    闭包也是合法的:

    1. local count = 1
    2. return function()
    3. count = count + 1
    4. ngx.say(count)
    5. end

    v2.6 版本开始,我们会把 confctx 作为头两个参数传递给 serverless 函数,就跟一般的插件一样。

    v2.12.0 版本之前,before_proxy 这个 phase 曾被称作 balancer。考虑到这一方法事实上运行在 access 之后,代理到上游之前,跟 balancer 没有关系,新的命名会更加贴切。

    下面是一个示例,在指定的 route 上开启了 serverless 插件:

    1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    2. "plugins": {
    3. "serverless-pre-function": {
    4. "phase": "rewrite",
    5. "functions" : ["return function() ngx.log(ngx.ERR, \"serverless pre function\"); end"]
    6. },
    7. "serverless-post-function": {
    8. "phase": "rewrite",
    9. "functions" : ["return function(conf, ctx) ngx.log(ngx.ERR, \"match uri \", ctx.curr_req_matched and ctx.curr_req_matched._path); end"]
    10. }
    11. },
    12. "upstream": {
    13. "type": "roundrobin",
    14. "nodes": {
    15. }
    16. }'

    然后你在 error.log 日志中就会发现 serverless pre functionmatch uri /index.html 两个 error 级别的日志, 表示指定的函数已经生效。

    当你想去掉插件的时候,很简单,在插件的配置中把对应的 json 配置删除即可,无须重启服务,即刻生效:

    1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    2. {
    3. "methods": ["GET"],
    4. "uri": "/index.html",
    5. "upstream": {
    6. "type": "roundrobin",
    7. "nodes": {
    8. "127.0.0.1:1980": 1
    9. }
    10. }

    现在就已经移除了 serverless 插件了。其他插件的开启和移除也是同样的方法。