云原生网关常见问题

云原生网关常见问题

本文介绍 MSE 云原生网关使用过程中的常见问题。

MSE 云原生网关支持 IPv6 吗?

支持。网关的流量入口是 CLB/NLB,只需在 基本概览 页面的 网关入口 页签绑定一个开启 IPv6 CLB 或者 NLB 即可。

云原生网关支持 x-real-ip 请求头吗?

默认不支持。 x-real-ip Nginx 特有请求头,需要使用网关的 http-real-ip 插件,该插件会根据配置提取客户端 IP 然后将其写入 x-real-ip 请求头中。

云原生网关支持 x-forwarded-for 请求头吗?

支持。如果原始请求中携带 x-forwarded-for 请求头,网关会将新的 IP 地址添加到该请求头的末尾。该 IP 是网关前一跳的地址。如果原始请求中没有 x-forwarded-for ,网关会添加该请求头并将新的 IP 地址写入其中。

说明

SpringBoot 内置的 Tomcat 会默认删除 x-forwarded-for 头部中的最后一个地址。通过 SpringBoot 新增配置 server.forward-headers-strategy=none 可以避免这种删除操作。

云原生网关在转发请求时携带的请求头及其含义

请求头

描述

x-request-id

云原生网关为每次请求生成的唯一 id。

x-forwarded-proto

客户端请求云原生网关使用的通信协议。

req-start-time

云原生网关收到请求开始时间的毫秒时间戳。

x-forwarded-for

用于识别通过代理服务器连接到 Web 服务器的客户端的原始 IP 地址。

x-envoy-original-host

客户端请求云原生网关使用的 host 头。

original-host

客户端请求云原生网关使用的 host 头。

host

云原生网关请求服务端使用的 host 头。

x-envoy-attempt-count

发送到 upstream 以指示当前请求在一系列重试中是第几次尝试。初始请求时值为“1”,每次重试时该值增加 1。

x-envoy-external-address

请求云原生网关的外部客户端的原始地址,详见 x-envoy-external-address

tracestate

开启链路追踪会生成的 header,W3C 协议头。

ot-traceid

开启链路追踪会生成的 header,W3C 协议的 traceid。

traceparent

开启链路追踪会生成的 header,W3C 协议头。

x-envoy-decorator-operation

开启链路追踪会生成的 header,由 trace 生成的服务端 span 名称。

x-envoy-expected-rq-timeout-ms

路由设置的请求超时时间(ms)。

云原生网关中转发请求出现 upstream connect error or disconnect/reset header 问题

该问题是由于后端服务的安全组不允许网关访问服务端口引起的 upstream connect error or disconnect/reset header 问题。您可以在网关实例的 基本概览 页面,单击 安全组授权 页签,然后单击 授权安全组 新增安全组配置。网关会直接转发请求到 ACK Pod IP,安全组授权中需要开放 Pod 使用的端口。

云原生网关中如何使用 Header 来匹配域名?

创建路由时新增请求头 Header 匹配规则。Header 字段名填 :authority ,Header 值填具体的域名。

云原生网关看不到插件日志

可能的原因有:

  • 插件默认只打印 Info 及以上级别的日志,当前日志级别为 Trace Debug 时不会打印。

  • 插件没有正常启动,可能是由于编译问题。可以清空默认日志查询语句,以便查看插件启动阶段的报错日志。请参考插件开发文档进行正确的编译,并在本地使用 docker compose 模式进行插件调试,以确认插件本身没有问题,然后再将其上传到云原生网关。

云原生网关请求因为 Body 太大报错

该问题是由于网关连接 Buffer 太小导致的。可以调大 Buffer:

  • 如果协议为 HTTP 1.x:在控制台调整参数 DownstreamConnectionBufferLimits

  • 如果协议为 HTTP 2:在控制台调整参数 DownstreamConnectionBufferLimits InitialStreamWindowSize

