本文介绍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可以避免这种删除操作。
云原生网关在转发请求时携带的请求头及其含义
请求头 | 描述 |
| 云原生网关为每次请求生成的唯一id。 |
| 客户端请求云原生网关使用的通信协议。 |
| 云原生网关收到请求开始时间的毫秒时间戳。 |
| 用于识别通过代理服务器连接到Web服务器的客户端的原始IP地址。 |
| 客户端请求云原生网关使用的host头。 |
| 客户端请求云原生网关使用的host头。 |
| 云原生网关请求服务端使用的host头。 |
| 发送到upstream以指示当前请求在一系列重试中是第几次尝试。初始请求时值为“1”,每次重试时该值增加1。 |
| 请求云原生网关的外部客户端的原始地址,详见x-envoy-external-address。 |
| 开启链路追踪会生成的header,W3C协议头。 |
| 开启链路追踪会生成的header,W3C协议的traceid。 |
| 开启链路追踪会生成的header,W3C协议头。 |
| 开启链路追踪会生成的header,由trace生成的服务端span名称。 |
| 路由设置的请求超时时间(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添加服务来源。
创建服务时命名空间为空?
将 ACK 集群添加为 MSE 云原生网关的服务来源后,创建服务时选择容器服务(ACK),若命名空间下拉列表为空,请检查 ACK 集群 apiserver 的 SLB 白名单配置。
ACK 集群通过 SLB 提供 apiserver 访问入口,SLB 监听器(端口 6443)可配置 IP 白名单访问控制(ACL)。若白名单未包含 MSE 云原生网关绑定的交换机网段,网关无法访问 ACK apiserver 获取命名空间列表,导致命名空间下拉列表为空。
解决方法:将 MSE 云原生网关绑定的交换机网段添加到 ACK apiserver SLB 的 IP 白名单中。
云原生网关是否支持自有HTTPS证书?
云原生网关自身不托管证书,会从阿里云SSL拉取证书。您可以通过在SSL证书服务上传自有证书,然后在网关域名中配置。
SSL 证书校验失败时的日志记录规则
MSE 云原生网关对 SSL 证书校验失败的日志记录行为取决于失败阶段:
-
TLS 握手阶段失败:例如客户端证书配置错误。TLS 握手发生在 Listener 级别;握手失败时,连接尚未进入 HTTP 处理层,因此访问日志中不会生成对应记录。
-
请求转发阶段失败:TLS 握手成功后,网关向后端服务转发请求时发生的 SSL 证书校验失败会记录到访问日志中。请结合以下字段定位问题:
-
response_flags:响应失败标志。UF表示上游连接失败,NC表示未找到上游集群,UH表示上游集群中没有健康的上游主机。 -
upstream_transport_failure_reason:上游传输失败原因,用于标识 SSL 证书认证失败、连接超时等具体错误。不要使用response_code_details替代该字段。
-
要查询这些访问日志,请先在网关的参数配置中开启日志投递(SLS)功能;各字段的含义请参见日志字段详情。
云原生网关控制台参数变更会不会对现有流量造成影响?
-
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协议支持。认证鉴权插件(basic-auth、key-auth、jwt-auth 等)不支持 Websocket 请求。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错误
该错误通常是由于以下两种可能原因:
-
网关返回说明无权限访问。请检查是否开启了IP黑白名单、认证鉴权或者Wasm插件。
-
后端服务返回的403。查看网关的访问日志,如果日志中
response_flags等于空且upstream_host有值说明是后端服务返回403,网关转发的具体后端IP就是upstream_host内容。
建议使用AI诊断功能进行初步分析。
开启全局认证鉴权后请求报错 Jwt is missing 或 RBAC: access denied 怎么办?
该问题通常是由于同时开启了全局认证鉴权和消费者鉴权,两者的鉴权规则互相冲突,导致请求被网关拒绝,返回Jwt is missing或RBAC: access denied。请检查是否同时开启了这两项鉴权,确认后按网关版本关闭消费者鉴权:
-
普通版网关:在网关实例的路由配置页面找到对应路由,进入策略配置 > 认证,将开启状态修改为关闭。
-
Serverless 版网关:该版本无独立的消费者鉴权页签,请在全局认证鉴权详情页删除对应的授权规则。
云原生网关请求出现404错误
排查思路:按以下步骤依次排查,区分 404 是网关未匹配到路由导致,还是后端服务返回。
-
确认请求是否到达网关:查看响应头中的
server字段,若值为istio-envoy,说明请求已到达 MSE 云原生网关;若不是,说明请求未经过网关,请检查客户端使用的访问地址。 -
在 SLS 访问日志中定位请求:在日志服务 SLS 中,通过域名(
authority)和请求路径(path)结合时间范围过滤出对应的请求记录,并关注以下字段:-
response_flags:值为NR表示网关未匹配到路由。 -
route_name:为空表示请求未命中任何路由。 -
upstream_host:有值表示请求已转发到后端,404 由上游服务返回。 -
response_code_details:值为route_not_found表示未匹配到路由。
-
-
检查路由配置:
response_flags为NR且route_name为空时,逐项确认路由的匹配条件:-
路径匹配条件:确认路由的匹配路径拼写正确,且正则表达式无误。
-
HTTP 方法:确认路由配置的请求方法与实际请求一致。
-
请求头匹配条件:确认路由的请求头匹配条件已满足。
-
-
检查域名配置:路由配置无误但仍返回 404 且
response_flags为NR时,域名错配会导致请求无法匹配到正确的路由,需检查以下配置:-
检查是否配置了泛域名(
*域名),精确域名的优先级高于泛域名。
-
-
检查 SNI 与 Host 是否一致(HTTPS 请求):HTTPS 请求中,SNI(
requested_server_name)与 Host(authority)不一致,同样会导致 404 且response_flags为NR,通常由客户端携带了错误的 SNI 引起,两者的区别请参见Host 与 SNI 的区别。
若 route_name 不为空且 upstream_host 有值,说明网关已成功匹配路由并将请求转发到上游,404 由后端服务返回,请按以下场景排查:
-
请求路径与上游服务实际路径不一致:网关已按路由配置转发请求,但转发出去的路径不是上游服务实际提供的路径,上游因此返回 404。请对照上游服务实际暴露的接口路径核对网关转发的路径;若两者本就不同(例如网关对外暴露
/api/xxx,上游实际为/xxx),请在该路由的路由策略中开启重写策略并配置路径重写,将请求路径重写为上游实际路径。 -
请求域名与上游服务实际匹配域名不一致:上游服务(或其前置的 Web 服务器、虚拟主机)按 Host 匹配站点时,若网关转发的域名不是上游期望的域名,上游会返回 404。请在该路由的路由策略中开启重写策略并配置主机域(Host)重写,将请求域名重写为上游实际匹配的域名。
-
上游服务自身返回 404:若转发的路径与域名均与上游预期一致,则说明 404 由上游服务自身逻辑返回(例如资源确实不存在),请检查后端服务自身。
路径重写的精确重写、前缀重写、正则重写三种模式及匹配方式约束,以及主机域(Host)重写的配置方法,请参见配置重写策略。
建议使用AI诊断功能进行初步分析。
云原生网关请求出现405错误
开启了WAF防护,请求命中了WAF的防护规则,该状态码为WAF返回。
云原生网关请求出现413错误
该错误通常是由于以下两种可能原因:
-
请求大小超过网关的链接缓存大小。需要调大参数配置中的
DownstreamConnectionBufferLimits。 -
后端服务返回的413。查看网关的访问日志,如果日志中
response_flags等于空且upstream_host有值说明是后端服务返回413,网关转发的具体后端IP就是upstream_host内容。
建议使用AI诊断功能进行初步分析。
云原生网关请求出现 431 错误
该错误表示请求头字段过大(Request Header Fields Too Large)。MSE 云原生网关对请求 header 大小限制为 60 KB,超过此限制时网关直接返回 431。
请检查请求 header 总大小是否超过 60 KB,如果超过,请精简冗余的 header 字段。
如果 header 未超过 60 KB,431 可能由后端服务返回。查看网关的访问日志,如果日志中 response_flags 等于空且 upstream_host 有值说明是后端服务返回 431,网关转发的具体后端 IP 就是 upstream_host 内容。
建议使用AI诊断功能进行初步分析。
云原生网关请求出现429错误
触发网关限流规则。查看网关的访问日志,日志中response_flags = RL,请检查网关限流规则。
建议使用AI诊断功能进行初步分析。
云原生网关请求出现502错误
排查思路:先确认请求是否到达网关,再据此判断是排查前置链路还是定位后端来源。
-
确认请求是否到达网关:检查网关的访问日志中是否有对应记录,或查看响应头中的
server字段是否为istio-envoy。 -
若访问日志无对应记录,说明请求未到达云原生网关,请排查 WAF、CDN、DCDN 等前置链路。
-
若访问日志有对应记录,通过域名(
authority)和路径(path)结合时间范围过滤请求,查看以下字段判断 502 来源:-
response_flags:值为UPE表示后端协议错误。 -
upstream_cluster和upstream_host:upstream_host有值表示请求已转发到后端。
-
该错误通常是由于以下两种可能原因:
-
后端服务返回的请求协议错误。查看网关的访问日志,日志中
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诊断功能进行初步分析。
无法删除域名?
删除域名时,提示“该资源被插件配置关联,请解除关联后再删除”。
域名级插件配置关联了该域名。为防止配置丢失,系统会阻止删除该域名。
解决方法:解除插件配置与目标域名的关联后,重新删除域名。操作步骤如下:
-
进入网关详情页面,选择插件配置页签。
-
在插件配置列表中,筛选配置范围为域名且关联了目标域名的插件配置。
-
删除或修改对应的插件配置,解除与目标域名的关联。
-
重新尝试删除域名。
补充排查:如果解除关联后仍出现异常,可以通过浏览器开发者工具 (F12 → Network) 查看删除请求的响应内容,或调用 DeleteGatewayDomain API 获取详细错误信息。
云原生网关绑定 CLB/NLB 时搜索不到实例
为云原生网关绑定 CLB/NLB 时,如果在搜索列表中找不到目标实例,请排查以下条件:
-
检查 CLB/NLB 是否被其他云资源管控:由 ACK 集群等服务创建的 CLB/NLB 实例不在搜索列表中。调用
DescribeLoadBalancersAPI 查看实例的标签,如果标签中包含 ACK 相关标签,需先解除管控。 -
确认私网 CLB/NLB 与网关在同一 VPC:私网 CLB/NLB 必须与 MSE 云原生网关在同一 VPC。通过 API 或控制台对比两者的
VpcId,如果不一致,需将 CLB/NLB 迁移到网关所在 VPC。 -
确认地域一致:CLB/NLB 所在地域必须与 MSE 云原生网关实例所在地域一致。跨地域实例不会显示在搜索列表中。