使用NGINX替换proxy_pass返回的body

我刚开始接触 openresty/nginx,正试图用下面的代码替换早期调用 proxy_pass 返回的body:

body_filter_by_lua_block {
  ngx.arg[1] = '{"count"' .. ":2}'
  ngx.arg[2] = true
}

起初我没有加上 ngx.arg[2] = true 这一行,但我会收到两个相同的body(这是否意味着我替换的body具有2个块?)。我添加了 ngx.arg[2] = true 这一行后,现在请求的输出看起来不错。当我部署 nginx 文件时,服务看起来不错,但几个请求后 nginx 请求开始挂起。替换响应body的正确/最佳做法是什么?我应该选择什么替代方案?

点赞
用户2060502
用户2060502

body_filter_by_lua_block 中:

ngx.arg[1] 指的是当前响应体分块的数据。

ngx.arg[2] 指的是文件末尾的标记。当 ngx.arg[1] 为空值时,我经常在不同的 body_filter_by_lua_block 调用中看到该标记被设置。

这就是为什么你看到了两次字符串的原因。

上述的 EOF(文件末尾)标记具有读写权限,因此如果将其设置为 true,意味着丢弃任何剩余的分块数据。

在我这里,更改响应体内容是可行的,我甚至进行了一些性能测试,在使用该方法时从未发生过挂起的情况。

附注:如果更改响应体,请不要忘记包含 header_filter_by_lua_block { ngx.header.content_length = nil }

此外,更改压缩内容可能需要一些技巧。

2018-04-10 12:34:13