更新日志
3.10.2
发布日期:2026-06-29
升级须知
当启用数据面数据加密(apisix.data_encryption.enable: true)时,以下插件字段现在会在落盘时加密存储(在原有已加密字段之外新增)。请检查是否使用了这些插件:
- 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)插件也会加密存储这些字段。
只有这些凭据在落盘(etcd / 备份 / 导出)时的表示从明文变为密文;Admin API 返回的值不变。由于控制面在升级后会立即加密这些字段,请将数据面与控制面一起升级(或在依赖控制面之前先升级数据面)——尚未支持解密这些字段的旧数据面会把密文当作明文密钥使用(例如无法通过 Redis 或 Elasticsearch 的认证)。如果未启用数据加密,则不受影响。
当 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 Request
- 修复问题:限流计数的键设置方式导致挂在共享资源(如 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。如果客户端发送了未文档化的条目字段,请在升级前移除它们。
升级须知
当数据面启用数据加密(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 返回的值不变。由于控制面一升级就会加密这些字段,请将数据面与控制面一起升级(或在依赖该加密前先升级数据面)