如何解决Envoy正向代理示例配置的404路由报错问题?
解决Envoy正向代理404错误的方案
1. 先修正curl命令的写法
你用的curl --proxy 0.0.0.0:10000 https://www.example.org:443里,https://www.example.org:443的写法会让Envoy在解析请求目标时出现异常——因为443是HTTPS的默认端口,curl通过代理发送HTTPS请求时,不需要显式在URL里加这个端口。正确的命令应该是:
curl -x 0.0.0.0:10000 https://www.example.org
如果确实需要指定非标准端口,再保留端口号,但默认端口情况下去掉即可避免路径匹配问题。
2. 检查Envoy配置的几个关键环节
路由规则是否匹配所有请求
确保你的路由配置里,匹配规则覆盖所有路径,并且关联到动态正向代理的集群。比如官方示例里的路由应该是:
routes: - match: prefix: "/" route: cluster: dynamic_forward_proxy_cluster timeout: 0s upgrade_configs: - upgrade_type: websocket
这里的prefix: "/"必须存在,不能改成更窄的路径匹配,否则会导致部分请求无法匹配路由。
动态集群配置是否正确
确认集群配置启用了动态DNS解析,核心部分如下:
clusters: - name: dynamic_forward_proxy_cluster connect_timeout: 0.25s lb_policy: CLUSTER_PROVIDED cluster_type: name: envoy.clusters.dynamic_forward_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.clusters.dynamic_forward_proxy.v3.ClusterConfig dns_cache_config: name: dynamic_forward_proxy_cache_config dns_lookup_family: V4_ONLY
如果这里的cluster_type配置错误,Envoy无法动态创建目标集群,就会出现路由匹配失败的404。
HTTP过滤器顺序是否正确
dynamic_forward_proxy过滤器必须放在router过滤器之前,因为它需要先处理请求的目标主机,再由router转发。正确的过滤器链应该是:
http_filters: - name: envoy.filters.http.dynamic_forward_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.dynamic_forward_proxy.v3.FilterConfig dns_cache_config: name: dynamic_forward_proxy_cache_config dns_lookup_family: V4_ONLY - name: envoy.filters.http.router typed_config: {}
如果顺序反了,router会先尝试匹配静态路由,找不到就返回404。
3. 调试排查(如果以上步骤无效)
开启Envoy的debug日志(在配置中设置log_level: debug),查看请求处理过程的日志,重点关注:
- 请求的目标主机是否被正确解析
- 路由匹配的过程是否找到对应的动态集群
- DNS缓存是否成功解析了目标域名
通过日志可以定位到具体是路由匹配失败,还是DNS解析的问题。
内容的提问来源于stack exchange,提问作者Edgar
相关产品推荐
相关产品推荐

