2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

实践示例:从一个域名跳转到另一个域名,ingress-nginx 经历了什么

  • 2020-05-18
  • 本文字数:2329 字

    阅读完需:约 8 分钟

实践示例:从一个域名跳转到另一个域名,ingress-nginx经历了什么

由于 nginx 的优秀性能表现,所以很多企业在 Kubernetes 中选择 Ingress Controller 的时候依然会选择基于 nginx 的 ingress-nginx。但它的配置比较麻烦,一些复杂的需求需要通过 Ingress 的 annotation 来实现,比如在本文中我们需要实现一个 url rewrite 的功能,简单来说就是我们之前的应用在 todo.qikqiak.com 下面,现在我们需要通过 todo.qikqiak.com/app/ 来进行访问。


本次测试使用的集群为 Kubernetes v1.16.2(Rancher 2.3.3 已默认支持),ingess-nginx 镜像版本为 0.26.1


最原始的 Ingress 对象如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /
复制代码


就是一个很常规的 Ingress 对象,部署该对象后,将域名解析后就可以正常访问到应用:



按照需求我们需要对访问的 URL 路径做一个 Rewrite,在 ingress-nginx 官方文档中也给出了说明:


https://kubernetes.github.io/ingress-nginx/examples/rewrite/



按照要求我们需要在 path 中匹配前缀 app,然后通过 rewrite-target 指定目标,修改后的 Ingress 对象如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"    nginx.ingress.kubernetes.io/rewrite-target: /$2spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /app(/|$)(.*)

复制代码


更新后,我们可以遇见到直接访问域名肯定是不行了,因为我们没有匹配 / 的 path 路径:



但是我们带上 app 的前缀再去访问:



我们可以看到已经可以访问到页面内容了,这是因为我们在 path 中通过正则表达式 /app(/|$)(.*) 将匹配的路径设置成了 rewrite-target 的目标路径了,所以我们访问 todo.qikqiak.com/app 的时候实际上相当于访问的就是后端服务的 / 路径,但是我们也可以发现现在页面的样式没有了:



这是因为应用的静态资源路径是在 /stylesheets 路径下面的,现在我们做了 url rewrite 过后,要正常访问也需要带上前缀才可以:http://todo.qikqiak.com/stylesheets/screen.css,对于图片或者其他静态资源也是如此,当然我们去更改页面引入静态资源的方式为相对路径也是可以的,但是毕竟要修改代码,这个时候我们可以借助 ingress-nginx 中的 configuration-snippet 来对静态资源做一次跳转,如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"    nginx.ingress.kubernetes.io/rewrite-target: /$2    nginx.ingress.kubernetes.io/configuration-snippet: |      rewrite ^/stylesheets/(.*)$ /app/stylesheets/$1 redirect;  # 添加 /app 前缀      rewrite ^/images/(.*)$ /app/images/$1 redirect;  # 添加 /app 前缀spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /app(/|$)(.*)
复制代码


更新 Ingress 对象后,这个时候我们刷新页面可以看到已经正常了:



要解决我们访问主域名出现 404 的问题,我们可以给应用设置一个 app-root 的注解,这样当我们访问主域名的时候会自动跳转到我们指定的 app-root 目录下面,如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"    nginx.ingress.kubernetes.io/app-root: /app/    nginx.ingress.kubernetes.io/rewrite-target: /$2    nginx.ingress.kubernetes.io/configuration-snippet: |      rewrite ^/stylesheets/(.*)$ /app/stylesheets/$1 redirect;  # 添加 /app 前缀      rewrite ^/images/(.*)$ /app/images/$1 redirect;  # 添加 /app 前缀spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /app(/|$)(.*)

复制代码


这个时候我们更新应用后访问主域名 http://todo.qikqiak.com 就会自动跳转到 http://todo.qikqiak.com/app/ 路径下面去了。但是还有一个问题是我们的 path 路径其实也匹配了 /app 这样的路径,可能我们更加希望我们的应用在最后添加一个 / 这样的 slash,同样我们可以通过 configuration-snippet 配置来完成,如下 Ingress 对象:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: fe  namespace: default  annotations:    kubernetes.io/ingress.class: "nginx"    nginx.ingress.kubernetes.io/app-root: /app/    nginx.ingress.kubernetes.io/rewrite-target: /$2    nginx.ingress.kubernetes.io/configuration-snippet: |      rewrite ^(/app)$ $1/ redirect;      rewrite ^/stylesheets/(.*)$ /app/stylesheets/$1 redirect;      rewrite ^/images/(.*)$ /app/images/$1 redirect;spec:  rules:  - host: todo.qikqiak.com    http:      paths:      - backend:          serviceName: fe          servicePort: 3000        path: /app(/|$)(.*)
复制代码


更新后我们的应用就都会以 / 这样的 slash 结尾了。这样就完成了我们的需求,如果你原本对 nginx 的配置就非常熟悉的话应该可以很快就能理解这种配置方式了,当然如果你还是喜欢更加简单明了的方式的话可以推荐使用 Traefik 。


2020-05-18 18:074000

评论

发布
暂无评论
发现更多内容

海外云手机怎么解决tiktok运营难题?

Ogcloud

云手机 海外云手机 tiktok云手机 云手机海外版 海外原生IP

运维数字化转型必备宝典,13位行业资深运维专家力荐之作

嘉为蓝鲸

数字化转型 数字化运维 IT 运维

一款功能齐全的iOS混淆工具介绍及功能详解

系统架构基础知识入门指南-上

老张

系统架构 架构设计

企业架构设计的一般过程-以目标为导向

凌晞

企业架构 架构设计

你会拆分产品待办项(PBI)吗?

敏捷开发

项目管理 敏捷开发 软件开发 产品管理 用户故事

嘉为蓝鲸WeOps认证体系全面升级:构建专业本地化服务中心网络

嘉为蓝鲸

weops 嘉为蓝鲸

数字化转型究竟能为企业带来哪些巨变?

AMT企源

数字化转型 AMT企源

揭秘智能写手GPT的测试报告生成技巧

霍格沃兹测试开发学社

从启发式到模型化,京东推荐广告排序机制演化

京东零售技术

算法 广告 搜索推荐 企业号 4 月 PK 榜

革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长

第七在线

比特币减半:挑战与机遇

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

全民国家安全教育日,天翼云“红盾”筑牢数字安全防线

编程猫

智能写手GPT出击!生成测试报告技巧大公开!

测吧(北京)科技有限公司

测试

天谋科技成为信创工委会技术活动单位

Apache IoTDB

企业架构设计的一般过程-始于使命愿景和价值观

凌晞

企业架构 架构设计

Amazon SageMaker: 拓展机器学习边界,塑造未来创新趋势

亚马逊云科技 (Amazon Web Services)

机器学习 re:Invent 亚马逊云科技 生成式人工智能 Amazon SageMaker

爆火 AI 硬件遭差评,Ai Pin 上市即翻车;Grok 推出首个多模态模型丨 RTE 开发者日报 Vol.184

RTE开发者社区

Python机器学习实战教程含代码

技术冰糖葫芦

api 货币化 API 测试 pinduoduo API

深入探索垃圾收集

俞凡

Java 算法

实践示例:从一个域名跳转到另一个域名,ingress-nginx经历了什么_文化 & 方法_Rancher_InfoQ精选文章