云原生网关添加服务来源的限制有哪些?

  • 单个网关实例最多只能关联 3 ACK 容器服务。

  • 单个网关实例最多只能关联 3 Nacos 实例。

云原生网关添加服务来源时无法选到已有的 Nacos 或者 ACK?

云原生网关只能添加同 VPC 内的 Nacos 或者 ACK,不支持跨 VPC 添加服务来源。

云原生网关是否支持自有 HTTPS 证书?

云原生网关自身不托管证书,会从阿里云 SSL 拉取证书。您可以通过在 SSL 证书服务 上传自有证书,然后在网关域名中配置。

云原生网关控制台参数变更会不会对现有流量造成影响?

  • XffTrustedNum 修改后,需要重启网关才能生效。

  • UpstreamIdleTimeout 修改后,上游连接会断开重连。

  • DownstreamIdleTime 修改后,下游连接会断开重连。

云原生网关 CLB 443 端口健康检测状态显示异常

在网关上没有配置 HTTPS 域名时,网关不会监听 443 端口,因此 CLB 443 端口健康检测显示异常。您需要在网关上配置 HTTPS 域名,具体操作,请参见 创建域名 。如果使用 Ingress,具体操作,请参见 K8s Ingress

云原生网关创建服务后,健康检查状态显示异常

网关给后端服务转发请求的前提是保证网关与后端服务网络的连通性。服务的健康检查状态为异常,一般有以下几种情况:

  • 对于 VPC 内的私网服务,请检查后端服务所在的安全组是否已经授权网关访问对应的端口,请参见 设置安全组规则

  • 对于公网上的服务,请检查 VPC 是否具有公网访问的能力,可尝试使用公网 NAT 网关 SNAT 功能访问互联网,请参见 使用公网 NAT 网关 SNAT 功能访问互联网

  • 对于 HTTP 类型的健康检查,请确保请求路径和请求域名设置正确。

  • 对于 HTTP 类型的健康检查,若后端服务的健康检查接口需要通过 HTTPS 来访问,请在服务的 策略配置 中设置为 单向 TLS 模式。

  • 对于 HTTP 类型的健康检查,若以上步骤均没问题,可能是健康检查的间隔时间与后端服务的连接保持时间相同所致,可尝试调大健康检查的间隔时间。

云原生网关如何判断请求错误原因?

  • 查看响应 Header 是否包含 x-envoy-upstream-service-time 头部。正常情况下,若响应中包含 x-envoy-upstream-service-time 头部,则表明网关已将请求转发给后端服务处理,后续的请求出错与后端服务自身逻辑存在很大的关系。

  • 查看网关的访问日志中 upstream_service_time 是否为空。正常情况下,若访问日志中字段 upstream_service_time 不为空,则表明网关已将请求转发给后端服务处理,后续的请求出错与后端服务自身逻辑存在很大的关系。

云原生网关中更新 HTTPS 证书后不生效?

该问题通常是由于在网关前面也配置了 HTTPS 证书,例如 CLB、DCDN、WAF、DDoS 高防等。请检查网关前面的节点是否也同步更新了 HTTPS 证书,最佳实践是只在一个地方做 HTTPS 证书配置,如果网关前面接了 DCDN、WAF,可以只在其上配置 HTTPS,后端网关走 HTTP 即可。

云原生网关中修改参数配置项不生效?

该问题通常是由于使用了 MSE Ingress。在 MseIngressConfig 中有相关的配置项,MSE Ingress 会自动同步 MseIngressConfig 中的配置项到 MSE 网关控制台,在控制台修改配置项后有可能出现被 MSE Ingress 同步信息覆盖的情况,建议统一使用 MSE Ingress 方式修改配置项。

云原生网关路由优先级是怎么排序的?

