Nginx反向代理Istio网关NodePort返回426错误问题排查咨询
问题根因分析
- HTTP 426 Upgrade Required 错误的核心含义是服务器拒绝处理当前HTTP协议版本的请求,要求客户端升级协议版本后重试。
- 第一个直接原因:Nginx 反向代理默认向后端服务发起请求时使用的是HTTP/1.0协议,而Istio网关底层的Envoy代理默认仅支持HTTP/1.1及以上版本的请求,因此直接返回426错误。你之前直接用curl访问Istio网关时,curl默认使用HTTP/1.1协议,符合要求因此能正常得到响应。
- 第二个可能的附加原因:Istio 网关一般会配置Host头匹配规则,你直接curl时携带的Host头为
52.66.195.124:30408,符合Istio的Gateway/VirtualService配置的匹配规则;而Nginx默认反向代理时会将Host头替换为用户访问的域名dashboard.example.com,如果该域名没有在Istio网关的允许Host列表中,也会触发访问异常。
修复方案
修改Nginx的反向代理配置,指定请求协议版本并透传正确的Host头即可,修改后的配置参考如下:
server { server_name dashboard.example.com; # 原有HTTPS证书配置保留即可,此处省略 # ssl_certificate /path/to/ssl/fullchain.pem; # ssl_certificate_key /path/to/ssl/privkey.pem; location / { proxy_pass http://52.66.195.124:30408; # 指定向后端发送请求使用HTTP/1.1版本 proxy_http_version 1.1; # 透传Host头,也可手动设置为Istio网关匹配的Host值 proxy_set_header Host $host:$server_port; # 可选:透传真实客户端相关信息 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
修改完成后执行nginx -s reload重载配置即可正常访问。
内容的提问来源于stack exchange,提问作者Rahul Radhakrishnan
相关产品推荐
相关产品推荐

