在 nginx-config.yaml 中设置 HTTP 到 HTTPS 重定向(在 AWS ELB 中终止 SSL + NGINX Ingress 进行路由)

Posted

技术标签:

【中文标题】在 nginx-config.yaml 中设置 HTTP 到 HTTPS 重定向(在 AWS ELB 中终止 SSL + NGINX Ingress 进行路由)【英文标题】:Setup HTTP to HTTPS redirect in nginx-config.yaml ( Terminating SSL in AWS ELB + NGINX Ingress for routing) 【发布时间】:2020-08-26 17:16:18 【问题描述】:

我想重定向 HTTP 调用 -> HTTPS 但我无法让它工作。我在 *** 和其他一些博客上搜索并尝试了不同的解决方案,但没有使重定向起作用。目前 HTTP 和 HTTPS 都返回值。在下面的代码中注释掉,您可以看到尝试过的解决方案之一:将 HTTP targetPort 更改为 8080 并在 nginx-config.yaml 中设置以侦听 8080 并返回 301 https://$host$request_uri;

Nginx 镜像:nginx/nginx-ingress:1.7.0。使用清单安装 (https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/)

部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress
  namespace: nginx-ingress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-ingress
  template:
    metadata:
      labels:
        app: nginx-ingress
      # annotations:
        #prometheus.io/scrape: "true"
        #prometheus.io/port: "9113"
    spec:
      serviceAccountName: nginx-ingress
      containers:
      - image: nginx/nginx-ingress:1.7.0
        name: nginx-ingress
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
       #- name: prometheus
         #containerPort: 9113
        securityContext:
          allowPrivilegeEscalation: true
          runAsUser: 101 #nginx
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        args:
          - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
          - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret
         #- -v=3 # Enables extensive logging. Useful for troubleshooting.
         #- -report-ingress-status
         #- -external-service=nginx-ingress
         #- -enable-leader-election
         #- -enable-prometheus-metrics
         #- -global-configuration=$(POD_NAMESPACE)/nginx-configuration

服务

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress
  namespace: nginx-ingress
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"
    service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:xxxxxxxxxxxxxxxxx"
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    # targetPort: 8080
    protocol: TCP
    name: http
  - port: 443
    targetPort: 80
    protocol: TCP
    name: https
  selector:
    app: nginx-ingress

配置映射

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-config
  namespace: nginx-ingress
data:
  proxy-protocol: "True"
  real-ip-header: "proxy_protocol"
  set-real-ip-from: "0.0.0.0/0"


# kind: ConfigMap
# apiVersion: v1
# metadata:
#   name: nginx-config
#   namespace: nginx-ingress
# data:
#   proxy-protocol: "True"
#   real-ip-header: "proxy_protocol"
#   set-real-ip-from: "0.0.0.0/0"
#   force-ssl-redirect: "false"
#   use-forwarded-headers: "true"
#   http-snippet: |
#     server 
#       listen 8080 proxy_protocol;
#       server_tokens off;
#       return 301 https://$host$request_uri;
#     

【问题讨论】:

正如@hoque 提到的,您是否创建了任何入口?您可以将其添加到您的答案中吗?看看这个 github 上的 ssl 示例example。 【参考方案1】:

在您的入口添加以下注释,为所有传入 HTTP 流量设置无条件 301 重定向规则,以强制通过 HTTPS 传入流量。

ingress.kubernetes.io/ssl-redirect: "true"

【讨论】:

谢谢,我已经添加了,但 HTTP 和 HTTPS 仍然返回值。我在 nginx-ingress.yaml 中添加了(见下文)。 apiVersion:apps/v1 种类:部署元数据:名称:nginx-ingress 命名空间:nginx-ingress 规范:副本:1 选择器:matchLabels:app:nginx-ingress 模板:元数据:标签:app:nginx-ingress 注释:ingress.kubernetes .io/ssl-redirect: "true" #prometheus.io/scrape: "true" #prometheus.io/port: "9113" 不在部署中,你没有创建任何入口吗? kubectl get ingress的输出是什么 是的,我有一个 Ingress。 kubectl get ingress 的输出是 NAME: basic-routing HOSTS: xxxxxxxxxxx.net, PORTS: 80 AGE: 2d1h 这是我的 ingress 的一部分:apiVersion:networking.k8s.io/v1beta1 kind: Ingress metadata: name: basic-路由规范:规则:-主机:xxxxxxxx.net http:路径:-路径:/后端:serviceName:xxxxxx-fe servicePort:80-主机:xxxxxx-backend.xxxxx.net 好的。这就是现在的样子.. 仍然同时获得 HTTP 和 HTTPS,我将尝试重新启动服务.. apiVersion:networking.k8s.io/v1beta1 种类:入口元数据:名称:基本路由注释:ingress.kubernetes.io /ssl 重定向:“真实”规范:

以上是关于在 nginx-config.yaml 中设置 HTTP 到 HTTPS 重定向(在 AWS ELB 中终止 SSL + NGINX Ingress 进行路由)的主要内容,如果未能解决你的问题,请参考以下文章

如何在xcode项目中设置包含路径

在 OpenGL 中设置 3D 空间的尺寸

如何在 JSF panelGrid 中设置 colspan 和 rowspan?

eclipse中ctrl+H,查找字符串不好用,查不出来东西,是需要在eclipse中设置啥么?

在自动布局中设置约束,以便 UIView 包装可见的子项

在 CodeBlocks 中设置 GLFW 的问题