我有一个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中不支持,是否还有其他代理服务器可以完成这项工作?
任何帮助都将不胜感激。
答案 0 :(得分:3)
您无法在body_filter_by_lua_block
内更改状态,因为此时所有响应标头都已在下游发送。
如果您确实需要它 - 请勿使用proxy_pass
。
而是使用content_by_lua_block
并在其中使用lua-resty-http发出请求,阅读完整正文,分析并回复您想要的任何状态代码。
这种方法是完全缓冲的,并且对于大响应可能具有显着的性能影响。
另外,你应该记住,身体可能会被压缩。