Swashbuckle生成API文档协议错误(HTTP替代HTTPS)排查求助
我们的Web API部署在Azure Kubernetes集群中,使用Nginx作为Ingress控制器、Let's Encrypt实现HTTPS。测试命名空间(staging)一切正常:Swagger UI可通过HTTPS访问,服务器也显示HTTPS协议;但生产命名空间(prod)中,Swagger UI虽能通过HTTPS访问,但服务器仅显示HTTP协议,且调用任何API接口均失败。
已知信息:
- Nginx与服务之间的通信仅为HTTP
- 测试与生产环境使用的Docker镜像一致
- 测试与生产环境的Ingress仅服务名称和主机名不同
请问Nginx向API服务传递协议信息时可能出现什么问题?
1. Ingress配置缺失X-Forwarded-Proto头传递
Nginx Ingress不会默认自动将外部请求的真实协议(HTTPS)通过X-Forwarded-Proto头传递给后端服务。测试环境正常可能是因为其Ingress隐含了该配置,而生产环境遗漏了相关注解。
需要在生产环境Ingress资源中添加以下注解,确保协议头正确传递:
nginx.ingress.kubernetes.io/use-forwarded-headers: "true" nginx.ingress.kubernetes.io/x-forwarded-proto: "https" nginx.ingress.kubernetes.io/ssl-redirect: "true"
同时要确认API服务已配置为读取X-Forwarded-Proto头,以此生成正确的HTTPS协议链接(比如Swagger中的接口地址)。
2. 生产环境Ingress的TLS配置异常
虽然Let's Encrypt签发了证书,但生产环境Ingress的TLS配置可能存在错误,导致Nginx无法正确识别外部HTTPS请求,进而未传递正确的协议头。检查生产环境Ingress的TLS段:
tls: - hosts: - 你的生产域名.com secretName: 你的生产TLS密钥名称
确认secretName对应的Secret存在且包含有效证书,同时主机名与证书域名完全匹配。
3. API服务的转发头信任配置不一致
即便Nginx传递了X-Forwarded-Proto头,若API服务未信任来自Nginx的该头,仍会判定请求为HTTP。比如在ASP.NET Core中,需配置ForwardedHeadersOptions信任Nginx的集群内部IP段:
services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; options.KnownProxies.Add(IPAddress.Parse("Nginx集群内部IP")); });
测试环境正常但生产环境异常,可能是生产环境Nginx的集群IP不同,或者服务的信任配置被意外修改。
4. Nginx Ingress控制器的全局配置差异
检查测试与生产环境的Nginx Ingress控制器ConfigMap,确认生产环境控制器未全局禁用转发头。若全局配置use-forwarded-headers为false,Ingress资源的注解将不生效。可通过以下命令查看控制器配置:
kubectl get configmap nginx-ingress-controller -n kube-system -o yaml
内容的提问来源于stack exchange,提问作者user3529537

