Nginx调用image-api原生URL返回426状态码,Istio URL正常求助
问题分析与解决
问题概述
image-api服务在Pod内部可正常访问,直接执行curl image-api.gateways.svc.cluster.local:8000能获取预期数据- Nginx调用
image-api.main.svc.cluster.local:8000时返回426状态码,替换为Istio的image-api.gateways.svc.cluster.local:8000则返回200 - 当前使用的Nginx配置如下:
worker_processes 8; events { worker_connections 1024; } http { resolver kube-dns.kube-system valid=10s; server_tokens off; server { listen 8080; location ~ ^/(\w+) { # ISTIO URL proxy_pass http://image-api.gateways.svc.cluster.local:8000$request_uri; # MAIN URL # proxy_pass http://image-api.main.svc.cluster.local:8000$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
426状态码说明
426 Upgrade Required表示服务器拒绝处理当前请求,除非客户端升级到指定协议。这意味着image-api.main.svc.cluster.local的服务实例对请求协议或请求头有特定要求,而Istio网关自动处理了这些要求,Nginx默认配置未满足。
修复方案
1. 强制启用HTTP/2协议转发
如果image-api.main后端仅支持HTTP/2,Nginx默认用HTTP/1.1转发会触发错误。修改Nginx配置:
location ~ ^/(\w+) { proxy_pass http://image-api.main.svc.cluster.local:8000$request_uri; proxy_http_version 2.0; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
2. 处理协议升级请求
若服务要求客户端发起协议升级(比如WebSocket或HTTP/1.1到HTTP/2的升级),添加对应请求头:
location ~ ^/(\w+) { proxy_pass http://image-api.main.svc.cluster.local:8000$request_uri; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
3. 对比请求头差异
在image-api的Pod中开启请求日志,分别记录Istio网关和Nginx转发的请求头,找出缺失的字段后在Nginx中补充proxy_set_header配置。
4. 验证服务协议要求
在Pod内执行curl -v image-api.main.svc.cluster.local:8000,查看响应头中的Upgrade字段,确认服务需要的目标协议,再针对性调整Nginx配置。
内容的提问来源于stack exchange,提问作者Arman
相关产品推荐
相关产品推荐

