如何找到Kubernetes终止SSL的请求的原始协议(或端口)?

问题描述 投票:0回答:1

我想实现以下重定向,并确保它们全部一步完成:

我在Digital Ocean上有一个Kubernetes(1.15.5)集群,它使用stable/nginx-ingress(通过头盔安装),也使用cert-manager处理SSL。

在我的Ingress配置中,我已禁用ssl重定向,因为我想在服务本身中处理此问题:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: proxy
  namespace: default
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    certmanager.k8s.io/issuer: "letsencrypt-prod"
    certmanager.k8s.io/acme-challenge-type: http01
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  tls:
  - hosts:
    - example.com
    - www.example.com
    secretName: tls-example-com
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80
  - host: www.example.com
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80

我的一项服务是Nginx服务器:

server {
    server_name  example.com;
    return 301 https://wwww.$host$request_uri;
}

server {
    server_name  www.example.com;

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }

    # app
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

但是,这里的$scheme始终是'“ http”',这很有意义,因为我的服务仅在端口80上接收请求。但是就像原始地址(主机信息)被转发到我的服务一样,我如何找到原来的端口是什么?

ssl nginx kubernetes nginx-reverse-proxy nginx-ingress
1个回答
2
投票

由入口控制器设置的nginx充当反向代理,并在其后面的服务中插入X-Forwarded- *标头以供读取。您的服务必须使用这些服务来获取正确的客户端ip,端口或方案。

对于nginx,您可以使用$http_x_forwarded_proto

  if ($http_x_forwarded_proto != "https") {
    return 301 https://$host$request_uri;
  }
© www.soinside.com 2019 - 2024. All rights reserved.