Nginx Openresty - 阅读响应正文后更改http状态

时间:2018-04-18 11:48:51

标签: nginx proxy openresty

我有一个openresty nginx来代理elasticsearch。因此,grafana客户端联系nginx和nginx作为回报从elasticsearch获取响应。如果来自elasticsearch的响应正文包含密钥“timedout”,则目标是将http状态更改为504:true

使用 body_by_filter_lua_block 读取响应正文,但此指令不支持更改http状态。

http {
 lua_need_request_body on;
 server {
 listen 8000;
 location / {
    proxy_pass "http://localhost:9200"
    header_filter_by_lua_block {
        ngx.header.content_length = nil

         }
     body_filter_by_lua_block {
        if string.find(ngx.arg[1], "\"timedout\":true") then
          ngx.arg[1] = nil
        }
      }
 }
}

上面的代码只是使响应主体为零。但有没有办法改变http状态?或者,如果在nginx中不支持,是否还有其他代理服务器可以完成这项工作?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

您无法在body_filter_by_lua_block内更改状态,因为此时所有响应标头都已在下游发送。

如果您确实需要它 - 请勿使用proxy_pass

而是使用content_by_lua_block并在其中使用lua-resty-http发出请求,阅读完整正文,分析并回复您想要的任何状态代码。

这种方法是完全缓冲的,并且对于大响应可能具有显着的性能影响。

另外,你应该记住,身体可能会被压缩。