在 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 进行路由)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JSF panelGrid 中设置 colspan 和 rowspan?