【问题标题】:Processing http-response with LUA in HAProxy在 HAProxy 中使用 LUA 处理 http 响应
【发布时间】:2019-04-13 04:54:02
【问题描述】:

我正在尝试在 HAProxy 中定义一个 LUA 挂钩,以便在收到响应后执行操作(终止处理请求的容器)。我的问题是处理 HAProxy 缓冲区。我尝试了不同的实现,这是最接近工作的一种(尽管有一半的时间不会将所有数据发送回客户端):

function hook(txn)
  local in_len = txn.res:get_in_len()
  while in_len > 0 do
    txn.res:forward(in_len)
    local out_len = txn.res:get_out_len()
    while out_len ~= 0 do
      core.yield()
      out_len = txn.res:get_out_len()
    end
    in_len = txn.res:get_in_len()
  end
  os.execute("docker rm -f server_" .. txn.sf:srv_id())
end

core.register_action("hook", { "http-res" }, hook)

我最大的问题是没有 Content-length 标头,所以我不知道何时处理完所有信息,也不知道何时完成。此外,我无法使 getset 方法正常工作,因为每次调用 get 时,我都会得到完全相同的信息。

这是 HAProxy 的配置:

backend my-backend
  balance roundrobin
  http-response lua.hook
  server server_1 192.168.1.3:80 check

在杀死后端服务器之前处理所有信息的正确方法是什么?

【问题讨论】:

    标签: lua haproxy


    【解决方案1】:

    当您在 "txn.res:forward(in_len)" 中使用 forward function 时,您会将数据从 http-response 缓冲区的输入部分移动到输出部分。 接下来,您使用 yield 将处理返回给 HAProxy,这就是问题发生的时候。 HAProxy 无法分析标头(它们被直接移动到输出缓冲区),并将认为响应无效。
    所以我认为你总是只收到 HAProxy 之前的第一个缓冲区

    如果您更改脚本并在 TCP 上下文中使用它,HAProxy 将不必检查 HTTP 响应是否有效并且它会正常工作。 在 TCP 上下文中,您的脚本甚至可以简化为如下所示:

    function hook(txn) 
        local in_len = txn.res:get_in_len() 
        while in_len > 0 do 
                core.yield() 
                in_len = txn.res:get_in_len() 
        end 
        os.execute("docker rm -f server_" .. txn.sf:srv_id())
    end 
    core.register_action("hook", { "tcp-res" }, hook) 
    

    另外你需要知道使用 os.execute() 不是一个好主意,因为它会阻塞 HAProxy 直到执行完成。更多关于它here 在“非阻塞设计”部分。 因此最好采取其他选择,例如使用 API 向容器发送操作。

    【讨论】:

      猜你喜欢
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2015-05-19
      • 2012-09-12
      • 1970-01-01
      • 2014-07-31
      相关资源
      最近更新 更多