The Issue of the Day Before

讓 HaProxy 回應 request IP

haproxy -

使用 lua 來處理 http request。

Why

藏在很深的內部網路中,有時候想知道對外 IP 是什麼,這就能派上場。

How

寫一個內嵌的 lua 來回應 http request。 範例如下,

pong.lua
local function pong(applet)
  local s = string.format([[{"ip":"%s"}]], applet.f:src()) // (1)

  applet:set_status(200)
  applet:add_header("content-length", string.len(s))
  applet:add_header("content-type", "application/json; charset=utf-8")
  applet:add_header("Access-Control-Allow-Origin", "*")
  applet:start_response()
  applet:send(s)

end

core.register_service("ping", "http", pong)  // (2)
  1. 利用 applet 取得 IP

  2. 將服務註冊到 haproxy ,註冊的名字為 ping ,模式為 http。

在 haproxy config 中,將上面的 lua 程式設定為特定網址或路徑的 http response

haproxy.cfg
global

    lua-load <path>/pong.lua  // (1)

frontend ping

  // acl ping path /ping
  // use_backend pong-server if ping

  default_backend pong-server

backend pong-server
    http-request use-service lua.ping  (2)
  1. 先載入剛剛寫的 lua 程式

  2. 指定由已經註冊的 lua.ping 程式來回應

閱讀在雲端