【问题标题】:How do you find the original protocol (or port) of requests where Kubernetes is terminating SSL?如何找到 Kubernetes 终止 SSL 的请求的原始协议(或端口)?
【发布时间】:2020-03-04 01:45:07
【问题描述】:

我希望实现以下重定向并确保它们都在一个步骤中发生:

我在 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 上的请求。但是就像原始地址(主机信息)被转发到我的服务一样,我怎么能找出原来的端口是什么?

【问题讨论】:

    标签: ssl nginx kubernetes nginx-reverse-proxy nginx-ingress


    【解决方案1】:

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

    对于 nginx 你可以使用$http_x_forwarded_proto:

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

    【讨论】:

    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2019-09-14
    • 2014-07-08
    • 2017-04-06
    • 2017-11-09
    • 2014-03-31
    相关资源
    最近更新 更多