更新日志
3.10.4
发布日期:2026-07-27
升级须知
升级说明 — Logger 请求/响应体大小上限校验更严格
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 结构性指标标签不再允许禁用
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%,且在流量停止后也不会恢复。现在字典写满会优雅降级,并记录「上报的指标数据可能不完整」的日志。