映象請求

此功能提供了一個生成子請求來訪問額外的伺服器的途徑。例如,可以透過此功能傳送請求到認證伺服器,認證透過了再進行服務訪問;也可以透過此功能傳送請求到 WAF 伺服器,WAF 驗證透過後再進行訪問。

  • 型別:映象請求的方式。RAW:直接映象原始請求;CUSTOM:進行一些定製處理。
  • 模組名稱:型別為 CUSTOM 時需要指定處理請求的 Lua 模組。此 Lua 模組需要有特定格式,將在後面介紹。
  • 上游:選擇映象請求到哪個上游伺服器。
  • 演算法:負載均衡演算法,可選:Hash、Chash、Roundrobin。
  • 重試次數:請求失敗後的重試次數。
  • 傳送超時:傳送資料到映象伺服器的超時時間,單位:秒。
  • 讀取超時:從映象伺服器接收資料的超時時間,單位:秒。
  • 連結超時:連線到映象伺服器的超時時間,單位:秒。

此外,如果上游開啟了健康檢查,映象請求功能將會預設快速失敗,這意味著當健康檢查沒有上游伺服器可用時,將不嘗試進行映象請求。

示例

新增全域性 Lua 模組

程式碼如下:

local _M = {}

function _M.before_mirror(ctx)
    local content_length = tonumber(ngx_var.content_length)
    if content_length
        and ctx.max_body_size > 4096
    then
        return ngx.DONE
    end

    return ngx.OK
end

function _M.mirror_rewrite(ctx)
    ngx.req.set_header('X-Real-IP', tostring(ngx.var.remote_addr))
end

function _M.mirror_header_filter(ctx)
    ngx.log(ngx.ERR, "in mirror_body_filter")
end

function _M.mirror_body_filter(ctx)
    ngx.log(ngx.ERR, "in mirror_body_filter")
end

function _M.after_mirror(ctx, resp)
    ngx.header['mirror-response-body'] = resp.body
end

function _M.header_filter()
    ngx.log(ngx.ERR, "in main request header filter")
end

function _M.body_filter()
    ngx.log(ngx.ERR, "in main request body filter")
end

return _M
  • before_mirror:產生子請求之前,會呼叫此方法,方法中返回 ngx.DONE 表示立即返回,不進行映象操作。
  • mirror_rewrite:在子請求的 rewrite 階段呼叫,可以用於修改子請求的資訊。
  • mirror_header_filter:在子請求的 header_filter 階段呼叫,可以用於修改子請求的響應頭。
  • mirror_body_filter:在子請求的 body_filter 階段呼叫,可以用於修改子請求的響應體。
  • after_mirror:子請求返回後呼叫。
  • header_filter:主請求 header filter 階段呼叫。
  • body_filter:主請求 body filter 階段呼叫。

新增映象伺服器

配置頁面規則

傳送請求

$ curl http://test.com -v
* Rebuilt URL to: test.com/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to test.com (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: test.com
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 13 Oct 2022 08:25:22 GMT
< Content-Type: text/plain
< Transfer-Encoding: chunked
< Connection: keep-alive
< mirror-response-body: i am mirror server
< Server: openresty+
< Req-ID: 00000080000447f28b90004c
< Cache-Status: BYPASS
<
i am upstream
* Connection #0 to host test.com left intact

可以看到響應頭中包含了 mirror-response-body: i am mirror server