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

How do you find the original protocol (or port) of requests where Kubernetes is terminating SSL?

我想实现以下重定向,并确保它们一步到位:

我在 Digital Ocean 上有一个 Kubernetes (1.15.5) 集群,使用 stable/nginx-ingress(通过 helm 安装)并使用 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上接收请求。但是就像原始地址(主机信息)被转发到我的服务,我怎样才能知道原来的端口是什么?

ingress controller设置的nginx充当反向代理,插入X-Forwarded-* headers供其背后的服务读取。您的服务必须使用这些来获取正确的客户端 ip、端口或方案。

对于 nginx 你可以使用 $http_x_forwarded_proto:

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