AKS多主机Nginx Ingress访问/api路径返回404问题排查
问题根因
从Nginx Ingress打印的日志可确认,/api前缀的请求已经被正确路由到后端gateway服务的4156端口,返回404的核心原因是Ingress未配置路径重写规则:
- Nginx Ingress默认会保留原始请求路径向后端转发,访问
/api/someApiController时,透传给gateway的请求路径仍是/api/someApiController - 绝大多数网关服务的接口路由不会自带
/api前缀(即接口真实路径为/someApiController),收到带/api前缀的路径后匹配不到对应路由,直接返回404 - 根路径访问正常是因为透传给testpartner服务的路径为
/,和该服务内置Nginx的路由规则完全匹配,不存在路径偏差。
修复方法
- 在Ingress的
metadata.annotations段添加路径重写注解,配置转发时剥离/api前缀 - 调整
/api对应的path匹配规则,适配正则捕获逻辑
修改后的完整Ingress核心配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my_ingress_service_name annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/proxy-body-size: 70m # 新增重写规则:将路径中/api后的内容捕获后作为转发目标路径 nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: some.host.com http: paths: # 调整path为正则匹配格式,捕获/api后的路径段 - path: /api(/|$)(.*) pathType: Prefix backend: service: name: gateway port: number: 4156 - path: / pathType: Prefix backend: service: name: testpartner port: number: 8090 - host: someother.host.com http: paths: # 两个域名下的/api规则同步调整 - path: /api(/|$)(.*) pathType: Prefix backend: service: name: gateway port: number: 4156 - path: / pathType: Prefix backend: service: name: testpartner port: number: 8090
生效说明
配置更新后等待Nginx Ingress重载完成,再访问/api前缀的接口时,Ingress会自动把路径中的/api前缀剥离,比如访问/api/someApiController会被重写为/someApiController再转发给gateway服务,即可正常匹配接口路由。
该注解为Ingress全局生效,两个域名下的/api路由会共用这套重写逻辑,无需额外重复配置。
内容的提问来源于stack exchange,提问作者Dillon Willis
相关产品推荐
相关产品推荐

