更新日志
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。如果客户端发送了未文档化的条目字段,请在升级前移除它们。
升级须知
当数据面启用数据加密(apisix.data_encryption.enable: true)时,以下插件字段现在会在落盘时加密存储(在原有已加密字段之外新增)。请检查你是否使用了这些插件:
- 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
只有这些凭据的落盘表示(etcd / 备份 / 导出)从明文变为密文,Admin API 返回的值不变。由于控制面一升级就会加密这些字段,请将数据面与控制面一起升级(或在依赖该加密前先升级数据面)——新控制面搭配尚不解密这些字段的旧数据面时,会把密文透传给上游。如果你未启用数据加密,则没有任何变化。
此前仅 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 兼容。
当数据面启用数据加密(apisix.data_encryption.enable: true)时,以下插件的 secret_fallbacks 字段现在会在落盘时加密存储(在原有已加密字段之外新增):
- feishu-auth:
secret_fallbacks - dingtalk-auth:
secret_fallbacks
只有这些凭据的落盘表示(etcd / 备份 / 导出)从明文变为密文,Admin API 返回的值不变。由于控制面一升级就会加密这些字段,请将数据面与控制面一起升级(或在依赖该加密前先升级数据面)——新控制面搭配尚不解密这些字段的旧 3.9.13 数据面时,会把密文透传给上游。如果你未启用数据加密,则没有任何变化。
新功能
插件
- 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.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)确认步骤。
- 新增暗色模式。