更新日志
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 的操作系统包。
控制台(Dashboard)
- 配置兼容性警告和错误现在通过数据面实例卡片上的可点击徽章单独显示。点击徽章打开一个详细模态框,展示所有配置问题的表格(资源类型、ID、严重级别和消息),便于识别和解决配置 schema 问题,而不会与版本兼容性状态混淆。
缺陷修复
插件
- AI Proxy Multi
- 修复问题:控制面推送配置更新后,健康检查验证记录大量噪声警告日志(
unable to construct upstream for plugin: ai-proxy-multi),因为 DNS 解析状态在配置表替换时丢失。
- 修复问题:控制面推送配置更新后,健康检查验证记录大量噪声警告日志(
- AI Rate Limiting
- 修复问题:包含点号的 AI 实例名称(如
Qwen3.5-397B-10.249.238.157)导致 HTTP 500 错误,因为名称被错误地解析为ctx.var路径表达式而非常量键。
- 修复问题:包含点号的 AI 实例名称(如
- AI Request Rewrite
- 修复问题:无请求体的请求产生模糊的上游错误,而非返回明确的 HTTP 400 Bad Request。
- AI Prompt Template
- 修复问题:JSON 解析错误消息显示为混乱的 Lua 表引用(如
table: 0x...),而非可读的错误字符串。
- 修复问题:JSON 解析错误消息显示为混乱的 Lua 表引用(如
- OpenTelemetry
- 修复问题:
additional_attributes中的非字符串值(如来自 nginx 变量的数字或布尔值)被 OpenTelemetry SDK 静默丢弃。现在在添加到 span 之前会强制转换为字符串。
- 修复问题:
- Limit Count
- 修复问题:Redis 凭证(
redis_password、redis_username、sentinel_password)被嵌入速率限制分组键中,在 Redis 键空间和 APISIX 日志中暴露敏感信息。
- 修复问题:Redis 凭证(
- Traffic Split (Stream)
- 修复问题:在 stream(L4)上下文中
ctx.var.route_id始终返回 nil,导致 traffic-split 规则中基于route_id的匹配条件永远无法生效。 - 修复问题:在 stream 上下文中,traffic-split 通过
upstream_id选择的上游被忽略,始终使用路由原始的上游。
- 修复问题:在 stream(L4)上下文中
控制面
- 修复问题:配置兼容性报告中的警告级别条目错误地导致数据面实例显示“建议升级”,即使控制面和数据面版本一致。
数据面
- 修复问题:批处理器在 nginx worker 关闭期间进入无限定时器循环,阻止优雅关闭并产生大量
[alert]日志。 - 修复问题:批处理器的
processed_entries计数器在过期缓冲区清理时被重置,导致批处理插件(如 http-logger、kafka-logger)的投递指标不准确。 - 修复问题:活跃健康检查的
request_body配置被静默忽略,因为底层健康检查库期望字段名为http_req_body。schema 字段已重命名以匹配。 - 修复问题:加密/解密操作失败时,错误日志中暴露敏感字段值。错误消息不再包含原始值。
- 修复问题:升级过程中新增
encrypt_fields后,预存明文数据的预期解密失败产生噪声的 warn 级别日志。这些日志现在记录为 info 级别并附带解释说明。
3.9.10
发布日期:2026-04-22
不兼容变更
插件
-
升级说明
OpenAPI2MCP 服务不再内置于网关镜像中,现作为独立 sidecar 容器(
api7/openapi-to-mcp)运行,网关镜像体积因此减少约 150 MB。如果你使用了openapi-to-mcp或mcp-tools-acl插件,需要在网关旁部署 OpenAPI2MCP sidecar 容器。Kubernetes 环境中,在网关 Helm chart 中启用openapiToMcp.enabled=true。Docker Compose 环境中,将api7/openapi-to-mcp容器与网关置于同一网络命名空间下。
升级注意事项
本版本为多个插件新增了 encrypt_fields:AI Proxy(auth.header、auth.query、auth.gcp.service_account_json)、AI Proxy Multi(instances.* 下的相同字段)、AI RAG(embeddings_provider.azure_openai.api_key、vector_search_provider.azure_ai_search.api_key)、AWS Lambda(authorization.apikey、authorization.iam.accesskey、authorization.iam.secretkey)、OpenID Connect(新增 client_rsa_private_key)和 SAML Auth(新增 secret_fallbacks)。
控制面升级到 3.9.10 后,在写入路由/服务配置到 etcd 时会加密这些新声明的字段。如果数据面仍运行旧版本(3.9.9 或更早),由于旧版不识别这些新的 encrypt_fields,将跳过解密,导致加密后的密文被原样使用——例如,AI Proxy 路由会将 AES 密文而非真实 API Key 发送给 LLM 提供商,导致静默的认证失败(LLM 返回 HTTP 401)。
推荐升级路径:按照标准升级顺序——先升级控制面,再升级数据面。但在升级控制面后,请勿修改上述受影响插件的配置,直到所有数据面都升级到 3.9.10。对这些插件的任何配置编辑或重新发布都会 导致控制面加密新声明的字段,而旧版数据面无法解密。请在控制面升级后尽快将数据面升级到 3.9.10,以恢复完整的加解密一致性。
新功能
插件
- AI Proxy
- 新增
override.request_body支持按协议深度合并请求体覆盖,以及override.llm_options提供感知提供商的max_tokens映射。运维人员可通过request_body_force_override标志将协议特定参数(如max_tokens、stop_sequences)设置为默认值或强制值。优先级顺序:model options → LLM options(始终强制)→ request body(按协议深度合并)。 - 新增
max_stream_duration_ms和max_response_bytes安全限制,防止无界限的 LLM 流式响应导致 worker 进程 CPU 占用过高。超出任一限制时,流将被优雅终止并返回相应错误信号。 - 网关现在可在流式传输过程中检测客户端断开连接,并立即停止从 LLM 上游读取数据,释放 worker 资源并避免不必要的 API 配额消耗。
- 新增
- Prometheus、OpenTelemetry、Zipkin
- 新增
response_source标签(Prometheus)和apisix.response_sourcespan 属性(OpenTelemetry、Zipkin),用于分类每个响应的来源:"apisix"(由 APISIX 生成,如插件拒 绝或路由未找到)、"nginx"(NGINX 代理错误,如连接被拒绝或上游超时)或"upstream"(来自上游服务的真实响应)。这使得在监控面板和告警中可以更精确地归因错误来源。
- 新增
控制面
- 新增 Consul 服务发现支持。网关现在可以发现注册在 Consul 中的上游服务,支持基于元数据的过滤和健康检查感知的节点选择。
- 控制面现在可通过心跳动态推送遥测配置(如追踪采样率和导出端点)至数据面,无需重启网关。
- SSL/SNI 配置新增
skip_mtls_uri_regex字段,允许指定的 URI 模式跳过 mTLS 客户端证书校验,同时对其他所有 URI 保持 mTLS 强制校验。 - 新增
POST /apisix/admin/configs/validate批量配置校验接口。运维人员可在应用配置前校验路由、服务、上游和插件配置,在不影响线上流量的情况下捕获 schema 错误。 - DP Manager 现在在 7943 端口通过 cmux 支持原生 gRPC etcd 协议,为数据面在现有 HTTP etcd 协议基础上提供额外的连接选项。
encrypt_fields机制现在支持嵌套和复杂字段结构,包括任意深度的点分路径、数组和 map。包含深层嵌套敏感字段的插件配置(如auth.gcp.service_account_json)现在可以正确加密存储。
控制台(Dashboard)
- Key Auth 和 Basic Auth 插件新增表单模式配置,支持可视化 凭证设置,无需手动编辑 JSON。
- 新增 OpenID Connect 快速启动预设模板,为常见身份提供商提供预填充的配置模板,简化 OIDC 插件初始配置。
- 上游配置界面新增 Consul 作为可选的服务发现类型。
缺陷修复
插件
- AI Proxy
- 修复问题:当 LLM 提供商每秒发送大量小型 SSE 数据块(如单字符推理 token)时,单个流式请求可能导致 worker 进程 CPU 占用率达到 100%,影响该 worker 上所有其他流量的可用性。
- 修复问题:当协议转换器处于活跃状态(例如 Anthropic 转 OpenAI)且上游返回了格式不兼容的 SSE 事件时,网关返回 500 错误而非 502。现在当上游响应格式与配置的协议转换不兼容时,网关正确返回 502 Bad Gateway。
- 修复问题:当 LLM 提供商在可空响应字段(如
prompt_tokens_details或usage)中返回 JSONnull时,网关崩溃,因为 JSON null 哨兵值通过了 Lua 真值检查但无法作为 table 索引。
- AI Rate Limiting
- 修复问题:上游提供的用量键(来自 LLM 响应用量数据)与保留的表达式环境名称(如
math或abs)冲突时,可能遮蔽内置函数,导致限速表达式求值异常或绕过限制。
- 修复问题:上游提供的用量键(来自 LLM 响应用量数据)与保留的表达式环境名称(如