OpenResty Edge 映象請求(Mirror Request)功能全面升級,該功能旨在簡化複雜的業務邏輯和安全策略,使其更加高效。

映象請求的核心在於,它能夠將請求的副本傳送到其他伺服器進行額外處理。在同步模式下,主請求會等待映象請求完成後再響應;而在非同步模式下,主請求可以立即響應,不受映象請求影響。這一功能特別適用於需要進行安全審計、資料分析或業務驗證的場景。透過這種方式,系統的靈活性和安全性可以得到顯著提升。

映象請求功能的持續升級與最佳化離不開 OpenResty Edge 團隊工程師們的辛勤努力,感謝他們的貢獻使得這一重要功能得以不斷完善。

穩定性、體驗與成本的三重提升

OpenResty Edge 的映象請求功能,就像是為主請求配備了一個“分身術”。它能在處理主請求的同時,生成一個或多個子請求(即映象請求)。這些“分身”會帶著原始請求的副本,前往預設的後端伺服器執行各種幕後任務。在非同步模式下,主請求可以不受任何阻礙地快速響應,絲毫不影響使用者體驗。

  • 增強安全與合規性:映象請求功能透過非同步處理 Web 應用防火牆(WAF)掃描與身份認證,確保主請求的低延遲,從而在不影響使用者體驗的前提下,滿足金融、電商等行業對安全與合規性的嚴苛要求,顯著提升使用者信任與業務效率。
  • 靈活的業務流程編排:映象請求功能,使您能夠在不影響核心業務的前提下,將實時資料高效應用於監控、分析、A/B 測試及灰度釋出等多元場景。為構建高可用邊緣應用提供強大支撐。
  • 極致效能與使用者體驗:透過引入非同步映象模式,您的主請求將不再需要等待輔助性後臺任務如日誌記錄、資料統計的完成,從而能夠實現對客戶端的即時響應。這一機制顯著降低了主請求的延遲,確保您的使用者能夠享受到更為迅捷、無縫的應用體驗。

核心機制拆解

映象請求的強大,源於 OpenResty Edge 底層卓越的請求處理能力。它巧妙地在請求生命週期的關鍵階段,建立並派生出子請求,從而實現對原始請求的精準複製和高效轉發。

為了滿足您各種複雜多變的業務需求,我們提供了極其豐富的配置選項:

  • 型別(RAW/CUSTOM):您可以選擇直接映象原始請求(RAW),也可以透過自定義 Lua 模組(CUSTOM)進行深度定製,實現請求內容的修改、條件判斷等高階邏輯。
  • 非同步映象模式(v25.12.1-1 新增):開啟此選項後,主請求無需等待映象請求的完成,徹底解耦了主請求與映象請求的執行,極大地提升了響應速度,是實現高效能邊緣計算的關鍵。
  • 轉發請求體(v25.12.1-1 新增):允許將原始請求的請求體一併轉發給映象伺服器,這對於需要完整請求內容的 WAF 或日誌系統至關重要。極大地擴充套件了映象請求在安全審計、資料分析等場景的應用深度。
  • 靈活的上游選擇與負載均衡:您可以指定映象請求的目標上游伺服器,並選擇 Hash、Chash、Roundrobin 等多種負載均衡演算法。
  • 完善的容錯機制:支援配置重試次數、傳送/讀取/連線超時時間,並預設啟用快速失敗機制(與健康檢查聯動),確保系統在高負載或後端服務異常時的穩定性。

OpenResty Edge v25.12.1-1 版本即將引入非同步映象模式與請求體轉發能力的關鍵增強。建議您關注此版本的釋出,體驗最新功能。

回撥函式

OpenResty Edge 為您提供了強大的自定義能力,允許您編寫專屬的 Lua 模組。

透過 before_mirrormirror_rewritemirror_header_filter 等一系列精心設計的回撥函式,您可以在映象請求的每一個關鍵階段進行深度干預。這意味著您可以根據請求內容智慧判斷是否跳過映象,靈活修改映象請求的頭部資訊,甚至在映象請求完成後執行您自定義的特定操作。

這種全面的靈活性,旨在賦能開發者,幫助您精準地定製映象行為,以滿足各種複雜的業務需求。

配置步驟示例

配置映象請求功能非常直觀,以下是主要步驟:

  1. 新增全域性 Lua 模組(可選,用於 CUSTOM 型別):

    local _M = {}
    
    function _M.before_mirror(ctx)
        local content_length = tonumber(ngx.var.content_length)
        if content_length and content_length > 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_header_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 階段呼叫。
  1. 新增映象伺服器: 在 OpenResty Edgee 管理介面中配置您的映象目標上游伺服器。

  2. 配置頁面規則: 在頁面規則中啟用映象請求動作,並選擇相應的配置引數和 Lua 模組(如果使用 CUSTOM 型別)。

  3. 測試請求:

    $ curl http://test.com -v
    # 響應結果中將包含映象伺服器的響應內容,例如:
    # mirror-response-body: i am mirror server
    

如果您對映象請求功能的具體實現細節或高階應用場景感興趣,歡迎您查閱 OpenResty Edge 映象請求 文件。

關於 OpenResty Edge

OpenResty Edge 是一款專為微服務和分散式流量架構設計的全能型閘道器軟體,由我們自主研發。它集流量管理、私有 CDN 構建、API 閘道器、安全防護等功能於一體,幫助您輕鬆構建、管理和保護現代應用程式。OpenResty Edge 擁有業界領先的效能和可擴充套件性,能夠滿足高併發、高負載場景下的苛刻需求。它支援排程 K8s 等容器應用流量,並可管理海量域名,輕鬆滿足大型網站和複雜應用的需求。

關於作者

章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。

章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴,是“邊緣計算“、”動態追蹤“和“機器程式設計“的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,並編寫過 60 多個開源軟體庫。

關注我們

如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了英文版原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!