启用force-ssl时nginx-ingress出现过多重定向问题求助
解决Nginx-Ingress开启Force-SSL后的循环重定向问题
我在帮用户排查AWS环境下Nginx-Ingress的重定向问题时,经常碰到你这种情况——AWS负载均衡器(LB)终止SSL后,和Ingress控制器之间的协议识别错位导致循环重定向。咱们一步步来解决:
问题根源
你的AWS LB已经配置了SSL证书(通过aws-load-balancer-ssl-cert注解),负责终止用户的HTTPS请求,然后把流量转发给Nginx-Ingress控制器。但你给Service设置了backend-protocol: tcp,同时Ingress开启了force-ssl重定向,这就出问题了:
- LB把HTTPS转成TCP流量发给控制器,控制器收到的请求看起来是HTTP的
- 控制器看到HTTP请求,就触发force-ssl规则重定向到HTTPS
- 用户浏览器跳转到HTTPS后,LB再次终止SSL转成TCP发给控制器,循环就此形成
解决方案
1. 让Ingress控制器识别原始请求协议
Nginx-Ingress需要知道用户的原始请求是HTTPS的,这得靠LB发送的X-Forwarded-Proto头部。我们要让控制器信任这个头部:
- 如果是用Helm部署的Ingress控制器,修改values.yaml:
controller: config: use-forwarded-headers: "true" forwarded-for-header: "X-Forwarded-For" - 如果是手动部署的,在控制器Deployment的启动参数里加:
--use-forwarded-headers=true
2. 调整Ingress资源的注解
把旧的force-ssl-redirect换成新版的ssl-redirect(更推荐),同时添加信任代理头部的注解,还要限制信任的IP段防止头部伪造:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/use-forwarded-headers: "true" # 替换成你的VPC CIDR或者AWS LB的IP范围 nginx.ingress.kubernetes.io/proxy-real-ip-cidr: "10.0.0.0/8" spec: # 你的Ingress规则配置...
3. 优化AWS LB的Service配置
把backend-protocol从tcp改成http,这样LB会正确添加X-Forwarded-Proto等代理头部,而不是裸TCP转发:
{ "kind": "Service", "apiVersion": "v1", "metadata": { "name": "ingress-nginx", "namespace": "...", "labels": { "k8s-addon": "ingress-nginx.addons.k8s.io" }, "annotations": { "service.beta.kubernetes.io/aws-load-balancer-backend-protocol": "http", "service.beta.kubernetes.io/aws-load-balancer-proxy-protocol": "*", "service.beta.kubernetes.io/aws-load-balancer-ssl-cert": "a..." } }, "spec": { "ports": [ { "name": "http", "port": 80, "targetPort": 80 }, { "name": "https", "port": 443, "targetPort": 80 } ], # 其他Service配置(比如type: LoadBalancer)... } }
做完这些调整后,控制器就能正确识别原始请求是HTTPS的,不会再触发不必要的重定向,循环问题就解决了。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

