Envoy配置双Listener双Cluster后浏览器访问报ERR_CONNECTION_CLOSED求助
问题分析与解决方案
你的核心问题是Envoy配置的结构不符合规范——你把clusters节点嵌套在了每个listener的内部,但按照Envoy的静态资源配置规则,clusters应该和listeners平级,都作为static_resources的直接子元素。
当你单独使用每个Listener配置时,可能无意识地把clusters放在了正确的位置,所以能正常工作;但合并两个Listener时,错误的嵌套结构导致Envoy无法正确加载集群配置,Listener找不到对应的后端集群,最终触发ERR_CONNECTION_CLOSED错误。
修正后的完整配置
static_resources: listeners: - name: listener_back_end address: socket_address: { address: 0.0.0.0, port_value: 9090 } filter_chains: - filters: - name: envoy.tcp_proxy config: stat_prefix: ingress_tcp cluster: back_end tls_context: common_tls_context: tls_certificates: - certificate_chain: filename: "/ProxyServerConfig/SSL/certificate.crt" private_key: filename: "/ProxyServerConfig/SSL/private.key" - name: listener_front_end address: socket_address: { address: 0.0.0.0, port_value: 443 } filter_chains: - filters: - name: envoy.tcp_proxy config: stat_prefix: ingress_tcp cluster: front_end tls_context: common_tls_context: tls_certificates: - certificate_chain: filename: "/ProxyServerConfig/SSL/certificate.crt" private_key: filename: "/ProxyServerConfig/SSL/private.key" # 注意:clusters和listeners同级,不属于任何listener clusters: - name: back_end connect_timeout: 0.2s type: STATIC lb_policy: ROUND_ROBIN hosts: [{ socket_address: { address: 192.168.1.4, port_value: 1990 }}] - name: front_end connect_timeout: 0.2s type: STATIC lb_policy: ROUND_ROBIN hosts: [{ socket_address: { address: 192.168.1.5, port_value: 8081 }}]
额外排查建议
- 验证配置合法性:先通过Envoy的配置校验命令确认格式正确:
envoy --mode validate -c your-config-file.yaml - 查看启动日志:用debug级别日志启动Envoy,排查集群加载或Listener初始化的错误:
envoy -c your-config-file.yaml -l debug - 检查后端连通性:在Envoy所在主机上,测试到两个后端集群的网络可达性:
telnet 192.168.1.4 1990 telnet 192.168.1.5 8081 - 端口占用检查:确保9090和443端口没有被其他进程占用:
netstat -tulpn | grep -E "9090|443"
内容的提问来源于stack exchange,提问作者Николай Деменков
相关产品推荐
相关产品推荐

