更新日志
3.10.4
发布日期:2026-07-27
升级须知
ClickHouse Logger、Elasticsearch Logger、File Logger、Loggly、Loki Logger、SkyWalking Logger、阿里云日志服务(SLS) 和 Syslog 插件的 max_req_body_bytes 与 max_resp_body_bytes 现在会被校验为不小于 1 的整数。旧版本接受的值——0、负数,以及带引号的数字(如 "1024")——现在会被拒绝并返回 HTTP 400。
升级后,已有的、带这类值的路由会在网关组的兼容性报告中被列为错误,并且不会下发到数据面;其他路由不受影响。升级前请检查这些插件的配置中是否存在设置为 0、负数或带引号数字的 max_req_body_bytes / max_resp_body_bytes,将其改为正整数,或删除该字段以使用默认值 524288。
Prometheus 插件元数据现在会拒绝那些会移除指标赖以成立的标签的 disabled_labels 配置——例如 latency 的 type,或 status 的 code。旧版本接受这类配置,导致本应区分的多组测量值被合并成同一条指标序列。
如果你的 Prometheus 插件元数据禁用了这类标签,升级后对它的任何更新都会被拒绝并返回 HTTP 400。请在升级前把这些结构性条目从 disabled_labels 中移除。route、service、consumer 等非结构性标签仍然可以禁用。
新功能
插件
- OpenID Connect
- 新增
set_raw_id_token_header。启用后,身份提供商签发的原始 ID 令牌会通过X-Raw-ID-Token请求头转发给上游服务,使上游可以自行校验令牌签名,而不必信任网关解码后的声明。
- 新增
- Proxy Rewrite
headers.set和headers.add现在支持为同一个请求头名称配置数组值,转发到上游时会生成多条独立的请求头,而不是用逗号拼接成一条。这对只读取首个同名请求头、或对重复请求头与逗号拼接值解析方式不同的上游服务尤为重要。
- Kafka Logger
- 新增
tls,支持通过 TLS 连接 Kafka broker,并由tls.verify控制是否校验 broker 证书。此前插件只能以明文连接,因此监听 TLS 端口的 broker 完全收不到日志。
- 新增
- 限流与缓存插件
- 为 Limit Conn、Limit Req 和 AI Cache 的 Redis 与 Redis Cluster 策略新增 Redis 连接 keepalive 设置(
redis_keepalive_timeout和redis_keepalive_pool),方便运营者调整空闲超时时间和连接池大小。
- 为 Limit Conn、Limit Req 和 AI Cache 的 Redis 与 Redis Cluster 策略新增 Redis 连接 keepalive 设置(
- 需要缓冲请求/响应体的插件
- 新增
max_req_body_size和max_resp_body_size,用于限制插件读入内存的请求体或响应体大小,默认值为 67108864 字节(64 MiB)。超过上限的请求体会被拒绝,响应体则会在上限处截断——Proxy Cache 例外,超限的响应会直接透传而不被缓存——从而避免单个超大 body 耗尽 worker 内存。该能力可用于 AI Proxy、AI Proxy Multi、AI Request Rewrite、AI prompt 系列插件、Request Validation、OAS Validator、Body Transformer、Response Rewrite、Proxy Cache、gRPC Transcode、SOAP 等会缓冲 body 的插件。
- 新增
- Logger 插件
- 为其余 logger 插件的 schema 补充
max_req_body_bytes和max_resp_body_bytes——ClickHouse Logger、Elasticsearch Logger、File Logger、Loggly、Loki Logger、SkyWalking Logger、阿里云日志服务(SLS) 和 Syslog——使这两个上限在配置时被校验并在控制台中展示(参见「升级须知」)。
- 为其余 logger 插件的 schema 补充
数据面
- 新增
nginx_config.stream.real_ip_from,用于列出在 stream(TCP/UDP)端口上被信任、可以发送 PROXY protocol 头的地址。当连接来自受信任地址时,客户端地址取自 PROXY protocol 头而非直连对端,使 stream 日志和基于地址的插件看到的是真实客户端,而不是网关前面的负载均衡器。该配置默认为空,且仅在启用了 PROXY protocol 的端口上生效。 - 升级健康检查引擎。检查目标现在以增量方式协调,不再整体销毁重建,因此上游扩缩容时不会出现「没有任何节点被检查」的窗口,未变更节点已累计的健康状态和失败计数也会被保留而不是被重置。
- 调试响应头
Apisix-Plugins现在按执行顺序列出实际执行过的插件,并标注各自执行的阶段(例如limit-count#access、response-rewrite#header_filter),而不是无序地列出已配置的插件。
控制面
/api/fe-config端点改由控制面二进制提供,并由console.*配置项驱动,因此控制台的 hybrid 模式、浏览器错误上报(Sentry)和侧边栏自定义外部链接分组都可以通过控制面配置或 Helm chart 配置。缺少名称或没有绝对http/httpsURL 的菜单项会被丢弃,不会下发给控制台。- 服务冲突检测现在会计入路由的 methods。同一 host 和 path 下方法集合互不相交的路由(例如
GET /foo和POST /foo)不再被判为冲突;方法范围完全相同判为 duplicate,部分重叠判为 overlapping。未配置methods的路由仍然匹配所有方法。 - 新增可选的出站 SSRF 防护。开启
security.ssrf_protection.enable后,控制面会拒绝连接环回地址、私网地址、链路本地地址和运营商级 NAT 地址——包括解析后落到这些网段的主机名——从而防止服务注册中心、SMTP 设置等功能被用来探测内网服务或云元数据端点。
控制台(Dashboard)
- 控制面版本号现在展示在顶部栏的组织菜单旁边,并支持一键复制,不再需要展开组织下拉菜单才能查看。
- 由 ADC 同步的资源(带
managed-by=adc标签)现在会在详情页展示 Managed by ADC 标记和提示横幅,对其执行编辑、删除、新建操作时会提示:下一次 ADC 同步会覆盖手工修改并移除手工添加的子资源。归属于被 ADC 管理的 Service 或 Consumer 的子资源,即使自身没有该标签也会给出提示。这些提示仅作告知,不会阻断操作。 - 服务与路由的冲突提示弹窗新增 Methods 列,便于判断两条路由在哪些方法上发生冲突。未配置
methods的路由显示为 All。
缺陷修复
插件
- AI Proxy、AI Proxy Multi 和 AI Request Rewrite
- 修复问题:网关发往 LLM 服务商的请求会携带客户端自身的请求头,包括
Cookie、Authorization以及任意自定义头,导致最终用户的凭证泄漏给上游服务商。现在网关只发送插件自身设置的请求头。 - 修复问题:当 LLM 返回错误响应时,
$apisix_upstream_response_time和$llm_time_to_first_token记录的是秒(例如0.240)或0,而成功响应记录的是毫秒。现在错误路径也统一以毫秒上报,与成功路径一致。
- 修复问题:网关发往 LLM 服务商的请求会携带客户端自身的请求头,包括
- OpenID Connect
- 修复问题:收到 state 与当前会话不匹配的授权回调时——例如在同一浏览器中先后发起了两个登录流程——会返回
HTTP 500。现在网关改为重定向到最初请求的页面。 - 修复问题:身份提供商 userinfo 中的空 JSON 数组(例如
"roles": [])在复用已有会话的请求中会被重新编码为空对象({})写入X-Userinfo头,导致按数组解析该字段的上游服务出错。现在空数组仍然是数组。
- 修复问题:收到 state 与当前会话不匹配的授权回调时——例如在同一浏览器中先后发起了两个登录流程——会返回
- wolf-rbac
- 修复问题:当鉴权服务返回成功但不带
userInfo时,客户端自己传入的X-UserId、X-Username、X-Nickname请求头会被透传给上游服务,使调用方可以伪装成任意身份。现在这些请求头在转发前总是被清除。
- 修复问题:当鉴权服务返回成功但不带
- Limit Count
- 修复问题:在
window_type: sliding且开启延迟同步时,剩余配额的计算没有按滑动窗口加权,导致窗口边界附近放行的请求明显多于配置值。现在剩余计数按窗口加权计算。
- 修复问题:在
- Limit Conn 和 Limit Req
- 修复问题:Redis 连接没有归还到 keepalive 连接池,导致每个请求都新建一条 Redis 连接,已配置的 keepalive 参数完全不生效。现在连接会被正确复用。
- Prometheus
- 修复问题:当指标使用的共享内存字典写满时,网关可能进入死循环,把某个 worker 的 CPU 占用拉满至 100%,且在流量停止后也不会恢复。现在字典写满会优雅降级,并记录「上报的指标数据可能不完整」的日志。
数据面
- 修复问题:使用
least_conn负载均衡时,增删上游节点会丢弃已记录的连接数,导致算法退化为轮询,把新请求发给已经持有长连接的节点。现在负载状态会在上游扩缩容期间保留。 - 修复问题:当插件字段引用的密钥无法解析时——例如环境变量未设置,或密钥管理器返回错误——失败是静默的,未解析的引用会被当作字面值使用。现在网关会记录错误日志,指明具体的引用和所在字段。
- 修复问题:网关通过执行
/bin/hostname获取主机名,因此在不包含该二进制的镜像上无法上报主机名,网关实例在控制台中显示为没有主机名。现在改为通过系统调用获取。 - 修复问题:
nginx_config.envs中值包含空格、引号或反斜杠的条目会生成非法的 NGINX 配置,导致网关启动失败。现在这些值会被正确地加引号和转义。 - 修复问题:通过 CLI 停止网关后立即启动可能失败,因为上一个实例尚未完全退出。现在 CLI 会等待其停止后再启动新实例。
- 修复问题:网关容器被强制杀死(而非正常关闭)后,残留的 worker event socket 可能导致下次启动无法绑定。现在启动时会先清理这些残留文件。
- 修复问题:在 arm64 架构上,某个依赖会把第二份 JSON 库拉入网关的模块搜索路径,遮蔽内置版本并把空数组编码成非法 JSON。现在已移除该冗余依赖,始终使用内置库。
控制面
- 修复问题:针对同一资源的两个并发 PATCH 请求可能各自在对方写入前读取资源,导致只有最后一次写入生效,而两个请求都返回成功。现在同一资源上的 PATCH 请求会被串行化。
- 修复问题:
PATCH /apisix/admin/routes在应用补丁时没有用路由 schema 校验合并结果,因此一次 PATCH 可能持久化超出 schema 限制的路由(例如超过 64 条 path),而后续的PUT请求和adc sync又会拒绝它。现在合并结果会在存储前完成校验。 - 修复问题:数据库连接池中的连接会被无限期复用,因此数据库发生主备切换后,控制面可能继续使用绑定在已被降级为只读的旧主库上的连接。现在连接生命周期默认限制为 1 小时,并可通过
database.max_lifetime调整。 - 修复问题:导入证书链已过期的 License 时,报错信息为
license certificate comes from an invalid issuer,指向签发机构而不是过期本身。现在证书链已过期或尚未生效会返回带有相应时间戳的专门提示。确实来自未知签发机构的证书仍然报告 issuer 非法。 - 修复问题:当前数据面核数统计包含了已停止上报心跳的实例——这些实例在被标记为离线前会在 LostConnection 状态停留最长两小时——因此数据面缩容或崩溃后很久,控制台上的核数用量仍然偏高。现在只统计处于标准运行模式的已连接实例。基于心跳用量计算的 License 计费不受影响。
控制台(Dashboard)
- 修复问题:路由 path 列表和服务 host 列表允许添加超过 schema 限制(64 条 path、32 个 host)的条目。此时新建资源会返回原始的服务端错误,而编辑资源则可能存下随后被
adc validate和adc sync拒绝的配置。现在列表达到上限后会隐藏 Add 控件;已经超出上限的列表仍会完整展示所有条目,便于删除多余项。
3.10.3
发布日期:2026-07-14
升级须知
多个数据面共享内存(lua_shared_dict)默认值被调高,因此在默认配置下,3.10.3 网关启动时预留的共享内存比 3.10.2 约多 365 MiB:
| 共享字典 | 3.10.2 默认值 | 3.10.3 默认值 |
|---|---|---|
prometheus-metrics(高级指标) | 15 MiB | 128 MiB |
kubernetes、nacos、nacos-stream、consul(服务发现) | 各 20 MiB | 各 64 MiB |
tracing_buffer(SkyWalking) | 10 MiB | 32 MiB |
api-calls-for-portal | 10 MiB | 64 MiB |
这些字典在网关启动时分配,无论对应功能是否被使用,因此该增长适用于每一 个 3.10.3 网关。升级前,请调高网关容器的内存 requests 和 limits(在 Kubernetes 中还应检查节点的内存压力与驱逐阈值),避免网关被 OOM 杀死。如果你未使用某项功能——例如某种未配置的服务发现类型——可以通过网关配置或 Helm chart 的共享字典值把对应字典调回原先的大小。
内置 Dashboard 用户现在会在连续密码登录失败后被临时锁定。默认策略为启用状态,同一用户和来源 IP 连续失败 5 次后锁定 15 分钟。管理员可以通过新的登录失败限制系统设置调整或关闭该策略。升级后新密码和被修改的密码也必须至少 12 个字符,并继续满足原有复杂度要求。已有密码在登录时不会重新校验长度。
如果内置用户启用了双因素认证(2FA),该用户的 HTTP Basic Auth 会被拒绝,因为 Basic Auth 无法携带第二因素。程序化集成请改用 Token 认证;Token 通过 X-API-KEY 请求头传入,不需要携带 2FA 验证码。
网关现在通过 apisix.trusted_addresses 判断是否信任客户端传入的 X-Forwarded-* 和 RFC 7239 Forwarded 请求头。当未配置 trusted_addresses,或请求来自不可信地址时,网关会在转发上游前用自身观测到的值覆盖 X-Forwarded-Proto、X-Forwarded-Host 和 X-Forwarded-Port,并清除 Forwarded 请求头。如果上游应用依赖可信负载均衡器或反向代理传入的原始转发协议、host 或端口,请将该代理的 IP 或 CIDR 配置到 trusted_addresses。
openid-connect 插件不再默认把 refresh_session_interval 设为 900 秒。现在只有显式配置 refresh_session_interval 时才会执行周期性静默重认证。如果你的部署依赖此前 900 秒刷新一次的行为,请在升级前或升级过程中显式设置 refresh_session_interval: 900。
对于使用 SQL Server 的部署,控制面现在会先创建并准备数据库,再让其他组件连接,并启用 READ_COMMITTED_SNAPSHOT,避免网关配置读取被写事务阻塞。若既有 SQL Server 数据库尚未启用该设置,首次启动会以 ROLLBACK IMMEDIATE 应用该数据库级变更;正在进行的数据库事务和连接可能会被断开一次,之后连接池会重新连接,后续启动不会重复执行该操作。
控制面现在会在存储时加密更多保存凭证的插件字段。由于 API7 EE 升级时先升级控制面、再升级数据面,在升级间隙中,3.10.3 的控制面会加密这些字段,而仍为 3.10.2 的旧数据面无法解密,可能导致相关插件失效,直到数据面也完成升级。
本次新增加密的字段,按插件列出如下:
- ai-cache:
semantic.embedding.openai.api_key、semantic.embedding.azure_openai.api_key
如果你使用了上述插件的相关字段,请在控制面升级后尽快将数据面升级到 3.10.3,并在两侧都升级到 3.10.3 之前避免编辑这些插件。
新功能
插件
- AI Cache
- 在精确匹配缓存之外,新增语义(L2)缓存层,通过 RediSearch 按 embedding 相似度匹配提示词。流式 LLM 响应现在可以被缓存并回放,而不再被跳过。新增 Prometheus 指标,报告缓存命中、未命中、绕过和 embedding 延迟。
- AI Aliyun Content Moderation
- 新增
request_check_roles,用于选择要审查的请求角色(user、tool和/或system)。user和tool内容遵循request_check_mode(last或all,默认last);选择system时,系统内容会在每个请求中检查。长内容现在以线性时间分块,且对多字节(UTF-8)安全。
- 新增
- AI AWS Content Moderation
- 请求审查现在在 AI 协议识别之后执行,检查上游 LLM 实际可见的解码后提示词内容,而不是原始 HTTP JSON 外壳。拒绝响应现在以提供商兼容格式返回,并新增可配置的
check_request、deny_code和deny_message。
- 请求审查现在在 AI 协议识别之后执行,检查上游 LLM 实际可见的解码后提示词内容,而不是原始 HTTP JSON 外壳。拒绝响应现在以提供商兼容格式返回,并新增可配置的
- IP Restriction
- 新增可配置的
response_code(403或404,默认403),在请求被拦截时返回,使运营者可以用404隐藏资源是否存在。
- 新增可配置的
- File Logger
- 日志文件
path现在可以在插件元数据中设置一次并在多条路由间共享,不必在每条路由的插件配置中都填写。插件配置中设置的path仍然优先于元数据中的值。
- 日志文件
- Logger 插件
- 为 HTTP Logger、RocketMQ Logger、TCP Logger、Tencent Cloud CLS 和 UDP Logger 的 schema 新增
max_req_body_bytes和max_resp_body_bytes,使请求/响应体大小上限(默认 524288 字节)在配置时被校验并在 Dashboard 中展示。
- 为 HTTP Logger、RocketMQ Logger、TCP Logger、Tencent Cloud CLS 和 UDP Logger 的 schema 新增
- 限流插件
- 为 Limit Count、Limit Count Advanced、GraphQL Limit Count 和 AI Rate Limiting 的 Redis 与 Redis Cluster 策略新增 Redis 连接 keepalive 设置(
redis_keepalive_timeout和redis_keepalive_pool),方便运营者调整空闲超时时间和连接池大小。
- 为 Limit Count、Limit Count Advanced、GraphQL Limit Count 和 AI Rate Limiting 的 Redis 与 Redis Cluster 策略新增 Redis 连接 keepalive 设置(
数据面
- 新增
apisix.trusted_addresses,根据解析后的客户端地址控制网关是否信任客户端传入的X-Forwarded-*和Forwarded请求头。 - 新增
apisix.match_uri_encoded_slash。启用后,编码斜杠(%2F)在路由匹配期间保持编码状态,可作为路径参数的一部分,而不是路径分隔符。 - 在 standalone YAML 模式中,环境变量占位符现在会在 YAML 解析前替换。未加引号的占位符可以解析为原生布尔值或数字;加引号的占位符仍保持字符串,从而精确保留大整数 ID 和 token 值。
控制面
- 为内置 Dashboard 用户新增 TOTP 双因素认证。用户可在账号设置中注册、启用、关闭和恢复 2FA;管理员可重置用户的 2FA 状态。
- 为内置用户新增登录失败限制。连续失败登录会临时锁定用户和来源 IP,写入审计事件,并返回明确的锁定提示。
- 新增双因素认证的 Dashboard UI:账号设置中的二维码和恢复码设置流程、登录时的 OTP 步骤,以及管理员重置用户 2FA 的操作。
- 密码表单和随机密码生成已更新为新的 12 字符最小长度。
开发者门户
- 新增强制双因素认证选项。当启用 2FA 且设置了
twoFactor.required时,开发者必须先完成 2FA 注册才能访问受保护页面,该要求在登录和代理层都会强制执行。
缺陷修复
插件
- AI Proxy 和 AI Proxy Multi
- 修复问题:包含 tool result 且混有其他内容的 Anthropic Messages 请求会被转换成非法的 OpenAI Chat 消息顺序,导致 OpenAI 兼容上游拒绝该会话后续的每个请求。现在 tool 消息会紧跟在包含 tool call 的 assistant 消息之后,旁边的文本或媒体会保留在后续 user 消息中。若干其他 Anthropic 到 OpenAI 的转换细节也已与 LiteLLM 兼容行为对齐,包括工具名清洗、长工具名冲突处理、adaptive thinking effort、结构化输出 schema 提取、空数组编码和内容块形状。
- 修复问题:结构化 chat content 可能以 table 形式传给下游 AI 插件并导致请求处理错误。协议适配器现在会在 AI guard 和 cache 插件消费前一致地拍平文本内容。
- AI Lakera Guard
- 修复问 题:在
action: alert且fail_open: false的流式响应中,Lakera API 报错或超时可能放行已流出的响应,而不是 fail closed。现在 Lakera 报错会按fail_open处理,严格配置下会拦截响应。
- 修复问 题:在
- AI AWS Content Moderation 和 AI Aliyun Content Moderation
- 修复问题:
deny_code此前接受任意数字。现在会校验为200–599范围内的整数 HTTP 状态码(默认200),超出范围的值会在配置时被拒绝。
- 修复问题:
- AI Aliyun Content Moderation
- 修复问题:在 body filter 中返回
ngx.OK可能中断后续 body filter 处理。现在插件会正常返回,使其他 filter 可以继续执行。
- 修复问题:在 body filter 中返回
- AI Rate Limiting
- 修复问题:部分已配置的 Redis 字段会被丢弃并替换为默认值——redis-sentinel 策略的
redis_username/redis_password,以及 redis 和 redis-cluster 策略的redis_keepalive_timeout/redis_keepalive_pool。现在所有已配置的 Redis 字段都会被转发。
- 修复问题:部分已配置的 Redis 字段会被丢弃并替换为默认值——redis-sentinel 策略的
- gRPC Transcode
- 修复问题:空的 protobuf
repeated字段会被编码为{}而不是 JSON 数组([])。现在空 repeated 字段会显示为数组,包括嵌套消息和 descriptor-set 方式的消息。
- 修复问题:空的 protobuf
- Key Auth 和其他 Consumer 认证插件
- 修复问题:如果 Consumer 凭据引用了无法解析的 secret,数据面可能仍把未解析的字面量加入索引,并用该字面量完成认证。现在引用的 secret 无法解析时,Consumer 认证会 fail closed。
- Secret 引用
- 修复问题:更新或删除
/secrets配置不会使 secret LRU 缓存失效,因此旧 secret 值可能继续使用到缓存过期,甚至无限期使用。现在 secret 配置变化后会重新解析 secret 引用。
- 修复问题:更新或删除
- Proxy Rewrite
- 修复问题:同时配置
use_real_request_uri_unsafe和uri时,请求 query string 会在 URI 改写中丢失。现在会保留原始 query string,并在改写后的 URI 已含 query 时正确合并。
- 修复问题:同时配置
- Loggly
- 修复问题:不同 route 的批量 Loggly 日志可能使用错误的 token 或 tags,因为异步处理器复用了最新 route 的配置。现在每个批处理器都会保留自己的 route 配置。
- Datadog
- 修复问题:较大的合并 DogStatsD datagram 可能超过常见的 8192 字节 agent 缓冲区并被静默截断。现在只有在 payload 可容纳时才合并,否则回退为每个 metric 一个 datagram。
- Zipkin
- 修复问题:明确标记为未采样的请求仍会构造完整 span tag table 和 access 阶段子 span。现在未采样请求会跳过这些额外追踪工作,同时保留 trace 传播。
- OpenTelemetry
- 修复问题:运行时更新 OpenTelemetry 插件元数据不会重建用于注入 core span 的 tracer,因此这些 span 可能继续使用旧 collector 或 resource 设置,直到 worker 重启。现在元数据变化后 tracer 会刷新。
- 修复问题:
additional_attributes在 log 阶段变量填充前求值,导致依赖最终请求状态的属性缺失或过期。现在这些属性在 log 阶段求值。 - 修复问题:当
trace_id_source设为x-request-id时,非合法十六进制的X-Request-Id值(例如 UUID)或重复的请求头可能返回HTTP 500。现在会校验该值,无法使用时回退为随机的合法 trace ID。 - 修复问题:插件元数据 schema 接受
resource属性和collector.request_headers的非标量值,这些值随后会在运行时被静默丢弃。现在这类值会在配置时被拒绝。
- OpenID Connect
- 修复问题:
refresh_session_interval错误地默认设为900,即使用户未配置也会启用静默重认证。该默认值已移除(见升级须知)。
- 修复问题:
- MQTT Proxy
- 修复问题:
protocol_name过去是必填项,尽管标准默认值是MQTT。现在该字段可省略,并默认使用MQTT。
- 修复问题:
- Forward Auth
- 修复问题:当
request_method为POST时,插件在缓冲请求体后仍可能把客户端的Transfer-Encoding、Content-Length和Expect请求头转发给认证服务,导致请求 framing 不一致。现在这些客户端 framing 头 不会再复制到认证服务请求中。
- 修复问题:当
- Authz CASBIN
- 修复问题:在不同 route 之间切换不同 Casbin model 或 policy 形状时,可能触发
casbin enforce error/invalid request size。内置lua-casbin依赖已更新,包含相关 enforce 修复。
- 修复问题:在不同 route 之间切换不同 Casbin model 或 policy 形状时,可能触发
- Request ID
- 修复问题:配置
algorithm: range_id但省略可选 range 对象时可能返回HTTP 500。现在 range 对象有默认值。
- 修复问题:配置
- Workflow
- 修复问题:Workflow action 插件可能在 workflow 决定跳过或执行该 action 前先运行
_meta.pre_functionhook,从而影响本不应执行的 action。现在 workflow 会先决定是否运行 action,再执行这些 meta hook。
- 修复问题:Workflow action 插件可能在 workflow 决定跳过或执行该 action 前先运行
- Request Validation
- 修复问题:
Content-Type带 charset 参数或大小写不同(例如application/x-www-form-urlencoded; charset=utf-8)的表单请求体未被识别为 form-urlencoded,因而被当作 JSON 解析并以HTTP 400拒绝。现在这类 Content-Type 会被识别并按表单体校验。
- 修复问题:
数据面
- 修复问题:部分日志文件被 rotation 后,网关可能仍保持旧文件句柄。现在部分 rotation 后也会正确重新打开日志。
- 修复问题:当配置源上报的 revision 比网关已见过的更小时(例如控制面数据库被恢复到较早状态),网关可能持续下发过期配置,直到 worker 重启。现在观测到更小的 revision 时会强制进行一次完整配置重新同步。
- 修复问题:通过 global rule 或 consumer 挂载的插件(如
ai-proxy-multi)可能因网关无法在请求时获取插件的父配置而返回HTTP 5xx。现在所有承载插件的资源类型都能被正确解析。 - 修复问题:当
client-control配置max_body_size: 0(不限制)时,分块请求体仍可能被以HTTP 413拒绝。现在max_body_size为0会正确地对分块请求禁用大小检查。
控制面
- 修复问题:配置 revision 刚变化后、下一次 heartbeat 尚未上报新 revision 前,网关实例可能短暂显示为 OutOfSync。现在新增宽限窗口,在正常同步窗口内仍保持最近有 heartbeat 的实例为 Healthy。
- 修复问题:兼容性报告被截断为 200 条且顺序不稳定,因此大报告可能隐藏 error,并在不同网关实例间显示不同结果。现在控制面会存储完整且排序后的报告,并基于全部条目计算兼容性。
- 修复问题:secret provider 的请求体可能匹配与 URL 路径中 provider 名称不同的类型,导致数据面丢弃或误读已保存 secret。现在控制面会按路径选择的 provider 类型校验请求体。
- 修复问题:控制面接受了一些数据面会静默丢弃的核心资源配置,包括非法 TLS、filter 和 IP match 配置。现在这些配置会在发布前被校验拒绝。
- 修复问题:运行时 services 端点上的插件配置未被校验,因此带有非法插件配置的 service 会被接受,随后被数据面静默丢弃。现在 service 的插件配置会被校验,非法时以
HTTP 400拒绝。 - 修复问题:OpenAPI schema 会拒绝 IPv6 upstream node host。现在 IPv6 host 可以被接受。
- 修复问题:batch
ssls校验使用了 SNI schema 而不是 SSL schema,导致缺少证书字段的条目可能通过校验。现在 batch SSL 校验使用正确 schema。 - 修复问题:审计日志导出只返回前 256 条。现在会导出所有匹配的审计日志。
- 修复问题:凭据查询索引可能被不执行数据库迁移的组件删除,且部分启动 schema repair 会不必要地重建当前索引。现在 schema repair 会保留当前索引,仅修复过期形状。
- 修复问题:在大型部署中,heartbeat 和实例状态查询可能变慢。新增索引和 Go 侧状态计算改善了这些查询。
3.10.2
发布日期:2026-06-29
升级须知
控制面现在会在存储时加密更多保存凭证的插件字段。由于 API7 EE 升级时先升级控制面、再升级数据面,在升级间隙中,3.10.2 的控制面会加密这些字段,而仍为 3.10.1 的旧数据面无法解密,可能导致相关插件失效,直到数据面也完成升级。
本次新增加密的字段,按插件列出如下:
- limit-count、limit-count-advanced 和 graphql-limit-count:
redis_password、sentinel_password - limit-conn:
redis_password - limit-req:
redis_password - ai-rate-limiting:
redis_password、sentinel_password - elasticsearch-logger:
headers(自定义认证请求头) - openid-connect:
session.redis.password - ai-cache:
redis_password - ai-lakera-guard:
api_key
如果你使用了上述插件的相关字段,请在控制面升级后尽快将数据面升级到 3.10.2,并在两侧都升级到 3.10.2 之前避免编辑这些插件。
当 hmac-auth 启用 validate_request_body 时,默认的 max_req_body_size 现在为 67108864 字节(64 MiB),与 Apache APISIX 对齐。在 3.10.1 中该默认值为 524288 字节(512 KiB),会以 HTTP 413 拒绝 512 KiB 到 64 MiB 之间的请求体。升级后,这类请求默认会被接受。如果你依赖较低的上限,请显式设置 max_req_body_size 以恢复。
开发者门户的注册同意项现在通过单个 signUpConsentLabel 选项配置(渲染在同意复选框旁边的 HTML 片段),且仅在配置了该标签时才强制要求同意。原有的 tosURL 和 beforeSignUpButtonHtml 选项已移除。如果你的门户配置设置了其中任一项,请在升级前将内容迁移到 signUpConsentLabel,否则注册同意文案将不再显示。
新功能
插件
- AI Cache(新插件)
- 缓存 LLM 响应,使相同的请求从缓存返回,而不再重复调用上游模型。精确匹配缓存以归一化后的请求体为键,存储在 Redis 中;缓存命中时返回存储的响应,并带
X-AI-Cache-Status: HIT和X-AI-Cache-Age响应头。流式请求会被跳过(X-AI-Cache-Status: BYPASS)。
- 缓存 LLM 响应,使相同的请求从缓存返回,而不再重复调用上游模型。精确匹配缓存以归一化后的请求体为键,存储在 Redis 中;缓存命中时返回存储的响应,并带
- AI Lakera Guard(新插件)
- 通过 Lakera Guard API 检测 AI 流量中的提示词注入和其他不安全内容。
direction选项(input、output或both)用于选择插件扫描请求提示词、LLM 响应(包括流式响应)还是两者。被标记的流量会以可配置的deny_code拒绝,或在action设为alert时仅记录日志。
- 通过 Lakera Guard API 检测 AI 流量中的提示词注入和其他不安全内容。
- AI Aliyun Content Moderation
- 新增
request_check_mode(last或all,默认last),用于控制审查多轮对话的范围:last仅检查最后一个 user 轮次,all检查每个 user 轮次。仅审查user角色的内容,忽略system和assistant内容。长内容现在以线性时间分块,且对多字节(UTF-8)安全。
- 新增
- AI Proxy
- 发送给 logger 插件的结构化
llm_summary对象(启用logging.summaries时)现在包含更多 AI 可观测性字段:stream、tool_count、has_tool_calls、end_user_id、cache_read_input_tokens、cache_creation_input_tokens和reasoning_tokens。
- 发送给 logger 插件的结构化
- Elasticsearch Logger
- 新增通过自定义请求头向 Elasticsearch 认证的支持(
headers选项,例如Authorization: Bearer <token>或 API key 请求头),作为基本auth的替代方式。
- 新增通过自定义请求头向 Elasticsearch 认证的支持(
- OpenID Connect
- 新增 Redis 作为会话存储后端。将
session.storage设为redis并配置session.redis(host、port 等选项),即可把会话存储在 Redis 而非会话 cookie 中;默认仍为cookie。
- 新增 Redis 作为会话存储后端。将
数据面
- 新增
log_format_extra——一种用于 logger 插件的叠加式日志格式,它在默认的丰富日志格式上追加字段,而不像log_format那样替换默认格式。新增变量$upstream_unresolved_host记录 DNS 解析前配置的上游 host。log_format_extra可通过插件元数据全局设置,也可按路由设置。 - 为流(L4)TCP 代理新增按端口的 PROXY protocol 控制。每个
stream_proxy.tcp条目可独立启用接收 PROXY protocol(proxy_protocol)和向上游发送 PROXY protocol(proxy_protocol_to_upstream),覆盖全局默认值。 - 新增
max_post_args_readable_size配置项(默认 64 MiB),用于限制在 匹配post_arg.*路由谓词(针对 JSON 和 multipart 请求)时读取的请求体大小。设为0可禁用该限制。 - 调试会话现在会把每个请求的日志作为 OpenTelemetry span event 记录在请求的 root span 上,因此无需外部日志收集器即可在 trace 中查看每个请求的日志。
控制面
- 新增数据面的 RPM 安装方式,与现有的 Docker 和 Helm 方式并列。Dashboard 的网关组部署页面新增 RPM 标签页;在隔离网络主机上安装
api7-gatewayRPM 后,生成的离线脚本会下发网关组客户端证书、写入网关配置,并将实例接入控制面。
开发者门户
- 禁用 API Hub:运营者可通过新增的
apiHub.enabled配置开关完全关闭 API Hub。禁用后,导航中的 API Hub 链接会隐藏,API Hub 页面返回 not-found,且 API Hub 的 URL 会从 sitemap 中移除。 - 强制邮箱验证:可配置在注册和登录时要求开发者先验证邮箱地址才能完成认证。
- 自定义 PostgreSQL schema:门户可以部署到自定义的 PostgreSQL schema(而非
public),按连接应用该 schema 的search_path并运行 schema 范围内的迁移。 - 平台管理员的组织管理:管理员的 Organizations 页面现在可以 接管组织(成为其 owner)或删除组织,作为对原有用户管理操作的补充。
- 文档 Markdown 与 LLM 端点:门户内文档站现在提供 Markdown 和面向 AI 工具的 LLM 友好文本端点,且可以将单个文档页面排除在这些端点之外,同时仍可在文档界面中正常阅读。
缺陷修复
插件
- AI Proxy
- 修复问题:当上游返回的工具调用的
arguments不是合法 JSON 时,整个响应转换会被中断,客户端收不到任何内容。现在该非法工具调用会回退为空参数对象,响应的其余部分(包括任何文本内容)得以保留。 - 修复问题:携带
tool_choice但没有可用tools的请求(例如只有一个在转换中被丢弃的内置工具)会带着孤立的tool_choice转发并被上游拒绝。现在这样的tool_choice(以及parallel_tool_calls)会被移除。另外,上游省略最后完成块的流式 Anthropic 请求不再让客户端挂起到超时——流现在会被正确终止。 - 修复问题:当上游 LLM 返回错误状态(如
HTTP 429或5xx)时,错误响应体被丢弃,客户端收到空响应体。现在上游错误响应体和 content type 会被保留,ai-proxy-multifallback 场景下也是如此。
- 修复问题:当上游返回的工具调用的
- AI Proxy Multi
- 修复问题:构建工作实例池失败时可能抛出 Lua 错误并破坏性地清空池状态。现在该失败路径对 nil 安全且不具破坏性。
- Limit Count
- 修复问题:当
count或time_window来自变量时,非法值(非整数、零或负数、或超出安全整数范围)会被静默忽略,从而可能完全失效限流。现在这类值会被校验并拒绝,堵住了一处限流绕过。 - 修复问题:使用 Redis 策略和滑动窗口计数时,检查与自增不是原子操作,因此并发请求可能超过配置的上限。现在计数通过 Redis 脚本原子完成。
- 修复问题:当
- Limit Req
- 修复问题:限流计数的键设置方式导致挂在共享资源(如 Consumer)上的限流对每条路由分别计数,而不是共用一个桶。现在计数按父资源为键,因此 Consumer 级别的限流会在该 Consumer 的所有路由间共同生效。
- HMAC Auth
- 修复问题:当启用
validate_request_body且请求体超过max_req_body_size时,请求会以容易误解的HTTP 401被拒绝。现在改为以HTTP 413拒绝。默认的max_req_body_size也提升至 64 MiB(见升级须知)。
- 修复问题:当启用
- Attach Consumer Label
- 修复问题:当匹配到的 Consumer 没有标签时,客户端可以伪造已配置的请求头,因为插件只在存在标签值时才覆盖该请求头。现在已配置的请求头总会从客户端请求中剥离,即使 Consumer 没有匹配的标签。
- Redirect
- 修复问题:
http_to_https仅重定向 scheme 恰好为http的请求,因此以非 HTTP、非 HTTPS scheme 到达的请求(例如通过伪造的X-Forwarded-Proto)不会被重定向。现在它会重定向所有非 HTTPS 的 scheme。
- 修复问题:
- Response Rewrite
- 修复问题:当上游响应被压缩(gzip 或 brotli)时,
filters作用在压缩字节上而无法匹配,产生损坏的响应体。现在会先解码响应再执行 filters。
- 修复问题:当上游响应被压缩(gzip 或 brotli)时,
- Batch Requests
- 修复问题:当某个流水线子请求超时时,响应数组可能比子请求数多出条目(一个多余的空对象)。现在子响应的数量总是与子请求的数量一致。
- Loki Logger
- 修复问题:从变量解析出的日志标签被写回共享的插件配置,导致第一个请求的值被冻结并复用于后续所有请求。现在标签会按请求解析。
- Tencent Cloud CLS
- 修复问题:启用
include_req_body时,由于未在 access 阶段读取请求体,请求体无法被捕获。现在会读取请求体,使其包含在上传的日志中。
- 修复问题:启用
- Authz Keycloak
- 修复问题:启用
lazy_load_paths时,按 URI 解析 Keycloak 资源时包含了请求的 query string,导致带 query 参数的请求无法匹配到资源而被拒绝。现在会在解析前剥离 query string。
- 修复问题:启用
- CAS Auth
- 修复问题:CAS 单点登出(SLO)回调
POST被代理到上 游,而不是由插件处理。现在该回调由插件终止,不再转发到上游。
- 修复问题:CAS 单点登出(SLO)回调
- gRPC Web
- 修复问题:一条调试日志语句把解码后的请求体写入错误日志。该语句已移除,请求负载不再泄漏到日志中。
数据面
- 修复问题:在日志格式中解析点号上下文变量(如
$consumer.username或$llm_summary.model)时,若父对象不存在(例如没有 consumer 的未认证请求),会抛出错误并丢弃该日志行。现在缺失的值会被优雅处理。 - 修复问题:在一次瞬时 DNS 或服务发现失败后,域名上游即使在名称重新解析成功后仍可能持续返回
HTTP 503。现在上游会在解析成功后恢复。 - 修复问题:当节点健康状态变化时,一致性哈希(chash)环会按健康子集重建,导致原本属于健康节点的键被重新映射。现在该环会保持稳定,只有故障节点的键会被重新映射。
- 修复问题:配置指令中的环境变量替换在一个变量名是另一个变量名的前缀时,可能匹配到错误的变量。现在变量名会被精确解析。
- 修复问题:升级 Prometheus 指标库(
nginx-lua-prometheus-api7升至0.20260623),移除可能导致整次抓取被拒绝的重复指标序列。
控制面
- 修复问题:运行最新网关版本的数据面在其配置报告包含错误时会被标记为 Incompatible。现在运行最新版本的数据面会保持 Compatible,配置错误仍会在兼容性报告摘要中呈现。
开发者门户
- 修复问题:启用或关闭双因素认证时并未真正校验账号密码,备份码对话框可能显示为空,且在登录时输入错误的 TOTP 验证码会跳转到首页而非显示错误。现在密码校验、备份码展示和 TOTP 错误处理都能正确工作。
- 修复问题:邮箱域名的 SSO 策略此前仅在 UI 层强制,因此直接调用认证端点可以绕过它。现在该策略在服务端强制:对于要求使用 SSO 的域名,密码登录、magic link 和密码重置请求都会被拒绝。
3.10.1
发布日期:2026-06-15
不兼容变更
插件
-
升级说明
jwt-auth现在默认校验 token 的exp(过期)和nbf(生效时间)声明。此前,未设置claims_to_verify(或将其设为空列表)的 consumer 会接受任何签名正确的 token,包括已过期的 token。数据面升级后,这类 token 会被以HTTP 401拒绝。如果你依赖已过期 token 仍被接受,请在升级前评估此行为变更。如需只校验特定声明,请在 consumer 配置中显式设置
claims_to_verify。 -
Batch Requests
升级说明batch-requests插件现在会限制批量请求的规模。流水线子请求的数量由新增的插件元数据选项max_pipeline_items限制(默认1000),超过上限的批量请求会被以HTTP 400拒绝。包含文档之外字段的流水线条目现在会被拒绝,且每批的timeout至少为1毫秒。如果你发送的批量请求超过 1000 个子请求,请在插件元数据中调大
max_pipeline_items。 如果客户端发送了未文档化的条目字段,请在升级前移除它们。
升级须知
控制面现在会在存储时加密更多保存凭证的插件字段。由于 API7 EE 升级时先升级控制面、再升级数据面,在升级间隙中,3.10.1 的控制面会加密这些字段,而仍为 3.10.0 的旧数据面无法解密,可能导致相关插件失效,直到数据面也完成升级。
本次新增加密的字段,按插件列出如下:
- http-logger:
auth_header - kafka-logger:
brokers.sasl_config.password - splunk-hec-logging:
endpoint.token - loggly:
customer_token - openfunction:
authorization.service_token - azure-functions:
authorization.apikey,以及插件元数据master_apikey - ai-aws-content-moderation:
comprehend.secret_access_key - openid-connect:
session.secret - error-log-logger(插件元数据):
kafka.brokers.sasl_config.password
如果你使用了上述插件的相关字段,请在控制面升级后尽快将数据面升级到 3.10.1,并在两侧都升级到 3.10.1 之前避免编辑这些插件。
此前仅 limit-count-advanced 独有的全部能力——redis-sentinel 策略、滑动窗口计数、在一份配置中设置多个独立限流(rules)、由 NGINX 变量驱动的动态 count 和 time_window、以及延迟 Redis 同步(sync_interval)——现已内置到 limit-count 插件中。既有的 limit-count-advanced 配置可继续原样使用(该插件作为薄封装保留),无需做配置迁移。
一个升级时的影响:对于基于 Redis 的策略,计数器存储格式发生了变化,且计数器 key 现在带版本号。既有计数器不会被迁移——它们会按各自的 TTL 自然过期——因此限流计数器会在升级时刻重置一次。(local 策略本就在重启时重置。)会有一个短暂的计数重置窗口,无需任何操作。
为了限制内存占用,多个插件现在会在缓冲之前拒绝过大的请求体:
- hmac-auth:当启用
validate_request_body时,请求体大小由新增的max_req_body_size选项限制(默认524288字节,即 512 KiB)。 - forward-auth、ai-proxy、ai-proxy-multi:请求体大小由新增的
max_req_body_size选项限制(默认67108864字节,即 64 MiB),超过上限的请求会被以HTTP 413拒绝。
这些默认值高于 NGINX 默认的 client_max_body_size(1 MiB),因此大多数部署不受影响。如果你确实需要在使用这些插件的 route 上处理更大的请求体(并已相应调大 client_max_body_size),请将 max_req_body_size 调整到匹配的值。
在开发者门户中,凭据的 key-auth key 和 basic-auth password 现在仅在创建或重新生成凭据时返回一次,不再包含在凭据的读取或列表响应中,这与 OAuth client_secret 的现有行为一致。basic-auth 的用户名仍然可见。
请在密钥首次展示时复制并妥善保存。如果密钥丢失,请重新生成凭据以获得新值。任何从凭据读取或列表接口回读这些密钥的集成都需要改为在创建时捕获它们。
独立的 apisix_llm_ttft 指标已被 apisix_llm_latency{type="ttft"} 取代,与 apisix_http_latency 的结构保持一致。如果你的 Prometheus 查询或 Grafana 看板引用了 apisix_llm_ttft,请改为选择 apisix_llm_latency 上 type 标签的 ttft 值。
新功能
插件
- Limit Count
- 此前仅
limit-count-advanced提 供的高级限流能力,现在可直接在limit-count中使用:redis-sentinel策略、滑动窗口计数(window_type设为sliding)、在一份配置中设置多个独立限流(rules)、由 NGINX 变量驱动的count和time_window(例如按 consumer 的动态配额)、以及延迟 Redis 同步(sync_interval)。
- 此前仅
- AI 内容安全插件(
ai-aliyun-content-moderation、ai-aws-content-moderation、ai-prompt-guard)- 新增
fail_mode选项(skip、warn或error,默认skip),用于控制当插件绑定在 Consumer 级别、收到非 AI 或非 JSON 请求时的处理方式。skip会让这类请求不经检查直接放行;warn会额外记录一条警告日志;error则拒绝它们。这避免了 Consumer 级绑定的审核插件收到普通(非 AI)流量时报错。
- 新增
- AI Proxy
- 新增描述每个 LLM 请求的内置 NGINX 变量,可用于
access_log格式和 logger 插件:$llm_total_tokens、$llm_stream、$llm_has_tool_calls、$llm_tool_count、$llm_end_user_id、$llm_cache_read_input_tokens、$llm_cache_creation_input_tokens和$llm_reasoning_tokens。已为 OpenAI(Chat 与 Responses)、Anthropic 和 DeepSeek 提供映射。
- 新增描述每个 LLM 请求的内置 NGINX 变量,可用于
- Prometheus
- 新增 LLM 可观测性指标:按请求统计的 prompt token 和 completion token 分布直方图(
apisix_llm_prompt_tokens_dist、apisix_llm_completion_tokens_dist)、总 延迟直方图,以及以apisix_llm_latency{type="ttft"}暴露的首 token 时间(TTFT,仅流式请求)。直方图的 bucket 可通过plugin_attr.prometheus配置。 - 为
http_status、http_latency和bandwidth指标新增mcp_request_type和mcp_tool_name标签,从而可以按请求类型(tools/list或tools/call)和工具名称拆分 MCP(Model Context Protocol)流量。这两个标签都可以通过disabled_labels关闭。 - 在指标日志阶段缓存 disabled-labels 映射,而不是每个请求都重建,降低了每请求开销。
- 新增 LLM 可观测性指标:按请求统计的 prompt token 和 completion token 分布直方图(
- AI Proxy Multi
- 为 fallback 机制新增
max_retries和retry_on_failure_within_ms。max_retries限制单个请求在失败后最多重试多少个额外实例;retry_on_failure_within_ms仅在上游于指定时间内失败时才进行 fallback,因此慢失败会直接返回给客户端,而不是再重试(避免长耗时 LLM 请求的延迟翻倍)。
- 为 fallback 机制新增
- OpenID Connect
- 在
session下暴露了lua-resty-session选项(cookie 的 name、path、domain、secure、http_only、same_site,以及 idling、rolling、absolute 超时),因此你可以自定义会话 cookie 名称并设置真正生效的会话有效期。旧的session.cookie.lifetime已废弃但仍被兼容(映射为absolute_timeout)。 - 对于只在本地校验 token、不调用身份提供方的流程(
bearer_only搭配public_key或use_jwks、private_key_jwt、以及公共客 户端 PKCE),client_secret现在是可选的。会话/回调和 introspection 流程仍然必须提供它。
- 在
- Kafka Logger
- 为 Kafka 生产协议新增
api_version选项(0、1或2,默认1)。将api_version设为2可让 broker 记录真实的消息时间戳(Kafka 0.10 及以上);默认值1保留协议兼容性。
- 为 Kafka 生产协议新增
开发者门户
- 双因素认证:开发者可使用 TOTP 验证器 App 保护自己的账号。在账号安全设置中启用 2FA(确认密码、扫描二维码),也可在此关闭;启用后登录会要求输入六位验证码。
- 深色模式:门户支持浅色、深色和跟随系统三种主题,可通过页头的开关切换,应用于整个界面、API 用量图表和文档站,并在多次访问间保持。
- 平台管理后台:新增管理区域(仅限配置的管理员用户),其中的 Users 页面可列出、搜索和分页查看门户用户,修改用户角色、封禁或解封、删除用户;Organizations 页面可按用户成员关系筛选。
- 门户内审批:平台管理员可以在门户新增的 Approvals 页面中查看并处理开发者注册和 API Product 订阅申请。审批与 Dashboard 共享同一数据源,每次处理都会记录操作管理员的身份(Dashboard 的审批列表现在会为门户中做出的处理显示真实的管理员名称)。
- 基于策略的 SSO 登录:登录会根据所输入的邮箱把用户引导到正确的方式(密码、magic link 或 SSO)。管理员可以把邮箱域名映射到 SSO 提供方,并支持锚定、大小写不敏感的正则表达式模式,因此一条规则即可覆盖多个域名。
- 门户内文档站:门户现在在
/docs托管一个与门户风格一致的 Markdown 文档站,带可折叠侧边栏、目录、代码复制按钮、"Copy page" 菜单,以及带高亮匹配片段的内置全文搜索。 - 注册服务条款:新用户需要同意服务条款才能完成注册;服务条款 URL 可配置。
- 简化组织创建:「创建组织」对话框不再要求填写 slug——标识符会根据名称自动分配。
缺陷修复
插件
- JWT Auth
- 修复问题:当 token 的签名格式有误(长度不对或不是合法的 base64url)时,校验器会抛错并返回
HTTP 500,而不是拒绝请求。现在签名格式有误的 token 会以HTTP 401被拒绝。
- 修复问题:当 token 的签名格式有误(长度不对或不是合法的 base64url)时,校验器会抛错并返回
- AI Proxy
- 修复问题:在 passthrough 模式下,发往上游的请求总是以
POST发送,且丢弃了客户端的查询字符串,导致需要在其他方法上携带查询参数的提 供方失败(例如 Azure OpenAI 的?api-version=)。现在会转发客户端的方法和查询字符串。 - 修复问题:访问上游 LLM 超时(例如 DNS 解析超时)时返回
HTTP 500而不是HTTP 504。现在上游 LLM 超时会正确返回HTTP 504。
- 修复问题:在 passthrough 模式下,发往上游的请求总是以
- AI Proxy Multi
- 修复问题:在按实例创建健康检查器之后,缓存的节点选择器没有重建,导致某个 worker 可能持续把部分流量路由到已被标记为不健康的实例;对配置了
auth.query或auth.header的实例,主动健康检查探测还可能破坏探测路径。这两个问题均已修复,故障转移和健康检查现在按配置工作。
- 修复问题:在按实例创建健康检查器之后,缓存的节点选择器没有重建,导致某个 worker 可能持续把部分流量路由到已被标记为不健康的实例;对配置了
- GraphQL Proxy Cache
- 修复问题:在内存缓存增加
Vary支持后,PURGE请求只清除了旧的缓存槽,而保留了各Vary变体的缓存,因此在 TTL 过期前仍会返回过期响应。现在PURGE会清除所有变体。
- 修复问题:在内存缓存增加
- Body Transformer
- 修复问题:XML 转 JSON 时会在部分 worker 进程上间歇性丢失带命名空间的 key,导致 SOAP 转换以
attempt to index field 'Body' (a nil value)失败。现在带命名空间的 key 总能被保留。格式错误的 multipart 输入现在返回HTTP 400而不是HTTP 500。
- 修复问题:XML 转 JSON 时会在部分 worker 进程上间歇性丢失带命名空间的 key,导致 SOAP 转换以
- Kafka Logger
- 修复问题:由于无法配置 Kafka 生产 API 版本,broker 存储的消息没有可用的时间戳(显示为 1970-01-01)。将新增的
api_version设为2可让 broker 记录真实的时间戳。
- 修复问题:由于无法配置 Kafka 生产 API 版本,broker 存储的消息没有可用的时间戳(显示为 1970-01-01)。将新增的
- Elasticsearch Logger
- 修复问题:使用某些
{time_format}占位符的动态索引名可能生成被破坏的索引名。现在无效的时间格式会回退为空值(并记录日志),而不是破坏索引名。
- 修复问题:使用某些
- AWS Lambda
- 修复问题:使用 IAM(SigV4)认证时,查询字符串中包含需要转义的字符、多值或无值键会导致签名不匹配(
InvalidSignatureException)。现在规范查询字符串按 SigV4 规范构建。
- 修复问题:使用 IAM(SigV4)认证时,查询字符串中包含需要转义的字符、多值或无值键会导致签名不匹配(
- Proxy Mirror
- 修复问题:镜像 gRPC 请求时把内部 location 名称当作请求路径发送,导致镜像后端以
UNIMPLEMENTED拒绝每次调用。现在镜像请求使用原始的 gRPC 方法路径。
- 修复问题:镜像 gRPC 请求时把内部 location 名称当作请求路径发送,导致镜像后端以
- Request ID
- 修复问题:当
algorithm设为nanoid时,生成器会产生大量重复且格式错误的 ID,并且每生成一个 ID 就泄漏一个文件描述符。现已替换为基于 CSPRNG 的生成器;ID 格式不变,且 ID 现在唯一且格式正确。
- 修复问题:当
- OPA
- 修复问题:配置
send_headers_upstream时,OPA 服务未返回的某个头会在发往上游的请求中保留客户端传入的值,而不是被清除。现在这类头会被清除。
- 修复问题:配置
- SAML Auth
- 修复问题:调试日志被意外保持开启,且认证失败时可能放行请求而不是返回错误。现在已关闭调试模式,认证失败会返回明确的错误。
- CORS
- 修复问题:当配置了
allow_origins_by_regex时,没有Origin头的请求会返回HTTP 500。现在这类请求会被正常处理而不报错。
- 修复问题:当配置了
- Multi Auth
- 修复问题:当底层某个认证插件返回的状态没有错误信息时,插件返回
HTTP 500而不是HTTP 401。现在会返回HTTP 401。
- 修复问题:当底层某个认证插件返回的状态没有错误信息时,插件返回
- DingTalk Auth
- 修复问题:客户端可以传入伪造的
X-Userinfo头并被转发到上游。插件现在会在认证前清除客户端传入的X-Userinfo头,确保上游只收到由插件校验的身份信息。
- 修复问题:客户端可以传入伪造的
- Authz Casdoor
- 修复问题:登录会话没有绑定到 Casdoor token 的有效期,而是回退到会话库的默认值,导致会话可能比 token 存活更久。现在会话会在 Casdoor token 过期时一并过期。
- CAS Auth
- 修复问题:单点登出的
POST请求体为空时返回HTTP 500而不是HTTP 400。现在空请求体的登出请求会被以HTTP 400拒绝。
- 修复问题:单点登出的
- Limit Conn
- 修复问题:由 NGINX 变量解析出的
burst值为0时会被以HTTP 500拒绝,尽管静态的burst为0是合法的。现在变量解析出的burst为0会被接受。
- 修复问题:由 NGINX 变量解析出的
- Limit Req
- 修复问 题:在并发压力下,由于读取和写入不是原子操作,基于 Redis 的限流可能被突破。现在限流通过单次原子操作执行。
数据面
- 修复问题:Redis 连接此前仅按地址做连接池,因此指向同一 Redis 服务器但使用不同数据库、凭据或 TLS 设置的两份插件配置可能复用彼此的连接——例如
limit-count、limit-req或limit-conn的计数器可能被写到错误的 Redis 数据库。现在连接会按地址、数据库、凭据和 TLS 设置隔离,redis-sentinel策略同样如此。 - 修复问题:当
set_header使用与既有头不同的字母大小写调用后,缓存的头表会同时保留两个条目,导致遍历缓存头的插件(如ext-plugin-post-resp)可能把过期的值转发到上游。现在缓存头的 key 会被规范化。 - 修复问题:当
workflow插件运行在 global rule 中、而某个 route 插件在 rewrite 阶段就结束了请求(例如 CORS 预检)时,日志阶段会在每个这类请求上记录一条错误。现在缺少上下文时日志阶段会干净地提前返回。 - 修复问题:在启用 stream 子系统时启用 Nacos 服务发现,会因为 stream 子系统中未声明所需的共享字典而在启动时中止 stream worker;现在该字典已声明。另一个会把 Nacos 注册创建失败变成 worker 崩溃的错误处理缺陷也已修复。
- 修复问题:使用 Consul 服务发现时,单个格式错误的节点条目会导致该 service 其余节点被丢弃(甚至可能丢弃整个 service,产生 "no valid upstream node")。现在只会跳过无效的那个节点。
- 修复问题:当 AWS Secrets Manager 的密钥名称包含斜杠时,解析会失败,因为查找在第一个斜杠处就做了切分。现在包含斜杠的密钥名称可以正确解析。
- 修复问题:Admin API 的
PATCH会对已加密的插件字段重复加密,因此对任意字段做一次PATCH都可能损坏已存储的密钥(如key-auth的 key)。现在已加密字段会在合并前解密,并只重新加密一次。
开发者门户
- 修复问题:组织邀请未遵循邮箱验证设置。现在邀请会遵循所配置的邮箱验证行为。
- 修复问题:对于属于多个组织的开发者,门户可能使用错误的组织上下文。现在开发者身份会从当前激活的组织解析。
- 修复问题:门户中多处对话框宽度不一致;现已统一。
3.10.0
发布日期:2026-06-01
不兼容变更
插件
-
升级说明
hmac-auth插件现在将signed_headers默认设为["date"]。数据面升级后,任何未显式设置signed_headers的hmac-auth配置都要求客户端签名覆盖Date头。此前未对Date签名的客户端将开始收到HTTP 401,错误信息为client request can't be validated。升级前,请确保客户端对
Date头签名,或在插件配置中显式设置signed_headers以匹配客户端实际签名的头。
控制面
-
移除 Service Template 与 API 发布机制
升级说明Service Template / Service Hub 模型已被移除。Service 现在直接归属于 Gateway Group,并通过 APISIX Admin API 管理——不再有独立的模板、发布、版本、回滚和 runtime 配置层。在控制台中,Service Hub 区域被各 Gateway Group 下的 Services 列表取代。
控制面升级到 3.10.0 时,既有的 service template 和 published service 会自动迁移到新的直连 service 模型。原始数据会被保留(不会删除),因此升级可以回滚。引用 service-template 或 published-service ARN 的 IAM 权限策略会被自动备份并重写。
开发者门户
-
仅对已发布的 API Product 强制开发者认证
升级说明此前,处于**草稿(draft)状态的 API Product 也会把其开发者认证规则同步到网关,因此草稿产品下的 route 也会要求开发者认证。从 3.10.0 起,只有已发布(published)**的 API Product 才会向数据面下发开发者认证规则。
升级后,属于草稿(未发布)API Product 的 route 在产品发布之前不再要求开发者认证。如果你依赖草稿产品被保护,请发布它们,或通过其他方式限制访问。
升级 须知
数据面网关 runtime 已从 OpenResty 1.21.4.4 升级到 OpenResty 1.29.2.4,并改为基于开源 apisix-runtime 构建。本次升级的主要目的是跨越多个大版本,引入上游 NGINX 内核、OpenSSL、LuaJIT 及内置依赖库的最新 安全修复。
大多数部署无需任何操作。一个可见的变化是:HTTP/2 现在通过 NGINX 1.25+ 的 http2 on; 指令启用,而不再使用 per-listen 的 http2 参数;HTTP/2 over cleartext(h2c)和 over TLS 仍照常工作。如果你维护了自定义的 NGINX 配置片段,请在升级前确认它们与较新版本的 NGINX 兼容。
控制面 现在会在存储时加密更多保存凭证的插件字段。由于 API7 EE 升级时先升级控制面、再升级数据面,在升级间隙中,3.10.0 的控制面会加密这些字段,而仍为 3.9.13 的旧数据面无法解密,可能导致相关插件失效,直到数据面也完成升级。
本次新增加密的字段,按插件列出如下:
- feishu-auth:
secret_fallbacks - dingtalk-auth:
secret_fallbacks
如果你使用了上述插件的相关字段,请在控制面升级后尽快将数据面升级到 3.10.0,并在两侧都升级到 3.10.0 之前避免编辑这些插件。
新功能
插件
- AI Proxy
- 上游 LLM 请求体现在使用排序后的 key 进行 JSON 编码。这会为等价请求生成稳定、逐字节一致的请求体,从而提升按精确请求体缓存的 LLM 提供商的 prompt-cache 命中率。
- AI Proxy Multi
- 当 LLM endpoint 域名解析到多个 A 记录时,插件现在会解析全部 A 记录并构建多节点 upstream,逐请求选择节点以获得更好的负载分布和故障转移。
Host头和 TLS SNI 保留原始域名,而不是解析出的 IP 地址。
- 当 LLM endpoint 域名解析到多个 A 记录时,插件现在会解析全部 A 记录并构建多节点 upstream,逐请求选择节点以获得更好的负载分布和故障转移。
- Proxy Cache
- 内存缓存策略现在支持
Vary响应头。响应会按Vary中列出的头计算出的变体分别缓存,Vary: *的响应不会被缓存。
- 内存缓存策略现在支持
- CAS Auth
cas_callback_uri现在支持绝对 URL,并原样用作 CAS service URL。当网关位于代理之后、对外可见的 callback URL 与请求路径不同时,这非常有用。
控制台(Dashboard)
- 新增权限策略语句的可视化编辑器。现在你可以通过选择资源类型、操作(标注了访问级别)和条件来构建 IAM 策略,无需手写策略 JSON。
- 配置兼容性告警现在会展示每个受影响资源的完整业务层级路径(例如 gateway group → service → route),而不是裸资源 ID,更便于定位需要处理的配置。
缺陷修复
插件
- Error Page
- 修复问题:插件此前根据 upstream status 变量判断是否渲染自定义错误页,可能会替换掉真正来自上游服务的错误响应。现在插件会判定响应来源——只对网关或插件产生的错误(如上游连接失败或被插件拒绝的请求)渲染自定义错误页,而真正由上游返回的错误响应会原样透传,保留上游的原始响应体。
- Feishu Auth
- 修复问题:客户端可以传入伪造的
X-Userinfo头并被转发到上游。插件现在会在认证前清除客户端传入的X-Userinfo头,确保上游只收到由插件校验的身份信息。
- 修复问题:客户端可以传入伪造的
- CAS Auth
- 修复问题:登录回调未校验已签名的发起 cookie,使得构造的回调请求可以操纵登录后的跳转目标(CSRF / open-redirect)。回调现在要求携带有效的已签名发起 cookie,否则以
HTTP 401拒绝。
- 修复问题:登录回调未校验已签名的发起 cookie,使得构造的回调请求可以操纵登录后的跳转目标(CSRF / open-redirect)。回调现在要求携带有效的已签名发起 cookie,否则以
- DingTalk Auth
- 修复问题:认证失败与上游瞬时失败未做区分。插件现在对认证错误返回
HTTP 401,对 DingTalk 或上游的瞬时失败返回HTTP 503,并提供更清晰的错误信息。
- 修复问题:认证失败与上游瞬时失败未做区分。插件现在对认证错误返回
- Authz Casdoor
- 修复问题:session cookie 名称在不同 Casdoor client 间共享,导致不同 client 的 session 可能冲突。session cookie 现在按 client(基于
client_id)隔离命名。
- 修复问题:session cookie 名称在不同 Casdoor client 间共享,导致不同 client 的 session 可能冲突。session cookie 现在按 client(基于
- Authz Keycloak
- 修复问题:当静态
permissions与http_method_as_scope同时使用时,派生出的方法 scope 会被写回复用的插件配置,导致 scope 跨请求累积。现在会在追加方法 scope 之前先克隆 permission 列表。
- 修复问题:当静态
- GraphQL Limit Count
- 修复问题:查询嵌套深度计算有误,导致基于深度的限流不准确。现在深度会按真实最大嵌套深度并展开 fragment 计算。Content-Type 匹配也容忍 charset 参数(如
application/json; charset=utf-8),此前这类请求会被拒绝。
- 修复问题:查询嵌套深度计算有误,导致基于深度的限流不准确。现在深度会按真实最大嵌套深度并展开 fragment 计算。Content-Type 匹配也容忍 charset 参数(如
- GraphQL Proxy Cache
- 修复问题:
Content-Type带 charset 参数的请求未被识别为 GraphQL 请求。Content-Type 匹配现在容忍 charset,同时增加了 nil 守卫、更清晰的错误信息并修正了日志级别。
- 修复问题:
数据面
- 修复问题:当同一请求上有多个日志插件抓取响应体时(例如
http-logger和file-logger都启用了include_resp_body),它们的响应体缓冲区可能相互干扰,产生截断或混杂的日志输出。现在每个 logger 使用独立的缓冲区。
3.9.17
发布日期:2026-07-28
升级须知
ClickHouse Logger、Elasticsearch Logger、File Logger、Loggly、Loki Logger、SkyWalking Logger、阿里云日志服务(SLS) 和 Syslog 插件的 max_req_body_bytes 与 max_resp_body_bytes 现在会被校验为不小于 1 的整数。旧版本接受的值——0、负数,以及带引号的数字(如 "1024")——现在会被拒绝并返回 HTTP 400。
升级后,已有的、带这类值的路由会在网关组的兼容性报告中被列为错误,并且不会下发到数据面;其他路由不受影响。升级前请检查这些插件的配置中是否存在设置为 0、负数或带引号数字的 max_req_body_bytes / max_resp_body_bytes,将其改为正整数,或删除该字段以使用默认值 524288。
Prometheus 插件元数据现在会拒绝那些会移除指标赖以成立的标签的 disabled_labels 配置——例如 latency 的 type,或 status 的 code。旧版本接受这类配置,导致本应区分的多组测量值被合并成同一条指标序列。
如果你的 Prometheus 插件元数据禁用了这类标签,升级后对它的任何更新都会被拒绝并返回 HTTP 400。请在升级前把这些结构性条目从 disabled_labels 中移除。route、service、consumer 等非结构性标签仍然可以禁用。
deny_code 校验更严格另有两处 schema 现在会拒绝旧版本接受过的值:
- OpenTelemetry 插件元数据的
resource属性和collector.request_headers只接受标量值——字符串、数字和布尔值。旧版本接受但会在运行时静默丢弃的数组和对象,现在会被拒绝并返回HTTP 400。 - AI Aliyun Content Moderation 的
deny_code必须是200–599范围内的整数 HTTP 状态码。AI AWS Content Moderation 在控制面侧此前就已按此校验,本次发布使数据面与之保持一致。
升级后,带这类值的已有配置会在网关组的兼容性报告中被报告为 错误,对其进行的任何更新都会被拒绝并返回 HTTP 400。网关实例仍保持 Healthy,流量不受影响。升级前请检查 OpenTelemetry 插件元数据以及 AI Aliyun Content Moderation 的配置,替换或删除不符合要求的值。
新功能
插件
- OpenID Connect
- 新增
set_raw_id_token_header。启用后,身份提供商签发的原始 ID 令牌会通过X-Raw-ID-Token请求头转发给上游服务,使上游可以自行校验令牌签名,而不必信任网关解码后的声明。
- 新增
- Proxy Rewrite
headers.set和headers.add现在支持为同一个请求头名称配置数组值,转发到上游时会生成多条独立的请求头,而不是用逗号拼接成一条。这对只读取首个同名请求头、或对重复请求头与逗号拼接值解析方式不同的上游服务尤为重要。
- Kafka Logger
- 新增
tls,支持通过 TLS 连接 Kafka broker,并由tls.verify控制是否校验 broker 证书。此前插件只能以明文连接,因此监听 TLS 端口的 broker 完全收不到日志。
- 新增
- 限流与缓存插件
- 为 Limit Conn、Limit Req 和 AI Cache 的 Redis 与 Redis Cluster 策略新增 Redis 连接 keepalive 设置(
redis_keepalive_timeout和redis_keepalive_pool),方便运营者调整空闲超时时间和连接池大小。
- 为 Limit Conn、Limit Req 和 AI Cache 的 Redis 与 Redis Cluster 策略新增 Redis 连接 keepalive 设置(
- 需要缓冲请求/响应体的插件
- 新增
max_req_body_size和max_resp_body_size,用于限制插件读入内存的请求体或响应体大小,默认值为 67108864 字节(64 MiB)。超过上限的请求体会被拒绝,响应体则会在上限处截断——Proxy Cache 例外,超限的响应会直接透传而不被缓存——从而避免单个超大 body 耗尽 worker 内存。该能力可用于 AI Proxy、AI Proxy Multi、AI Request Rewrite、AI prompt 系列插件、Request Validation、OAS Validator、Body Transformer、Response Rewrite、Proxy Cache、gRPC Transcode、SOAP 等会缓冲 body 的插件。
- 新增
- Logger 插件
- 为其余 logger 插件的 schema 补充
max_req_body_bytes和max_resp_body_bytes——ClickHouse Logger、Elasticsearch Logger、File Logger、Loggly、Loki Logger、SkyWalking Logger、阿里云日志服务(SLS) 和 Syslog——使这两个上限在配置时被校验并在控制台中展示(参见「升级须知」)。
- 为其余 logger 插件的 schema 补充
数据面
- 新增
nginx_config.stream.real_ip_from,用于列出在 stream(TCP/UDP)端口上被信任、可以发送 PROXY protocol 头的地址。当连接来自受信任地址时,客户端地址取自 PROXY protocol 头而非直连对端,使 stream 日志和基于地址的插件看到的是真实客户端,而不是网关前面的负载均衡器。该配置默认为空,且仅在启用了 PROXY protocol 的端口上生效。 - 升级健康检查引擎。检查目标现在以增量方式协调,不再整体销毁重建,因此上游扩缩容时不会出现「没有任何节点被检查」的窗口,未变更节点已累计的健康状态和失败计数也会被保留而不是被重置。
- 调试响应头
Apisix-Plugins现在按执行顺序列出实际执行过的插件,并标注各自执行的阶段(例如limit-count#access、response-rewrite#header_filter),而不是无序地列出已配置的插件。
控制面
/api/fe-config端点改由控制面二进制提供,并由console.*配置项驱动,因此控制台的 hybrid 模式、浏览器错误上报(Sentry)和侧边栏自定义外部链接分组都可以通过控制面配置或 Helm chart 配置。缺少名称或没有绝对http/httpsURL 的菜单项会被丢弃,不会下发给控制台。- 服务冲突检测现在会计入路由的 methods。同一 host 和 path 下方法集合互不相交的路由(例如
GET /foo和POST /foo)不再被判为冲突;方法范围完全相同判为 duplicate,部分重叠判为 overlapping。未配置methods的路由仍然匹配所有方法。 - 新增可选的出站 SSRF 防护。开启
security.ssrf_protection.enable后,控制面会拒绝连接环回地址、私网地址、链路本地地址和运营商级 NAT 地址——包括解析后落到这些网段的主机名——从而防止服务注册中心、SMTP 设置等功能被用来探测内网服务或云元数据端点。
控制台(Dashboard)
- 服务与路由的冲突提示弹窗新增 Methods 列,便于判断两条路由在哪些方法上发生冲突。未配置
methods的路由显示为 All。
缺陷修复
插件
- AI Proxy、AI Proxy Multi 和 AI Request Rewrite
- 修复问题:网关发往 LLM 服务商的请求会携带客户端自身的请求头,包括
Cookie、Authorization以及任意自定义头,导致最终用户的凭证泄漏给上游服务商。现在网关只发送插件自身设置的请求头。 - 修复问题:当 LLM 返回错误响应时,
$apisix_upstream_response_time和$llm_time_to_first_token记录的是秒(例如0.240)或0,而成功响应记录的是毫秒。现在错误路径也统一以毫秒上报,与成功路径一致。
- 修复问题:网关发往 LLM 服务商的请求会携带客户端自身的请求头,包括
- AI AWS Content Moderation 和 AI Aliyun Content Moderation
- 修复问题:
deny_code此前接受任意数字。现在会校验为200–599范围内的整数 HTTP 状态码(默认200),超出范围的值会在配置时被拒绝。其中ai-aws-content-moderation的该校验此前已在控制面生效,本次发布使数据面与之对齐;ai-aliyun-content-moderation则是控制面与数据面同时启用该校验。
- 修复问题:
- OpenID Connect
- 修复问题:收到 state 与当前会话不匹配的授权回调时——例如在同一浏览器中先后发起了两个登录流程——会返回
HTTP 500。现在网关改为重定向到最初请求的页面。 - 修复问题:身份提供商 userinfo 中的空 JSON 数组(例如
"roles": [])在复用已有会话的请求中会被重新编码为空对象({})写入X-Userinfo头,导致按数组解析该字段的上游服务出错。现在空数组仍然是数组。
- 修复问题:收到 state 与当前会话不匹配的授权回调时——例如在同一浏览器中先后发起了两个登录流程——会返回
- wolf-rbac
- 修复问题:当鉴权服务返回成功但不带
userInfo时,客户端自己传入的X-UserId、X-Username、X-Nickname请求头会被透传给上游服务,使调用方可以伪装成任意身份。现在这些请求头在转发前总是被清除。
- 修复问题:当鉴权服务返回成功但不带
- Limit Count
- 修复问题:在
window_type: sliding且开启延迟同步时,剩余配额的计算没有按滑动窗口加权,导致窗口边界附近放行的请求明显多于配置值。现在剩余计数按窗口加权计算。
- 修复问题:在
- Limit Conn 和 Limit Req
- 修复问题:Redis 连接没有归还到 keepalive 连接池,导致每个请求都新建一条 Redis 连接,已配置的 keepalive 参数完全不生效。现在连接会被正确复用。
- Prometheus
- 修复问题:当指标使用的共享内存字典写满时,网关可能进入死 循环,把某个 worker 的 CPU 占用拉满至 100%,且在流量停止后也不会恢复。现在字典写满会优雅降级,并记录「上报的指标数据可能不完整」的日志。
- OpenTelemetry
- 修复问题:插件元数据 schema 接受
resource属性和collector.request_headers的非标量值,这些值随后会在运行时被静默丢弃。现在这类值会在配置时被拒绝。
- 修复问题:插件元数据 schema 接受
数据面
- 修复问题:使用
least_conn负载均衡时,增删上游节点会丢弃已记录的连接数,导致算法退化为轮询,把新请求发给已经持有长连接的节点。现在负载状态会在上游扩缩容期间保留。 - 修复问题:当插件字段引用的密钥无法解析时——例如环境变量未设置,或密钥管理器返回错误——失败是静默的,未解析的引用会被当作字面值使用。现在网关会记录错误日志,指明具体的引用和所在字段。
- 修复问题:网关通过执行
/bin/hostname获取主机名,因此在不包含该二进制的镜像上无法上报主机名,网关实例在控制台中显示为没有主机名。现在改为通过系统调用获取。 - 修复问题:
nginx_config.envs中值包含空格、引号或反斜杠的条目会生成非法的 NGINX 配置,导致网关启动失败。现在这些值会被正确地加引号和转义。 - 修复问题:通过 CLI 停止网关后立即启动可能失败,因为上一个实例尚未完全退出。现在 CLI 会等待其停止后再启动新实例。
- 修复问题:网关容器被强制杀死(而非正常关闭)后,残留的 worker event socket 可能导致下次启动无法绑定。现在启动时会先清理这些残留文件。
- 修复问题:在 arm64 架构上,某个依赖会把第二份 JSON 库拉入网关的模块搜索路径,遮蔽内置版本并把空数组编码成非法 JSON。现在已移除该冗余依赖,始终使用内置库。
控制面
- 修复问题:针对同一资源的两个并发 PATCH 请求可能各自在对方写入前读取资源,导致只有最后一次写入生效,而两个请求都返回成功。现在同一资源上的 PATCH 请求会被串行化。
- 修复问题:数据库连接池中的连接会被无限期复用,因此数据库发生主备切换后,控制面可能继续使用绑定在已被降级为只读的旧主库上的连接。现在连接生命周期默认限制为 1 小时,并可通过
database.max_lifetime调整。 - 修复问题:导入证书链已过期的 License 时,报错信息为
license certificate comes from an invalid issuer,指向签发机构而不是过期本身。现在证书链已过期或尚未生效会返回带有相应时间戳的专门提示。确实来自未知签发机构的证书仍然报告 issuer 非法。 - 修复问题:当前数据面核数统计包含了已停止上报心跳的实例——这些实例在被标记为离线前会在 LostConnection 状态停留最长两小时——因此数据面缩容或崩溃后很久,控制台上的核数用量仍然偏高。现在只统计处于标准运行模式的已连接实例。基于心跳用量计算的 License 计费不受影响。
控制台(Dashboard)
- 修复问题:路由 path 列表和服务 host 列表允许添加超过 schema 限制(64 条 path、32 个 host)的条目。此时新建资源会返回原始的服务端错误,而编辑资源则可能存下随后被
adc validate和adc sync拒绝的配置。现在列表达到上限后会隐藏 Add 控件;已经超出上限的列表仍会完整展示所有条目,便于删除多余项。
3.9.16
发布日期:2026-07-10
升级须知
3.9.16 Helm chart 调高了多个数据面共享内存(lua_shared_dict)默认值,因此通过 Helm 部署的网关启动时预留的共享内存比之前的 chart 约多 365 MiB:
| 共享字典 | 之前 | 3.9.16 chart |
|---|---|---|
prometheus-metrics(高级指标) | 15 MiB | 128 MiB |
kubernetes、nacos、nacos-stream、consul(服务发现) | 各 20 MiB | 各 64 MiB |
tracing_buffer(SkyWalking) | 10 MiB | 32 MiB |
api-calls-for-portal | 10 MiB | 64 MiB |
该变更位于 Helm chart 的共享字典值中(网关镜像默认值未变),因此适用于基于 Helm 的部署。升级 chart 前,请调高网关容器的内存 requests 和 limits,避免网关被 OOM 杀死。你可以通过 chart 的共享字典值把不需要的字典调回原先大小。
控制面现在会在存储时加密更多保存凭证的插件字段。由于 API7 EE 升级时先升级控制面、再升级数据面,在升级间隙中,3.9.16 的控制面会加密这些字段,而仍为 3.9.15 的旧数据面无法解密,可能导致相关插件失效,直到数据面也完成升级。
本次新增加密的字段,按插件列出如下:
- limit-count、limit-count-advanced 和 graphql-limit-count:
redis_password、sentinel_password - limit-conn:
redis_password - limit-req:
redis_password - ai-rate-limiting:
redis_password、sentinel_password - elasticsearch-logger:
headers(自定义认证请求头) - ai-cache:
redis_password、semantic.embedding.openai.api_key、semantic.embedding.azure_openai.api_key - ai-lakera-guard:
api_key
如果你使用了上述插件的相关字段,请在控制面升级后尽快将数据面升级到 3.9.16,并在两侧都升级到 3.9.16 之前避免编辑这些插件。
网关现在通过 apisix.trusted_addresses 判断是否信任客户端传入的 X-Forwarded-* 和 RFC 7239 Forwarded 请求头。当未配置 trusted_addresses,或请求来自不可信地址时,网关会在转发上游前用自身观测到的值覆盖 X-Forwarded-Proto、X-Forwarded-Host 和 X-Forwarded-Port,并清除 Forwarded 请求头。如果上游应用依赖可信负载均衡器或反向代理传入的原始转发协议、host 或端口,请将该代理的 IP 或 CIDR 配置到 trusted_addresses。
openid-connect 插件不再默认把 refresh_session_interval 设为 900 秒。现在只有显式配置 refresh_session_interval 时才会执行周期性静默重认证。如果你的部署依赖此前 900 秒刷新一次的行为,请在升级前或升级过程中显式设置 refresh_session_interval: 900。
内置 Dashboard 用户现在会在连续密码登录失败后被临时锁定。默认策略为启用状态,同一用户和来源 IP 连续失败 5 次后锁定 15 分钟。管理员可以通过新的登录失败限制系统设置调整或关闭该策略。升级后新密码和被修改的密码也必须至少 12 个字符,并继续满足原有复杂度要求。已有密码在登录时不会重新校验长度。
如果内置用户启用了双因素认证(2FA),该用户的 HTTP Basic Auth 会被拒绝,因为 Basic Auth 无法携带第二因素。程序化集成请改用 Token 认证;Token 通过 X-API-KEY 请求头传入,不需要携带 2FA 验证码。
对于使用 SQL Server 的部署,控制面现在会先创建并准备数据库,再让其他组件连接,并启用 READ_COMMITTED_SNAPSHOT,避免网关配置读取被写事务阻塞。若既有 SQL Server 数据库尚未启用该设置,首次启动会以 ROLLBACK IMMEDIATE 应用该数据库级变更;正在进行的数据库事务和连接可能会被断开一次,之后连接池会重新连接,后续启动不会重复执行该操作。
新功能
插件
- AI Cache(新插件)
- 在 Redis 中缓存 LLM 响应,使重复提示词无需再次调用上游模型。支持精确匹配缓存、通过 embedding 和 RediSearch 实现的可选语义(L2)匹配、流式响应缓存与回放、可配置绕过规则,以及缓存命中、未命中、绕过和 embedding 延迟的 Prometheus 指标。
- AI Lakera Guard(新插件)
- 通过 Lakera Guard API 检测 AI 流量中的提示词注入和其他不安全内容。
direction选项(input、output或both)用于选择插件扫描请求提示词、LLM 响应(包括流式响应)还是两者。被标记的流量会以可配置的deny_code拒绝,或在action设为alert时仅记录日志。
- 通过 Lakera Guard API 检测 AI 流量中的提示词注入和其他不安全内容。
- AI Aliyun Content Moderation
- 新增
request_check_roles,用于选择要审查的请求角色(user、tool和/或system)。user和tool内容遵循request_check_mode(last或all,默认last);选择system时,系统内容会在每个请求中检查。长内容现在以线性时间分块,且对多字节(UTF-8)安全。
- 新增
- AI AWS Content Moderation
- 请求审查现在在 AI 协议识别之后执行,检查上游 LLM 实际可见的解码后提示词内容,而不是原始 HTTP JSON 外壳。拒绝响应现在以提供商兼容格式返回,并新增可配置的
check_request、deny_code和deny_message。
- 请求审查现在在 AI 协议识别之后执行,检查上游 LLM 实际可见的解码后提示词内容,而不是原始 HTTP JSON 外壳。拒绝响应现在以提供商兼容格式返回,并新增可配置的
- Elasticsearch Logger
- 新增通过自定义请求头向 Elasticsearch 认证的支持(
headers选项 ,例如Authorization: Bearer <token>或 API key 请求头),可作为基本auth的替代或补充。
- 新增通过自定义请求头向 Elasticsearch 认证的支持(
- 限流插件
- 为 Limit Count、Limit Count Advanced、GraphQL Limit Count 和 AI Rate Limiting 的 Redis 与 Redis Cluster 策略新增 Redis 连接 keepalive 设置(
redis_keepalive_timeout和redis_keepalive_pool),方便运营者调整空闲超时时间和连接池大小。
- 为 Limit Count、Limit Count Advanced、GraphQL Limit Count 和 AI Rate Limiting 的 Redis 与 Redis Cluster 策略新增 Redis 连接 keepalive 设置(
数据面
- 新增
apisix.trusted_addresses,根据解析后的客户端地址控制网关是否信任客户端传入的X-Forwarded-*和Forwarded请求头。 - 新增
apisix.match_uri_encoded_slash。启用后,编码斜杠(%2F)在路由匹配期间保持编码状态,可作为路径参数的一部分,而不是路径分隔符。 - 新增
apisix.max_post_args_readable_size(默认 64 MiB),用于限制匹配 JSON 或 multipart 请求的post_arg.*路由谓词时读取的请求体大小。设为0可禁用该限制。 - 在 standalone YAML 模式中,环境变量占位符现在会在 YAML 解析前替换。未加引号的占位符可以解析为原生布尔值或数字;加引号的占位符仍保持字符串,从而精确保留大整数 ID 和 token 值。
控制面
- 为内置 Dashboard 用户新增 TOTP 双因素认证。用户可在账号设置中注册、启用、关闭和恢复 2FA;管理员可重置用户的 2FA 状态。
- 为内置用户新增登录失败限制。连续失败登录会临时锁定用户和来源 IP,写入审计事件,并返回明确的锁定提示。
- 新增双因素认证的 Dashboard UI:账号设置中的二维码和恢复码设置流程、登录时的 OTP 步骤,以及管理员重置用户 2FA 的操作。
- 密码表单和随机密码生成已更新为新的 12 字符最小长度。
缺陷修复
插件
- AI Proxy 和 AI Proxy Multi
- 修复问题:包含 tool result 且混有其他内容的 Anthropic Messages 请求会被转换成非法的 OpenAI Chat 消息顺序,导致 OpenAI 兼容上游拒绝该会话后续的每个请求。现在 tool 消息会紧跟在包含 tool call 的 assistant 消息之后,旁边的文本或媒体会保留在后续 user 消息中。
- 修复问题:若干 Anthropic 到 OpenAI 的转换细节与 LiteLLM 兼容行为不一致,包括工具名清洗、长工具名冲突处理、adaptive thinking effort、结构化输出 schema 提取、空数组编码和内容块形状。
- 修复问题:结构化 chat content 可能以 table 形式传给下游 AI 插件并导致请求处理错误。协议适配器现在会在 AI guard 和 cache 插件消费前一致地拍平文本内容。
- 修复问题:构建
ai-proxy-multi工作实例池失败时可能抛出 Lua 错误并破坏性地清空池状态。现在该失败路径对 nil 安全且不具破坏性。
- gRPC Transcode
- 修复问题:空的 protobuf
repeated字段会被编码为{}而不是 JSON 数组([])。现在空 repeated 字段会显示为数组,包括嵌套消息和 descriptor-set 方式的消息。
- 修复问题:空的 protobuf
- Key Auth 和其他 Consumer 认证插件
- 修复问题:如果 Consumer 凭据引用了无法解析的 secret,数据面可能仍把未解析的字面量加入索引,并用该字面量完成认证。现在引用的 secret 无法解析时,Consumer 认证会 fail closed。
- Secret 引用
- 修复问题:更新或删除
/secrets配置不会使 secret LRU 缓存失效,因此旧 secret 值可能继续使用到缓存过期,甚至无限期使用。现在 secret 配置变化后会重新解析 secret 引用。
- 修复问题:更新或删除
- Proxy Rewrite
- 修复问题:同时配置
use_real_request_uri_unsafe和uri时,请求 query string 会在 URI 改写中丢失。现在会保留原始 query string,并在改写后的 URI 已含 query 时正确合并。
- 修复问题:同时配置
- Loggly
- 修复问题:不同 route 的批量 Loggly 日志可能使用错误的 token 或 tags,因为异步处理器复用了最新 route 的配置。现在每个批处理器都会保留自己的 route 配置。
- Datadog
- 修复问题:较大的合并 DogStatsD datagram 可能超过常见的 8192 字节 agent 缓冲区并被静默截断。现在只有在 payload 可容纳时才合并,否则回退为每个 metric 一个 datagram。
- Zipkin
- 修复问题:明确标记为未采样的请求仍会构造完整 span tag table 和 access 阶段子 span。现在未采样请求会跳过这些额外追踪工作,同时保留 trace 传播。
- OpenTelemetry
- 修复问题:运行时更新 OpenTelemetry 插件元数据不会重建用于注入 core span 的 tracer,因此这些 span 可能继续使用旧 collector 或 resource 设置,直到 worker 重启。现在元数据变化后 tracer 会刷新。
- 修复问题:
additional_attributes在 log 阶段变量填充前求值,导致依赖最终请求状态的属性缺失或过期。现在这些属性在 log 阶段求值。
- OpenID Connect
- 修复问题:
refresh_session_interval错误地默认设为900,即使用户未配置也会启用静默重认证。该默认值已移除(见升级须知)。
- 修复问题:
- MQTT Proxy
- 修复问题:
protocol_name过去是必填项,尽管标准默认值是MQTT。现在该字段可省略,并默认使用MQTT。
- 修复问题:
- Forward Auth
- 修复问题:当
request_method为POST时,插件在缓冲请求体后仍可能把客户端的Transfer-Encoding、Content-Length和Expect请求头转发给认证服务,导致请求 framing 不一致。现在这些客户端 framing 头不会再复制到认证服务请求中。
- 修复问题:当
- Authz CASBIN
- 修复问题:在不同 route 之间切换不同 Casbin model 或 policy 形状时,可能触发
casbin enforce error/invalid request size。内置lua-casbin依赖已更新,包含相关 enforce 修复。
- 修复问题:在不同 route 之间切换不同 Casbin model 或 policy 形状时,可能触发
- AI Aliyun Content Moderation
- 修复问题:在 body filter 中返回
ngx.OK可能中断后续 body filter 处理。现在插件会正常返回,使其他 filter 可以继续执行。
- 修复问题:在 body filter 中返回
- Request ID
- 修复问题:配置
algorithm: range_id但省略可选 range 对象时可能返回HTTP 500。现在 range 对象有默认值。
- 修复问题:配置
- Workflow
- 修复问题:Workflow action 插件可能在 workflow 决定跳过或执行该 action 前先运行
_meta.pre_functionhook,从而影响本不应执行的 action。现在 workflow 会先决定是否运行 action,再执行这些 meta hook。
- 修复问题:Workflow action 插件可能在 workflow 决定跳过或执行该 action 前先运行
- Redirect
- 修复问题:
http_to_https只重定向 scheme 恰好为http的请求,因此以非 HTTP、非 HTTPS scheme 到达的请求(例如通过伪造的X-Forwarded-Proto)不会被重定向。现在它会重定向所有非 HTTPS 的 scheme。
- 修复问题:
- Response Rewrite
- 修复问题:当上游响应被压缩(gzip 或 brotli)时,
filters作用在压缩字节上而无法匹配,产生损坏的响应体。现在会先解码响应再执行 filters。
- 修复问题:当上游响应被压缩(gzip 或 brotli)时,
- Batch Requests
- 修复问题:当某个流水线子请求超时时,响应数组可能比子请求数多出条目。现在子响应数量总是与子请求数量一致。
- Tencent Cloud CLS
- 修复问题:启用
include_req_body时,由于未在 access 阶段读取请求体,请求体无法被捕获。现在会在采样允许时读取请求体,使其包含在上传的日志中。
- 修复问题:启用
- Attach Consumer Label
- 修复问题:当匹配到的 Consumer 没有标签时,客户端可以伪造已配置的请求头,因为插件只在存在标签值时才覆盖该请求头。现在已配置的请求头总会从客户端请求中剥离,即使 Consumer 没有匹配的标签。
- Authz Keycloak
- 修复问题:启用
lazy_load_paths时,按 URI 解析 Keycloak 资源时包含了请求的 query string,导致带 query 参数的请求可能无法匹配目标资源。现在会在解析前剥离 query string。
- 修复问题:启用
- CAS Auth
- 修复问题:CAS 单点登出(SLO)回调
POST被代理到上游,而不是由插件处理。现在该回调由插件终止,不再转发到上游。
- 修复问题:CAS 单点登出(SLO)回调
- gRPC Web
- 修复问题:一条调试日志语句把解码后的请求体写入错误日志。该语句已移除,请求负载不再泄漏到日志中。
数据面
- 修复问题:部分日志文件被 rotation 后,网关可能仍保持旧文件句柄。现在部分 rotation 后也会正确重新打开日志。
- 修复问题:配置指令中的环境变量替换在一个变量名是另一个变量名的前缀时,可能匹配到错误的变量。现在变量名会被精确解析。
- 修复问题:在一次瞬时 DNS 或服务发现失败后,域名上游即使在名称重新解析成功后仍可能持续返回
HTTP 503。现在上游会在解析成功后恢复。 - 修复问题:升级 Prometheus 指标库(
nginx-lua-prometheus-api7升至0.20260623),移除可能导致整次抓取被拒绝的重复指标序列。
控制面
- 修复问题:配置 revision 刚变化后、下一次 heartbeat 尚未上报新 revision 前,网关实例可能短暂显示为 OutOfSync。现在新增宽限窗口,在正常同步窗口内仍保持最近有 heartbeat 的实例为 Healthy。
- 修复问题:兼容性报告被截断为 200 条且顺序不稳定,因此大报告可能隐藏 error,并在不同网关实例间显示不同结果。现在控制面会存储完整且排序后的报告,并基于全部条目计算兼容性。
- 修复问题:secret provider 的请求体可能匹配与 URL 路径中 provider 名称不同的类型,导致数据面丢弃或误读已保存 secret。现在控制面会按路径选择的 provider 类型校验请求体。
- 修复问题:控制面接受了一些数据面会静默丢弃的核心资源配置,包括非法 TLS、filter 和 IP match 配置。现在这些配置会在发布前被校验拒绝。
- 修复问题:OpenAPI schema 会拒绝 IPv6 upstream node host。现在 IPv6 host 可以被接受。
- 修复问题:batch
ssls校验使用了 SNI schema 而不是 SSL schema,导致缺少证书字段的条目可能通过校验。现在 batch SSL 校验使用正确 schema。 - 修复问题:审计日志导出只返回前 256 条。现在会导出所有匹配的审计日志。
- 修复问题:凭据查询索引可能被不执行数据库迁移的组件删除,且部分启动 schema repair 会不必要地重建当前索引。现在 schema repair 会保留当前索引,仅修复过期形状。
- 修复问题:在大型部署中,heartbeat 和实例状态查询可能变慢。新增索引和 Go 侧状态计算改善了这些查询。
3.9.15
发布日期:2026-06-22
升级须知
本次发布新增了插件配置字段:日志类插件的 log_format_extra,以及 openid-connect 的 Redis 会话存储(session.storage 和 session.redis)。由于 API7 EE 升级时先升级控制面、再升级数据面,3.9.15 的控制面会接受这些字段,而较旧的数据面尚未实现它们。请在控制面和数据面都升级到 3.9.15 之后再配置这些新选项。
在开发者门户中,仅限 SSO 的域名策略现在在服务端强制执行,而不再仅在浏览器侧生效。对于域名被映射到仅限 SSO 提供方的邮箱,本地登录与注册方式——邮箱密码登录与注册、魔法链接、密码重置——现在都会被拒绝。此前这些端点可以被直接调用,从而绕过 SSO 要求。如果 SSO 托管域名下的用户依赖本地登录,请在升级后让他们改用 SSO 登录。
开发者门户的 API 代理不再转发任意后端端点。现在只有组织维度资源的显式白名单(API Product、application、credential、subscription 和 DCR provider)会被代理,其他路径一律返回 HTTP 404。只读资源对写方法返回 HTTP 405;对 application、credential、subscription 的写操作需要 owner 或 admin 角色(否则 HTTP 403);组织维度的请求需要已认证会话(否则 HTTP 401)。如果你有集成通过门户代理访问其他端点,请改为使用受支持的 API 路径,或直接调用控制面。
开发者门户的注册同意选项 tosURL 和 beforeSignUpButtonHtml 已被合并为单个 signUpConsentLabel,用于承载同意复选框旁展示的自定义 HTML 。服务条款(Terms of Service)的接受校验现在仅在配置了 signUpConsentLabel 时才强制执行。如果你的部署设置了 tosURL 或 beforeSignUpButtonHtml,请在升级前将其值迁移到 signUpConsentLabel。
新功能
插件
- OpenID Connect
- 新增 Redis 作为会话存储后端。将
session.storage设为redis(默认仍为cookie),并在session.redis下配置连接(host、port、认证、database、key 前缀、TLS 和超时)。将会话存储在 Redis 中可以让多个网关节点和 route 共享同一会话并集中刷新 token。Redis 密码在存储时加密,已有的基于 cookie 的配置不受影响。
- 新增 Redis 作为会话存储后端。将
数据面
- 日志类插件现在支持
log_format_extra选项,它在默认日志条目之上叠加字段,而不是替换整个条目。此前,设置log_format会替换整个默认条目,并丢弃没有标量变量的字段(如各类头部的 map、解析后的查询字符串、拼接出的 URL、计算出的各类 latency);log_format_extra会保留完整的默认条目,并在其上叠加你的额外字段。 当设置了log_format时,仍以log_format为准,log_format_extra会被忽略。同时新增$upstream_unresolved_host变量,记录 DNS 解析前所配置的上游 host 或域名。 - stream(TCP)代理的 PROXY protocol 现在可以按监听端口启用。每个
stream_proxy.tcp条目可设置两个可选字段——proxy_protocol(在该端口接收 PROXY protocol)和proxy_protocol_to_upstream(向上游发送 PROXY protocol)——它们会覆盖全局的proxy_protocol.enable_tcp_pp和enable_tcp_pp_to_upstream默认值。未设置这些字段的端口沿用全局行为,因此已有配置保持不变。 - Debug session 现在会捕获每个被采样请求的日志行(所有级别),并作为 span event 附加到该请求的 trace 上。每请求日志会与 trace 一起展示在 debug session 视图中,便于将日志输出与具体被追踪的请求关联。
开发者门户
- 开发者门户现在可以运行在自定义的 PostgreSQL schema 中,而不再仅限默认的
publicschema。该 schema 在门户配置中设置(不放在连接 URL 中);门户会按连接应用该 schema,并在其中运行数据库迁移。
缺陷修复
插件
- JWT Auth
- 修复问题:签名格式错误(长度不对或不是合法的 base64url)的 token 会导致校验器抛错并返回
HTTP 500,而不是拒绝请求。格式错误的签名现在会以HTTP 401拒绝。
- 修复问题:签名格式错误(长度不对或不是合法的 base64url)的 token 会导致校验器抛错并返回
- AI Proxy 和 AI Proxy Multi
- 修复问题:当上游 LLM 提供商返回
HTTP 429或5xx响应时,网关只返回状态码而响应体为空,丢弃了提供商的错误详情(如限流信息)。当请求未重试时,上游错误响应体及其Content-Type现在会转发给客户端。
- 修复问题:当上游 LLM 提供商返回
- Loki Logger
- 修复问题:当标签值引用每请求变量(例如
$service_name或$host)时,某个请求解析出的值会被同一批次内的其他请求复用,并可能在多次请求间被固定下来,导致日志被打上错误的标签。现在标签按请求解析,每个请求的日志会按其自身的标签集分组到独立的 Loki stream 中。
- 修复问题:当标签值引用每请求变量(例如
- HMAC Auth
- 修复问题:启用
validate_request_body后,插件为校验签名而缓冲的请求体默认上限为 512 KiB,会拒绝上游本可接受的较大请求体,且超限请求体会被报告为误导性的HTTP 401。max_req_body_size默认值现在为 64 MiB(与 APISIX 对齐),超过上限的请求体会以HTTP 413拒绝。
- 修复问题:启用
数据面
- 修复问题:使用一致性哈希(
chash)负载均衡时,每当节点健康状态变化,哈希环都会仅用当前健康的节点重建,这(尤其在节点权重不均时)会打乱环并迁移那些本已映射到健康节点的 key。现在哈希环只在配置或权重变化时重建,节点健康在选择时评估,因此瞬时的健康变化不再扰乱未受影响 key 的粘性路由。这同时适用于 upstream 的chash和ai-proxy-multi的chash负载均衡。
控制面
- 修复问题:已经运行控制面期望的精确版本的数据面,在其上报了非法的插件或配置字段时,仍可能在 Dashboard 中被显示为 Upgrade Required,尽管并不存在可供升级的更新版本。运行在期望版本上的数据面现在会保持兼容;上报的配置问题仍会以配置错误(error)和警告(warning)指示单独呈现。
开发者门户
- 修复问题:若干双因素认证(2FA)错误未被正确呈现——使用错误密码启用或关闭 2FA 看似成功、备份码弹窗可能显示为空、登录时输入错误的 TOTP 验证码会静默地进入门户。现在错误的密码和 TOTP 验证码会被正确拒绝并给出明确错误。
3.9.14
发布日期:2026-06-15
不兼容变更
插件
-
升级说明
jwt-auth现在默认校验 token 的exp(过期)和nbf(生效时间)声明。此前,未设置claims_to_verify(或将其设为空列表)的 consumer 会接受任何签名正确的 token,包括已过期的 token。数据面升级后,这类 token 会被以HTTP 401拒绝。如果你依赖已过期 token 仍被接受,请在升级前评估此行为变更。如需只校验特定声明,请在 consumer 配置中显式设置
claims_to_verify。 -
升级说明
hmac-auth插件现在将signed_headers默认设为["date"]。数据面升级后,任何未显式设置signed_headers的hmac-auth配置都要求客户端签名覆盖Date头。此前未对Date签名的客户端将开始收到HTTP 401,错误信息为client request can't be validated。升级前,请确保客户端对
Date头签名,或在插件配置中显式设置signed_headers以匹配客户端实际签名的头。 -
Batch Requests
升级说明batch-requests插件现在会限制批量请求的规模。流水线子请求的数量由新增的插件元数据选项max_pipeline_items限制(默认1000),超过上限的批量请求会被以HTTP 400拒绝。包含文档之外字段的流水线条目现在会被拒绝,且每批的timeout至少为1毫秒。如果你发送的批量请求超过 1000 个子请求,请在插件元数据中调大
max_pipeline_items。如果客户端 发送了未文档化的条目字段,请在升级前移除它们。
开发者门户
-
仅对已发布的 API Product 强制开发者认证
升级说明此前,处于**草稿(draft)状态的 API Product 也会把其开发者认证规则同步到网关,因此草稿产品下的 route 也会要求开发者认证。从 3.9.14 起,只有已发布(published)**的 API Product 才会向数据面下发开发者认证规则。
升级后,属于草稿(未发布)API Product 的 route 在产品发布之前不再要求开发者认证。如果你依赖草稿产品被保护,请发布它们,或通过其他方式限制访问。
升级须知
forward-auth、ai-proxy 和 ai-proxy-multi 插件在读取请求体时现在会强制 max_req_body_size 上限(默认 64 MB)。请求体超过上限时会以 HTTP 413 Request Entity Too Large 拒绝。
如果你通过这些插件代理较大的请求体,请在升级前显式将 max_req_body_size 设为适配你业务的值。
控制面现在会在存储时加密更多保存凭证的插件字段。由于 API7 EE 升级时先升级控制面、再升级数据面,在升级间隙中,3.9.14 的控制面会加密这些字段,而仍为 3.9.13 的旧数据面无法解密,可能导致相关插件失效,直到数据面也完成升级。
本次新增加密的字段,按插件列出如下:
- AI AWS Content Moderation:
comprehend.secret_access_key - Azure Functions:
master_apikey、authorization.apikey - DingTalk Auth:
secret_fallbacks - Error Log Logger:
kafka.brokers.sasl_config.password - Feishu Auth:
secret_fallbacks - HTTP Logger:
auth_header - Kafka Logger:
brokers.sasl_config.password - Loggly:
customer_token - OpenFunction:
authorization.service_token - OpenID Connect:
session.secret - Splunk HEC Logging:
endpoint.token
如果你使用了上述插件的相关字段,请在控制面升级后尽快将数据面升级到 3.9.14,并在两侧都升级到 3.9.14 之前避免编辑这些插件。
新功能
插件
- Limit Count
- 此前由
limit-count-advanced提供的高级限流能力现已内置到limit-count。你可以配置滑动窗口(window_type设为sliding)、redis-sentinel策略、多条限流规则(rules)、由请求变量推导的count,以及通过group和sync_interval实现的共享计数器。独立的limit-count-advanced插件仍保留以兼容旧配置。
- 此前由
- AI Proxy
- 上游 LLM 请求体现在使用排序后的 key 进行 JSON 编码。这会为等价请求生成稳定、逐字节一致的请求体,从而提升按精确请求体缓存的 LLM 提供商的 prompt-cache 命中率。
- AI Proxy Multi
- 新增
max_retries以限制 fallback 重试次数,以及retry_on_failure_within_ms,使得只有在配置时间窗内发生的失败才触发 fallback。慢速失败会直接返回客户端,避免在多个 fallback 实例间成倍累加等待时间。
- 新增
- AI Prompt Guard 及各 AI 内容审核插件
- 新增
fail_mode(skip、warn或error,默认skip),用于控制 consumer 绑定的插件在遇到无法识别格式的请求时的行为:skip放行请求,warn放行并记录日志,error以HTTP 400拒绝。
- 新增
- OpenID Connect
- 新增对
lua-resty-session的 session 选项支持(如cookie_name、cookie_path),从而可以自定义 session cookie。 - 对于本地 JWT 校验模式(例如
bearer_only配合public_key、use_jwks或private_key_jwt),client_secret现在为可选项,因为这些模式不需要 client secret。
- 新增对
- CAS Auth
cas_callback_uri现在支持绝对 URL,并原样用作 CAS service URL。当网关位于代理之后、对外可见的 callback URL 与请求路径不同时,这非常有用。
- Proxy Cache
- 内存缓存策略现在支持
Vary响应头。响应会按Vary中列出的头计算出的变体分别缓存,Vary: *的响应不会被缓存。
- 内存缓存策略现在支持
- Kafka Logger
- 新增
api_version选项(Produce API 版本0、1或2)。将其设为2后,消息时间戳会被携带并由 broker 存储;否则消息可能在记录时缺少时间戳。
- 新增
数据面
- 新增面向 AI 请求的内建 NGINX 变量(
$llm_model、$request_llm_model、$llm_prompt_tokens、$llm_completion_tokens、$llm_total_tokens、$llm_time_to_first_token、$llm_stream),可在 NGINX access log 格式中引用,以记录每个请求的 LLM 模型和 token 用量。 - Prometheus 插件现在导出 LLM token 分布直方图(
apisix_llm_prompt_tokens_dist和apisix_llm_completion_tokens_dist),以及包含首 token 时间(type="ttft")的apisix_llm_latency直方图。 - Prometheus 插件现在为 HTTP 指标增加 MCP 工具维度(
mcp_tool_name和mcp_request_type),从而可以按工具和请求类型拆分 MCPtools/call流量。
开发者门户
- 为开发者门户新增**审批(Approvals)**流程。平台管理员可以在门户中审核并接受或拒绝 API Product 订阅和开发者注册请求,申请人的组织名称会被解析以便展示。执行操作的管理员会被记录为操作者以便审计,Dashboard 也会展示解析后的操作者。
- 凭证密钥(如 key-auth、basic-auth 的 key)现在只在创建时返回一次。后续读取凭证时不再包含密钥值。
- 新增管理员**用户(Users)**页面,用于管理门户用户——列表、搜索、修改角色、封禁/解封以及删除。
- 新增门户登录的双因素认证(2FA)。
- 新增基于策略的 SSO 登录:可根据开发者的邮箱域名将其路由到指定的 SSO 提供方,支持锚定的、大小写不敏感的正则表达式匹配。
- 新增注册时可配置的服务条款(Terms of Service)确认步骤。
- 新增暗色模式。
缺陷修复
插件
- Error Page
- 修复问题:插件此前根据 upstream status 变量判断是否渲染自定义错误页,可能会替换掉真正来自上游服务的错误响应。现在插件会判定响应来源——只对网关或插件产生的错误渲染自定义错误页,而真正由上游返回的错误响应会原样透传。
- Feishu Auth 和 DingTalk Auth
- 修复问题:客户端可以传入伪造的
X-Userinfo头并被转发到上游。两个插件现在都会在认证前清除客户端传入的X-Userinfo头,确保上游只收到由插件校验的身份信息。
- 修复问题:客户端可以传入伪造的
- DingTalk Auth
- 修复问题:认证失败与上游瞬时失败未做区分。插件现在对认证错误返回
HTTP 401,对 DingTalk 或上游的瞬时失败返回HTTP 503,并提供更清晰的错误信息。
- 修复问题:认证失败与上游瞬时失败未做区分。插件现在对认证错误返回
- CAS Auth
- 修复问题:登录回调未校验已签名的发起 cookie,使得构造的回调请求可以操纵登录后的跳转目标。回调现在要求携带有效的已签名发起 cookie,否则以
HTTP 401拒绝。 - 修复问题:单点登出(SLO)的空 body
POST请求此前返回HTTP 500,现在返回HTTP 400。
- 修复问题:登录回调未校验已签名的发起 cookie,使得构造的回调请求可以操纵登录后的跳转目标。回调现在要求携带有效的已签名发起 cookie,否则以
- Authz Casdoor
- 修复问题:session cookie 名称在不同 Casdoor client 间共享,导致不同 client 的 session 可能冲突。session cookie 现在按 client 隔离命名。
- 修复问题:网关 session 未与 Casdoor token 的生命周期绑定,token 过期后仍可能被复用。现在 session 会在 Casdoor token 过期时失效,强制重新认证。
- Authz Keycloak
- 修复问题:当静态
permissions与http_method_as_scope同时使用时,派生出的方法 scope 会被写回复用的插件配置,导致 scope 跨请求累积。现在会在追加方法 scope 之前先克隆 permission 列表。
- 修复问题:当静态
- OPA
- 修复问题:对于在
send_headers_upstream中列出但 OPA 响应中未返回的头,客户端传入的值可能被转发到上游。现在这类头会被清除,确保只有 OPA 提供的值到达上游。
- 修复问题:对于在
- SAML Auth
- 修复问题:重构了插件加载和错误处理——移除了
load_resty_samlwrapper,默认关闭 debug 输出,并在认证出错时返回干净的HTTP 500。
- 修复问题:重构了插件加载和错误处理——移除了
- AI Proxy
- 修复问题:上游 LLM 超时此前被映射为
HTTP 500,现在映射为HTTP 504 Gateway Time-out。 - 修复问题:在 passthrough 模式下,客户端的 HTTP 方法和查询字符串未被转发到上游。现在它们会被保留。
- 修复问题:上游 LLM 超时此前被映射为
- AI Proxy Multi
- 修复问题:基于域名的 upstream 健康检查可能不稳定——缓存的节点选择器在健康检查器创建后可能变陈旧,且健康检查配置可能在请求间被就地修改。
- GraphQL Limit Count
- 修复问题:查询嵌套深度计算有误,导致基于深度的限流不准确。现在深度会按真实最大嵌套深度并展开 fragment 计算,Content-Type 匹配也容忍 charset 参数。
- GraphQL Proxy Cache
- 修复问题:
Content-Type带 charset 参数的请求未被识别为 GraphQL 请求。Content-Type 匹配现在容忍 charset。 - 修复问题:
PURGE请求未清除缓存条目的所有Vary变体。现在所有变体都会被清除。
- 修复问题:
- AWS Lambda
- 修复问题:对带 URL 编码或多值查询参数的请求,IAM(SigV4)认证因 canonical query string 计算错误而失败。
- AWS Secret Manager
- 修复问题:解析名称中包含斜杠的 secret 会失败。现在这类名称可以被正确解析。
- Request ID
- 修复问题:
nanoid算法可能产生重复或非法的 ID。现在 ID 使用密码学安全的随机源生成,并始终使用合法的 nanoid 字母表。
- 修复问题:
- Proxy Mirror
- 修复问题:镜像 gRPC 请求时,原始的 method path 未在镜像请求中保留。现在它会被完整保留。
- Body Transformer
- 修复问题:XML 转 JSON 时,使用 XML 命名空间前缀的 key 偶尔会丢失。现在带命名空间的 key 会被保留并可在模板中访问。
- Elasticsearch Logger
- 修复问题:使用日期占位符的动态索引模板在模板非法时可能报错。现在日期格式化已加守卫。
- 限流插件(Limit Count、Limit Req、Limit Conn)
- 修复问题:仅在 database 编号或凭证上不同的 Redis 连接可能共享同一 keepalive 连接池,导致连接被复用到错误的 database 或身份上。现在连接会按 database、凭证和 TLS 设置隔离;这也覆盖了
redis-sentinel策略。
- 修复问题:仅在 database 编号或凭证上不同的 Redis 连接可能共享同一 keepalive 连接池,导致连接被复用到错误的 database 或身份上。现在连接会按 database、凭证和 TLS 设置隔离;这也覆盖了
- Limit Conn
- 修复问题:解析后为
0的动态burst值此前被错误地判为非法。现在它被允许。
- 修复问题:解析后为
数据面
- 修复问题:当同一请求上有多个日志插件抓取响应体时,它们的响应体缓冲区可能相互干扰,产生截断或混杂的日志输出。现在每个 logger 使用独立的缓冲区。
- 修复问题:部分 logger 插件写入的 debug 日志可能泄漏凭证。这些日志已被移除。
- 修复问题:当 access 阶段被短路(例如被认证拒绝)时,log 阶段的日志插件可能失败。
- 修复问题:当插件用不同大小写设置同一个头时,缓存的请求头可能保留陈旧值。现在头的缓存键会被归一化。
- 修复问题:
consul服务发现在某个节点条目无效时会丢弃该 service 的其余所有节点。现在无效节点会被逐个跳过,其余健康节点仍会被使用。 - 修复问题:
nacos服务发现在 stream 子系统中因所需的共享字典未在该子系统声明而失败。
控制面
- 修复问题:
openid-connect允许省略client_secret的豁免适用范围过宽。现在该豁免被限定到确实不需要 client secret 的 OIDC flow。 - 修复问题:按 gateway group 维度列出 label 时,返回的是该资源类型的全局 label,而不是限定到该 gateway group 的 label。
- 修复问题:开发者门户的组织邀请未遵循所配置的邮箱验证要求。
3.9.13
发布日期:2026-05-22
不兼容变更
插件
-
CAS Auth
升级说明cas-auth插件现在要求配置长度至少为 32 个字符的cookie.secret。插件使用该密钥对CAS_REQUEST_URIcookie 进行 HMAC 签名和校验,防止客户端可控 cookie 修改登录后的跳转目标。升级前,请为所有已有
cas-auth配置补充cookie.secret,并确保所有 网关节点使用相同密钥。
升级须知
proxy-cache 和 graphql-proxy-cache 插件现在默认使用更安全的缓存行为。
对于 proxy-cache,当请求存在已认证 consumer 或 remote user 时,缓存会按 consumer 隔离,除非配置的 cache_key 已经包含身份相关变量。内存缓存策略也不再缓存上游 Cache-Control 包含 private、no-store 或 no-cache 的响应;内存和磁盘缓存策略都默认跳过带 Set-Cookie 的响应,除非设置 cache_set_cookie: true。
对于 graphql-proxy-cache,缓存键默认包含 host、route、service 和 consumer 身份,带 Set-Cookie 的响应默认也会被跳过,除非设置 cache_set_cookie: true。
如果你确实需要跨 consumer 共享缓存,请设置 consumer_isolation: false。如果你确实需要缓存带 Set-Cookie 的响应,请设置 cache_set_cookie: true。
新功能
插件
- AI Proxy
- 优化 OpenAI 兼容流式响应吞吐,降低逐 token flush 和 SSE 解析开销。在使用 mock OpenAI 上游的内部单 worker benchmark 中,峰值流式吞吐从 44,102.6 tokens/s 提升到 138,158.7 tokens/s,约提升 3.13 倍。
- 优化使用
post_arg.*路由变量的 AI 大 JSON 请求体处理。在 1 MB、5 MB、10 MB OpenAI Chat Completions 兼容请求体的内部 benchmark 中,当网关透传原始请求体时吞吐提升 5.15-5.35 倍;当网关转发前改写请求体时吞吐提升 2.47-2.67 倍。 - 新增
streaming_flush_interval_ms,用于控制流式响应的周期性 flush。默认值为 10 ms,可降低逐 chunk flush 开销,同时保持有界的流式响应延迟。
- OpenAPI to MCP
- 新增
allowed_hosts,用于限制动态解析后的base_url可访问的目标主机。未配置allowed_hosts时,既有行为不变。插件现在也会对解析后的 URL 进行校验,对非法 URL 或非 HTTP(S) scheme 返回 HTTP 400。
- 新增
- Proxy Cache 和 GraphQL Proxy Cache
- 新增
consumer_isolation和cache_set_cookie选项,用于控制升级说明中描述的更安全缓存行为。
- 新增
控制面
- Alert Policy 现在支持在告警条件触发时自动创建 Debug Session。Alert History 会记录 Debug Session 创建是否成功,并包含创建出的 session ID 或错误详情。
- Fallback Control Plane 存储现在支持 S3-compatible path-style endpoint,可用于 MinIO 等要求 bucket 名称出现在 URL path 中的 S3 兼容服务。
控制台(Dashboard)
- Gateway Group 下新增 Debug Sessions UI,包括 session 列表、创建、停止、删除、trace 列表、trace waterfall 详情、搜索和过滤、minimap、URL 状态同步、字段格式化和键盘导航。
- 删除/停用确认弹窗新增复制按钮,用户可在执行破坏性操作前复制资源标识。
- 监控页面的 service 和 route 选择器支持搜索。
开发者门户
- 新增用于在 Kubernetes 中部署 Developer Portal 的 Helm chart。
缺陷修复
插件
- OpenID Connect
- 修复问题:客户端传入的身份头(
X-Access-Token、X-Userinfo、X-ID-Token、X-Refresh-Token)可能被转发到上游,而不是使用插件校验后的值。现在这些头会被清除或覆盖,确保上游只收到由插件控制的身份信息。
- 修复问题:客户端传入的身份头(
- Data Mask
- 修复问题:插件在处理多值 query 参数、无值 query 参数、非字符串 JSON 值、regex 失败和表单解析错误时可能崩溃或产生错误脱敏结果。regex 替换失败时也不再把原始敏感值写入日志。
- ACL
- 修复问题:
external_user_label_field_parser和external_user_label_field_separator可能错误地应用到 consumer labels,导致错误的允许或拒绝决策。现在它们只用于 external-user label 提取路径。
- 修复问题:
- Chaitin WAF 和 Wolf RBAC
- 修复问题:插件向后端服务发送客户端 IP 时使用了客户端可伪造的原始 IP 请求头。现在改为使用网关解析后的可信真实客户端 IP。
- Client Control
- 修复问题:当 Global Rule 插件在 access 阶段读取请求体时,路由或服务上的
client-control无法先应用请求体大小覆盖,导致大请求被意外拒绝。
- 修复问题:当 Global Rule 插件在 access 阶段读取请求体时,路由或服务上的
控制面
- 修复问题:删除仍被其他资源引用的 Secret 会留下悬空引用,并可能导致网关运行时错误。现在 Secret 仍存在引用时会拒绝删除。
- 修复问题:当
dp_manager_address同时包含域名和 IP 地址时,Data Plane Manager 证书可能无法通过旧版 Data Plane 的主机名校验。 - 修复问题:心跳上报中的非法网关版本字符串可能导致兼容性校验崩溃。现在会将其作为不兼容版本处理,而不是触发 panic。
- 修复问题:非法的 stream route CIDR/IP 值和非法的
post_arg.*JSON path 表达式可能被控制面接受,随后在数据面被拒绝或丢弃。现在这些配置会在 API 层被拒绝。 - 修复问题:解密
AesEncrypt字段失败时,敏感加密字段值可能出现在日志中。现在日志只记录值长度。
数据面
- 修复问题:引用 service 的 stream route 可能持续使用旧的 service 级插件配置,直到 route 变更或 worker 重启。
- 修复问题:etcd 或 DP Manager 响应缺少预期 revision header 时,网关 worker 可能在启动阶段崩溃。现在网关会记录问题并重试。
- 修复问题:启用 status report 时,stream worker 可能在配置同步期间崩溃。
- 修复问题:标准网关 runtime 镜像缺少时区数据,导致
TZ环境变量对 IANA 时区名称不生效。 - 修复问题:启用 tracing 时,tracer 可能在 HTTPS 或 HTTP/2 keepalive 连接上崩溃。
- 修复问题:网关 CLI 将控制面 mTLS client certificate 文件写入系统临时目录,且权限过宽。现在这些文件会写入网关配置证书目录,并使用更严格的权限。
控制台(Dashboard)
- 修复问题:OpenID Connect 插件代码编辑器在小视口或高缩放比例下可能折叠或无法访问。
- 修复问题:从服务列表删除 Published Service 成功后,可能显示误导性的 "service not found" 错误 toast。
- 修复问题:一个页面可能修改列表表格默认值,并将非法排序参数泄漏到 Gateway Instances 页面。
- 修复问题:插件查看抽屉在 local、global 和 metadata 标签页之间切换时,可能显示过期或错误的 JSON。
- 修复问题:缓存的 gateway group 或 portal ID 不存在时,页面可能空白或显示 404 错误 toast,而不是跳转到有效的兜底资源。
3.9.12
发布日期:2026-05-08
新功能
插件
- AI Proxy
- 新增 AWS Bedrock 提供商 支持,使用 Converse API。通过配置
"provider": "bedrock"、auth.aws中的 AWS IAM 凭证和provider_conf.region中的 AWS 区域即可使用。支持非流式和流式(ConverseStream)两种模式——在请求体中设置"stream": true即可获取流式响应。
- 新增 AWS Bedrock 提供商 支持,使用 Converse API。通过配置
- OAS Validator
- 新增
spec_url字段,支持从远程 HTTP(S) URL 加载 OpenAPI 规范,替代在插件配置中内嵌完整 JSON 字符串。当规范文件超过spec字段的 2 MB 内联大小限制时特别有用。获取的规范使用可配置的 TTL 进行缓存(默认 1 小时,通过插件元数据spec_url_ttl设置),过期条目在后台刷新期间继续提供服务。另提供spec_url_request_headers(自定义 HTTP 头,如用于认证)和timeout(请求超时,毫秒,默认 10000)字段。spec和spec_url互斥。
- 新增
缺陷修复
插件
- File Logger
- 修复问题:当路由同时配置了
gzip插件和file-logger(启用include_resp_body)时,file-logger错误地尝试解压响应体。由于 APISIX 自身执行了 gzip 编码,日志器可用的响应体仍然是明文,导致产生虚假的inflate gzip err: INFLATE: data error日志条目,并且日志输出中丢失了响应体内容。
- 修复问题:当路由同时配置了
- Elasticsearch Logger
- 修复问题:使用日期时间占位符的动态索引模式(如
gateway-{%Y.%m.%d})在第一个请求后停止轮转。解析后的日期字符串被回写到共享配置对象中,永久覆盖了模板,直到工作进程重启。
- 修复问题:使用日期时间占位符的动态索引模式(如
- OAS Validator
- 修复问题:请求头参数校验区分大小写,当请求中的头名称大小写与 OpenAPI 规范定义不完全匹配时(例如发送
X-Request-Id而规范定义的是x-request-id),请求会被拒绝。现已按照 RFC 7230 §3.2 实现大小写不敏感匹配。
- 修复问题:请求头参数校验区分大小写,当请求中的头名称大小写与 OpenAPI 规范定义不完全匹配时(例如发送
3.9.11
发布日期:2026-04-30
升级须知
本版本将 secret 引用($secret://、$env://)扩展为所有插件集中支持。升级控制面到 3.9.11 后,如果在之前不支持 secret 引用的插件字段中配置了 secret 引用,仍运行 3.9.10 或更早版本的数据面将不会解析这些引用——它会将字面量 $secret://... 字符串传递给插件。
推荐升级路径:在配置新支持的插件字段中的 secret 引用之前,先将所有数据面升级到 3.9.11。之前已支持 secret 的插件(jwt-auth、openid-connect、limit-count、authz-keycloak、csrf、limit-req、limit-conn)不受影响。
新功能
插件
- AI Proxy
- 新增 passthrough 协议适配器,可将无法识别的 API 格式(如
/v1/images/generations)透传至上游而不进行转换。此前,不匹配已知协议(OpenAI Chat、Completions、Embeddings 等)的请求会被拒绝。 - 使用白名单构建方式重写了 Anthropic 到 OpenAI 的协议转换器。这防止了 Anthropic 特有字段(如
metadata、top_k、thinking、output_config)泄漏到 OpenAI 兼容的上游提供商,并改善了工具调用、系统提示和多模态内容的转换准确性。 - 当 ai-proxy 使用 cosocket 传输调用 LLM 后端时,访问日志中的上游 nginx 变量(
$upstream_status、$upstream_addr、$upstream_response_time、$upstream_header_time、$upstream_connect_time、$upstream_response_length)现在能正确填充。此前由于绕过了 nginx 的 upstream 模块,这些变量为空。
- 新增 passthrough 协议适配器,可将无法识别的 API 格式(如
- OAS Validator
- 用纯 Lua 实现(
lua-resty-openapi-validator)替换了基于 Go FFI 的 OpenAPI 验证器。基于真实大规模 OpenAPI 规范(Stripe,约 414 个端点)的内部基准测试显示,新验证器每次请求校验快 2-7 倍,规范编译快 20 倍,同时消除了 Go 共享库从而减小了网关镜像体积。新验证器还修复了路径参数路由、nullable schema、allOf/anyOf 合并的正确性问题,并新增了对 form-encoded 请求体校验的支持(此前实现无法处理)。
- 用纯 Lua 实现(
- 所有插件现在自动支持在任何配置字段中使用
$secret://和$env://引用。此前仅少数插件(jwt-auth、openid-connect、limit-count、authz-keycloak、csrf、limit-req、limit-conn)显式支持 secret 引用。这消除了每个插件单独实现 secret 解析的需要。
数据面
- 新增 distroless 网关镜像变体(
api7-ee-3-gateway-distroless)。该镜像从零构建,仅包含运行网关所需的共享库、CA 证书和时区数据,消除了运行时未使用但携带 CVE 的操作系统包。