我有一个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 发出请求、读取正文、分析它并使用您想要的任何状态代码进行响应。
此方法是完全缓冲的,可能会对大型响应产生重大性能影响。
另外,您应该记住,身体可能会被压缩。