在网关实例 路由配置 页面看到的路由配置列表顺序就是路由匹配优先级顺序。该顺序是由高到低,匹配优先级分为域名与路由规则。域名匹配是 精确域名大于泛域名 ,例如 test.example.com 的优先级大于 *.example.com 域名。同域名的 Path 优先级匹配规则是 精确匹配 > 前缀匹配 > 正则匹配 ,同域名同 Path 的优先级匹配规则是 匹配条件多 > 匹配条件少 (匹配条件:Header、Query 匹配条件)。

云原生网关前面接 DCDN 后,HTTPS 请求访问失败?

该问题通常是由于 DCDN 在回源访问网关时没有携带 SNI 引起。请在 DCDN 的回源配置中设置回源 SNI。

云原生网关前面接 WAF 后,HTTPS 请求访问失败?

该问题通常是由于 WAF 在回源访问网关时没有携带 SNI 引起。在 WAF 中使用 CNAME 方式接入的,需要修改对应接入域名,在 配置转发 中选择 启用回源 SNI

云原生网关是否支持 Websocket?

支持,且默认开启 Websocket 协议支持。

云原生网关是否支持 gRPC?

支持。gRPC 使用 HTTP/2 协议传输,请确认网关 参数配置 中的 EnableHttp2 = true

云原生网关是否支持 GZIP 解压缩?

支持。请确认网关 参数配置 中的 EnableGzip = true ,压缩算法支持 Gzip Brotli,通过参数 ZipAlgorithm 配置,默认值为 Gzip。

云原生网关是否支持保留请求/响应头的大小写?

支持。请确认网关 参数配置 中的 PreserveHeaderFormat = true 。该参数只对 HTTP 1.0 或者 1.1 生效,根据规范 HTTP 2 协议要求请求/响应头全部为小写。

云原生网关是否支持 HTTP/3?

支持。请确认网关 参数配置 中的 EnableHttp3 = true

云原生网关是否支持自定义监听端口?

支持。云原生网关支持 HTTP(80 端口)与 HTTPS(443 端口)。在 CLB 控制台新增监听端口,例如新增 TCP 8080 端口,并将 80 端口设置为同一个虚拟服务器组即可处理 HTTP 协议。

云原生网关为什么请求经过网关后,请求/响应头全部变成小写?

网关默认会将请求/响应头全部置为小写。如果需要保留大小写,调整网关 参数配置 中的 PreserveHeaderFormat = true

云原生网关创建了一个 DNS 域名服务,为什么访问失败?

如果配置的 DNS 域名是公网域名,需要在 NAT 网关中配置 SNAT,以允许网关访问外网,网关默认无法访问外网。

云原生网关请求出现 400 错误

该错误通常是由于以下两种可能原因:

  • 客户端发送的协议错误。查看网关的访问日志,日志中 response_flags = DPE

  • 后端服务返回的 400。查看网关的访问日志,如果日志中 response_flags 等于空且 upstream_host 有值说明是后端服务返回 400,网关转发的具体后端 IP 就是 upstream_host 内容。

建议使用 AI 诊断 功能进行初步分析。

云原生网关请求出现 401 错误

该错误通常是由于以下两种可能原因:

  • 网关返回说明无访问凭证。请检查是否开启了认证鉴权或 Wasm 插件。

  • 后端服务返回的 401。查看网关的访问日志,如果日志中 response_flags 等于空且 upstream_host 有值说明是后端服务返回 401,网关转发的具体后端 IP 就是 upstream_host 内容。

建议使用 AI 诊断 功能进行初步分析。

云原生网关请求出现 403 错误

该错误通常是由于以下两种可能原因:

  1. 网关返回说明无权限访问。请检查是否开启了 IP 黑白名单、认证鉴权或者 Wasm 插件。

  2. 后端服务返回的 403。查看网关的访问日志,如果日志中 response_flags 等于空且 upstream_host 有值说明是后端服务返回 403,网关转发的具体后端 IP 就是 upstream_host 内容。

建议使用 AI 诊断 功能进行初步分析。

云原生网关请求出现 404 错误

