我可以在openresty nginx http块中使用lua吗?

时间:2016-12-13 11:30:06

标签: openresty

我想请求一些api并将响应设置为nginx变量。但它说"set_by_lua_block" directive is not allowed here。我怎样才能做到这一点?

http {
  set_by_lua_block $hostIp {
    local http = require 'resty.http'
    local httpc = http.new()
    local res, err = httpc:request_uri('http://some-pai')
    local body, err = res:read_body()
    ngx.log(ngx.INFO, "Using ngx.INFO")
    ngx.log(ngx.INFO, body)
    return body
  }

  ...
}

1 个答案:

答案 0 :(得分:1)

上下文中不允许使用set_by_lua_block

https://github.com/openresty/lua-nginx-module#set_by_lua

set_by_lua_ *可以在服务器上下文中使用。

但是你的代码无论如何都行不通,因为resty.http使用了cosocket API。

  

目前至少禁用了以下API函数   set_by_lua的上下文:

     

输出API函数(例如,ngx.say和ngx.send_headers)

     

控制API函数(例如,ngx.exit)

     

子请求API函数(例如,ngx.location.capture和ngx.location.capture_multi)

     

Cosocket API函数(例如,ngx.socket.tcp和ngx.req.socket)。

     

睡眠API函数ngx.sleep。

如果你真的需要在nginx启动之前请求一次 - 编写脚本并设置环境变量。然后

set_by_lua $my_var 'return os.getenv("MY_VAR")';