Звоните Луа в ответ на 503 в haproxy - PullRequest
0 голосов
/ 17 декабря 2018

Я использую HAProxy Lua API.Я хотел бы вызывать действия Lua для всех событий http-request и http-response.

Это прекрасно работает, за исключением случаев, когда HAProxy сам не может выполнить запрос (например, нет доступного бэкэнда).В этом случае я не могу найти способ позвонить Lua.

Например,

listen appname
    bind 0.0.0.0:8000
    mode http
    http-request lua.handle-request
    http-response lua.handle-response
    server hostname 127.0.0.1:8001 check

Это работает нормально, и handle-request и handle-response вызываются, даже если внутренний сервер возвращает500 статус или другая ошибка.

Однако если HAProxy сам не может найти бэкэнд (возвращая сам 503), то вызывается handle-request, но не handle-response.

Iтакже пытался использовать действия TCP.

Есть ли способ запустить код Lua в этом случае?

1 Ответ

0 голосов
/ 20 декабря 2018

Единственный способ, которым я смог найти это, - это ужасный и злой хак, который никогда не следует использовать.

Используйте task для чтения UDP из системного журнала, чтобы захватить 503 ответа из журналов HAproxy.

Конфиг:

lua-load youre_a_terrible_person.lua
log 127.0.0.1:8004 local0 debug
option httplog

Луа:

core.register_task(function()
  local socket = require("socket")

  udp = socket.udp()
  udp:setsockname("*", 8004)
  udp:settimeout(0)

  while true do
      data = udp:receive()
      if data then
          print("Received: ", data)
          -- Look for your 503 and do stuff
      else
        core.sleep(1)
      end
      core.yield()
  end
end)

Опять же, не могу не подчеркнуть, насколько это плохая идея.

...