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



我有一个openresty nginx来代理弹性搜索。因此,grafana 客户端联系 nginx,nginx 作为回报,从 elasticsearch 获取响应。目标是将 http 状态更改为 504,如果来自 elasticsearch 的响应体包含键 "timedout": 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不支持它,是否有任何其他代理服务器可以完成这项工作?

任何帮助将不胜感激。

你不能在 body_filter_by_lua_block 内更改状态,因为此时所有响应标头都已发送到下游。

如果您绝对需要它 - 不要使用 proxy_pass .

相反,请使用content_by_lua_block,并在其中使用 lua-resty-http 发出请求、读取正文、分析它并使用您想要的任何状态代码进行响应。

此方法是完全缓冲的,可能会对大型响应产生重大性能影响。

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

相关内容

最新更新