OpenResty Edge 镜像请求功能让安全与性能兼得
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_mirror
、mirror_rewrite
、mirror_header_filter
等一系列精心设计的回调函数,您可以在镜像请求的每一个关键阶段进行深度干预。这意味着您可以根据请求内容智能判断是否跳过镜像,灵活修改镜像请求的头部信息,甚至在镜像请求完成后执行您自定义的特定操作。
这种全面的灵活性,旨在赋能开发者,帮助您精准地定制镜像行为,以满足各种复杂的业务需求。
配置步骤示例
配置镜像请求功能非常直观,以下是主要步骤:
添加全局 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 阶段调用。
添加镜像服务器: 在 OpenResty Edgee 管理界面中配置您的镜像目标上游服务器。
配置页面规则: 在页面规则中启用镜像请求动作,并选择相应的配置参数和 Lua 模块(如果使用 CUSTOM 类型)。
测试请求:
$ 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、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!