该错误通常是由于以下两种可能原因:

  • 网关中缺少对应的路由规则。查看网关的访问日志,如果日志中 response_flags = NR 说明网关中缺少路由规则。

  • 后端服务返回的 404。查看网关的访问日志,如果日志中 response_flags 等于空且 upstream_host 有值说明是后端服务返回 404,网关转发的具体后端 IP 就是 upstream_host 内容。

建议使用 AI 诊断 功能进行初步分析。

云原生网关请求出现 405 错误

开启了 WAF 防护,请求命中了 WAF 的防护规则,该状态码为 WAF 返回。

云原生网关请求出现 413 错误

该错误通常是由于以下两种可能原因:

  • 请求大小超过网关的链接缓存大小。需要调大 参数配置 中的 DownstreamConnectionBufferLimits

  • 后端服务返回的 413。查看网关的访问日志,如果日志中 response_flags 等于空且 upstream_host 有值说明是后端服务返回 413,网关转发的具体后端 IP 就是 upstream_host 内容。

建议使用 AI 诊断 功能进行初步分析。

云原生网关请求出现 429 错误

触发网关限流规则。查看网关的访问日志,日志中 response_flags = RL ,请检查网关限流规则。

建议使用 AI 诊断 功能进行初步分析。

云原生网关请求出现 502 错误

该错误通常是由于以下两种可能原因:

  • 后端服务返回的请求协议错误。查看网关的访问日志,日志中 response_flags = UPE ,最常见的情况是后端服务返回的 Header 中含有重复的 Transfer-Encoding 字段,请检查后端服务。

  • 后端服务返回 502。查看网关的访问日志,如果日志中 response_flags 等于空且 upstream_host 有值说明是后端服务返回 502,网关转发的具体后端 IP 就是 upstream_host 内容。

建议使用 AI 诊断 功能进行初步分析。

云原生网关请求出现 503 错误

该错误通常是由于以下可能原因:

  • 网关中配置的路由规则中的目标服务没有健康的 IP 地址。查看网关的访问日志,日志中 response_flags = UH

  • 网关转发请求时链接被后端服务关闭。查看网关的访问日志,日志中 response_flags = UC ,通常是由于后端服务的连接空闲时间 idle timeout 小于网关 UpstreamIdleTimeout 引起,请在网关的 参数配置 中调小 UpstreamIdleTimeout

  • 网关无法连接后端服务 IP。查看网关的访问日志,日志中 response_flags = UF response_flags = URX ,通常是由于后端服务安全组不允许网关访问,请排查后端服务所在的安全组是否已经授权网关访问对应的端口,请参见 设置安全组规则

  • 网关中没有对应的后端服务。查看网关的访问日志,日志中 response_flags = NC ,通常是由于以下几种原因:

    • 对应的服务已经不存在。

    • 若后端服务有多个端口,在路由配置选择目标服务时需要选择一个固定端口,不能选择动态端口。

    • 后端服务选择了某个固定端口,但是服务的端口已经改变。

  • 后端服务返回 503。如果日志中 response_flags 等于空且 upstream_host 有值说明是后端服务返回 503,网关转发的具体后端 IP 就是 upstream_host 内容。

建议使用 AI 诊断 功能进行初步分析。

日志中的 response_code 字段为 0

日志中看到 response_code 字段为 0,表明客户端没有收到 response code。

该错误通常是由于以下两种可能原因:

  • 客户端提前关闭连接。例如,客户端在移动网络信号较弱的情况下,或者后端响应时间过长时,可能会出现客户端提前关闭连接的情况。在日志中,可以通过检查 response_flags 字段的值是否等于"DC"来确认此情况。

  • HTTPS 请求没有携带 SNI(TLS 扩展字段,用于携带域名信息),且没有给*域名配置 HTTPS 证书。在日志中,可以通过检查 requested_server_name 字段是否为空来确认此情况。

建议使用 AI 诊断 功能进行初步分析。