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

Nginx Openresty - Change http status after reading the response body

我有一个 openresty nginx 来代理 elasticsearch。因此 grafana 客户端联系 nginx 并且 return 中的 nginx 从 elasticsearch 获取响应。如果来自 elasticsearch 的响应正文包含键 "timedout": true

,目标是将 http 状态更改为 504

使用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
        }
      }
 }
}

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

如有任何帮助,我们将不胜感激。

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

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

而是使用 content_by_lua_block 并在其中使用 lua-resty-http 发出请求,阅读完整内容 body,分析它并使用您想要的任何状态代码进行响应。

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

您还应该记住 body 可能会被压缩。