当前位置: 首页 > article >正文

一个Ingress搞定前后端分离:实战配置将API请求转发后端,静态页面留给前端

一个Ingress搞定前后端分离实战配置将API请求转发后端静态页面留给前端在前后端分离架构成为主流的今天如何优雅地部署应用成了开发者必须面对的挑战。想象一下用户访问你的网站时浏览器应该加载React或Vue构建的静态资源而当页面需要数据时又需要无缝对接后端API服务。传统做法可能需要配置多个域名或复杂的代理规则但在Kubernetes生态中Ingress-Nginx提供了一种更简洁的解决方案。本文将深入探讨如何通过单个Ingress资源实现前后端流量的智能路由。无论你是正在搭建全新项目还是优化现有部署这套方案都能显著简化你的基础设施配置。我们会从基础概念讲起逐步深入到正则表达式路由、路径重写等高级技巧最后还会分享几个真实场景中的性能调优经验。1. 理解前后端分离的流量路由需求现代Web应用通常由两部分组成静态前端和动态API后端。前端可能是一个React单页应用(SPA)打包后生成HTML、CSS和JavaScript文件后端则是处理业务逻辑的API服务可能用Spring Boot、Django或Node.js实现。这种架构下流量路由需要满足两个核心需求静态资源服务当用户访问根路径(如/)或直接输入URL时应该返回前端应用的入口文件(index.html)API请求代理所有以/api开头的请求应该被转发到后端服务同时最好去掉/api前缀# 理想的路由效果示例 / → 前端静态服务 /about → 前端静态服务 (SPA路由) /api/users → 后端服务 (实际接收到 /users)这种配置带来的好处显而易见只需要维护一个域名和SSL证书前端代码中可以统一使用相对路径调用API简化了本地开发和生产环境的一致性2. 基础Ingress配置区分前后端路径让我们从最基础的配置开始。假设我们有两个Kubernetes服务frontend-service: 端口80提供静态文件backend-service: 端口8080提供APIapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: unified-ingress annotations: nginx.ingress.kubernetes.io/use-regex: true spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: frontend-service port: number: 80 - path: /api pathType: Prefix backend: service: name: backend-service port: number: 8080这个配置虽然简单但存在两个明显问题API请求会保留/api前缀传递给后端前端路由(如/about)会返回404因为Nginx会尝试查找对应的静态文件3. 高级路由配置重写路径与SPA支持要解决上述问题我们需要引入两个关键注解rewrite-target重写请求路径configuration-snippet添加Nginx特定配置3.1 去除API前缀的配置apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: advanced-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: true spec: rules: - host: example.com http: paths: - path: /api(/|$)(.*) pathType: ImplementationSpecific backend: service: name: backend-service port: number: 8080 - path: /(.*) pathType: Prefix backend: service: name: frontend-service port: number: 80关键点解析use-regex: true启用正则表达式路径匹配rewrite-target: /$2将捕获组的第二部分作为新路径/api(/|$)(.*)会匹配/api/xxx或/api并将xxx部分作为$23.2 支持前端路由的补充配置对于React Router或Vue Router的history模式还需要添加以下注解annotations: nginx.ingress.kubernetes.io/configuration-snippet: | if ($uri !~ ^/api) { rewrite ^(.*)$ /index.html break; }这个配置确保所有非API请求都返回index.html让前端路由可以接管URL解析。4. 性能优化与特殊场景处理基础功能实现后我们还需要考虑性能和特殊场景。以下是几个实战中总结的经验4.1 文件上传大小限制默认情况下Ingress-Nginx限制上传文件大小为1MB。对于需要处理大文件的应用annotations: nginx.ingress.kubernetes.io/proxy-body-size: 100m4.2 WebSocket连接配置实时应用可能需要WebSocket支持annotations: nginx.ingress.kubernetes.io/proxy-read-timeout: 3600 nginx.ingress.kubernetes.io/proxy-send-timeout: 3600 nginx.ingress.kubernetes.io/proxy-http-version: 1.1 nginx.ingress.kubernetes.io/proxy-set-header: | Upgrade $http_upgrade Connection upgrade4.3 超时设置调优不同端点可能需要不同的超时设置annotations: nginx.ingress.kubernetes.io/configuration-snippet: | location ~ ^/api/long-task { proxy_read_timeout 600s; }5. 完整配置示例与测试方法下面是一个整合所有优化点的完整配置示例apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: production-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: true nginx.ingress.kubernetes.io/proxy-body-size: 100m nginx.ingress.kubernetes.io/configuration-snippet: | if ($uri !~ ^/api) { rewrite ^(.*)$ /index.html break; } location ~ ^/api/stream { proxy_buffering off; proxy_read_timeout 3600s; } spec: rules: - host: myapp.example.com http: paths: - path: /api(/|$)(.*) pathType: ImplementationSpecific backend: service: name: backend-service port: number: 8080 - path: /(.*) pathType: Prefix backend: service: name: frontend-service port: number: 80测试你的配置是否生效# 测试前端路由 curl -I https://myapp.example.com/about # 测试API路由 (应该返回后端响应) curl https://myapp.example.com/api/users # 测试API前缀是否被正确移除 (后端应该收到 /users) # 需要在后端日志中验证6. 常见问题排查指南即使配置看起来完美实际部署时仍可能遇到各种问题。以下是几个常见问题及解决方法问题1API请求返回404检查Ingress控制器的日志kubectl logs -n ingress-nginx controller-pod验证Service选择器是否正确匹配后端Pod标签问题2前端路由刷新后404确保configuration-snippet中的重写规则正确检查前端构建配置通常需要设置publicPath为/问题3WebSocket连接立即断开确认所有必要的proxy_set_header注解已添加检查后端是否支持WebSocket协议问题4上传大文件失败除了proxy-body-size还要检查后端服务的上传限制对于Spring Boot应用需要设置spring.servlet.multipart.max-file-size7. 进阶技巧多环境差异化配置在实际开发中我们通常需要为不同环境(开发、测试、生产)配置不同的参数。可以通过Kustomize或Helm实现配置差异化7.1 使用Kustomize覆盖注解# base/ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress annotations: nginx.ingress.kubernetes.io/proxy-body-size: 1m # overlays/production/ingress-patch.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress annotations: nginx.ingress.kubernetes.io/proxy-body-size: 100m7.2 Helm模板中的条件配置annotations: nginx.ingress.kubernetes.io/proxy-body-size: {{ .Values.ingress.proxyBodySize }} {{- if .Values.production }} nginx.ingress.kubernetes.io/configuration-snippet: | # 生产环境特定配置 {{- end }}在最近的一个电商项目迁移中我们采用了这套配置方案。原本需要三个独立的Ingress资源(前端、API、管理后台)现在合并为一个不仅简化了配置管理还减少了约30%的SSL握手开销。特别是在移动端网络环境下统一域名的优势更加明显页面加载时间平均缩短了400ms。

相关文章:

一个Ingress搞定前后端分离:实战配置将API请求转发后端,静态页面留给前端

一个Ingress搞定前后端分离:实战配置将API请求转发后端,静态页面留给前端 在前后端分离架构成为主流的今天,如何优雅地部署应用成了开发者必须面对的挑战。想象一下:用户访问你的网站时,浏览器应该加载React或Vue构建的…...

实战指南:从零构建高可用 Kubernetes 多节点集群(生产环境最佳实践)

1. 环境准备:生产级集群的硬件与系统配置 搭建生产级Kubernetes集群的第一步是做好硬件选型和系统配置。很多新手容易忽视这个环节,结果在后期遇到性能瓶颈时才后悔莫及。根据我在金融和电商行业的部署经验,控制平面和工作节点的配置需要严格…...

Go语言的未来发展:趋势与展望

Go语言的未来发展:趋势与展望 1. 引言 Go语言自2009年发布以来,已经成为现代软件开发中最受欢迎的编程语言之一。它以其简洁、高效、并发友好的特性,在云原生、微服务、DevOps等领域获得了广泛的应用。本文将回顾Go语言的发展历程&#xff…...

Nginx 学习总结犊

1. 引入 在现代 AI 工程中,Hugging Face 的 tokenizers 库已成为分词器的事实标准。不过 Hugging Face 的 tokenizers 是用 Rust 来实现的,官方只提供了 python 和 node 的绑定实现。要实现与 Hugging Face tokenizers 相同的行为,最好的办法…...

保姆级教程:用OpenCV SGBM算法从双目图像生成彩色点云(附完整Python代码与参数调试心得)

从双目图像到彩色点云:OpenCV SGBM算法实战与参数调优全解析 双目视觉技术正在工业检测、自动驾驶、三维重建等领域获得广泛应用。本文将手把手带您实现从双目图像采集到彩色点云生成的全流程,重点剖析SGBM算法核心参数的调优技巧,并分享视差…...

Windows 11/10下Genymotion与VirtualBox的‘网络适配器战争’:彻底解决启动报错与VirtualBox Host-Only Network #N泛滥问题

Windows 11/10下Genymotion与VirtualBox的网络适配器冲突全解析 每次启动Genymotion虚拟机时,你是否注意到系统里又悄悄多出一个带编号的VirtualBox Host-Only Network适配器?这背后隐藏着Windows网络管理机制与虚拟化软件之间一场看不见的"军备竞…...

猫抓插件:智能资源嗅探引擎与无缝媒体管理体验

猫抓插件:智能资源嗅探引擎与无缝媒体管理体验 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化内容爆炸的时代,用户…...

深入解析ActivityMainBinding:从基础绑定到高级应用

1. ActivityMainBinding基础入门 第一次接触ActivityMainBinding时&#xff0c;我完全被它自动生成的特性震惊了。这个看似简单的类&#xff0c;实际上是Android DataBinding技术的核心枢纽。简单来说&#xff0c;每当你在res/layout目录下创建带有<layout>标签的XML文件…...

快速上手Jimeng LoRA:Streamlit可视化界面,无需代码基础

快速上手Jimeng LoRA&#xff1a;Streamlit可视化界面&#xff0c;无需代码基础 你是否对AI绘画感兴趣&#xff0c;想尝试不同的艺术风格&#xff0c;却被复杂的命令行和代码部署劝退&#xff1f;你是否下载了多个不同训练阶段的LoRA模型&#xff0c;却苦于每次测试都要重新加…...

微信小程序反编译实战:用wxappUnpacker获取他人源码的完整流程(附常见报错解决方案)

微信小程序逆向工程全流程解析&#xff1a;从缓存提取到源码重构 最近两年微信小程序生态爆发式增长&#xff0c;各类创新应用层出不穷。作为开发者&#xff0c;我们常常会遇到一些令人惊艳的交互效果或功能实现&#xff0c;却苦于无法了解其背后的技术细节。本文将带你深入微信…...

Linux桌面应用管理革命:AppImageLauncher完整使用指南

Linux桌面应用管理革命&#xff1a;AppImageLauncher完整使用指南 【免费下载链接】AppImageLauncher Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages 项目地址: https://gitcode.com/gh_…...

UE5.4渲染设置详解:从‘眼部适应’到‘后处理Volume’,一步步驯服自动曝光

UE5.4曝光控制全链路解析&#xff1a;从视觉原理到多层级精准调控 当你在昏暗的UE5场景中点燃一盏虚拟烛光时&#xff0c;引擎如何决定该让画面保持幽暗氛围还是强行提亮所有细节&#xff1f;这背后是一场由眼部适应算法主导的"亮度战争"。不同于简单开关的二元选择&…...

第02章-操作系统的发展与挑战

第2章 操作系统的发展与挑战 本章目标:从更宏观的视角审视操作系统的发展脉络,深入探讨移动操作系统和嵌入式操作系统的演进,分析现代操作系统面临的核心挑战与新兴技术趋势。 2.1 移动操作系统的演进 第1章我们回顾了操作系统的整体发展历程,本章聚焦于与开源鸿蒙关系最密…...

用AI写代码踩坑记:让DeepSeek帮我搞定CH32V003驱动WS2812B的PWM+DMA程序

从AI生成到实战调试&#xff1a;CH32V003驱动WS2812B的PWMDMA完整指南 第一次让DeepSeek帮我写CH32V003驱动WS2812B的代码时&#xff0c;我天真地以为只要把芯片手册扔给它就能坐享其成。直到看到它生成的PWM配置把TIM1_CH4映射到了PA8&#xff08;实际应该是PC4&#xff09;&a…...

论文阅读:arxiv 2026 Don‘t Let the Claw Grip Your Hand: A Security Analysis and Defense Framework for Ope

总目录 大模型安全研究论文整理 2026年版&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/159047894 Don’t Let the Claw Grip Your Hand: A Security Analysis and Defense Framework for OpenClaw https://arxiv.org/pdf/2603.10387 arxiv 2026 | OpenClaw安…...

Java 25虚拟线程压测突崩实录:QPS从12万骤降至200,我们用1小时定位并修复的4层嵌套阻塞根源

第一章&#xff1a;Java 25虚拟线程压测突崩事件全景复盘某金融核心支付网关在升级至 JDK 25 并全面启用虚拟线程&#xff08;Virtual Threads&#xff09;后&#xff0c;于全链路压测中突发大规模 StackOverflowError 与 OutOfMemoryError: Metaspace 混合崩溃&#xff0c;TPS…...

为什么92%的.NET团队在AI推理上卡在.NET 6/7?揭秘.NET 11新增AOT+TensorRT绑定+动态图编译三大硬核能力(附架构图对比表)

第一章&#xff1a;.NET 11 AI模型推理加速架构全景概览 .NET 11 将原生 AI 推理能力深度集成至运行时与 SDK 层&#xff0c;构建起端到端的高性能、跨平台模型执行栈。该架构摒弃传统“模型导出外部引擎调用”的松耦合模式&#xff0c;转而采用统一张量抽象&#xff08; Tenso…...

创业合伙人人力股分配的五大核心要素与实操指南

1. 行业属性决定人力股占比 创业团队在分配人力股时&#xff0c;首先要考虑的就是行业特性。不同行业对人力的依赖程度天差地别&#xff0c;这直接决定了人力股在总股权中的占比区间。 以软件开发公司为例&#xff0c;这类企业最核心的资产就是程序员的技术能力。我曾参与过一…...

蓝牙协议栈实战:从HCI命令到GATT服务,一个物联网设备的数据传输完整流程解析

蓝牙协议栈实战&#xff1a;从HCI命令到GATT服务的数据传输全链路剖析 当智能手环的心率数据通过手机App实时显示时&#xff0c;背后是蓝牙协议栈各层协同工作的精密舞蹈。本文将用真实开发场景中的抓包分析和代码示例&#xff0c;揭示一个物联网设备从物理层连接建立到应用层数…...

CppJieba中文分词架构深度解析与实战指南

CppJieba中文分词架构深度解析与实战指南 【免费下载链接】cppjieba "结巴"中文分词的C版本 项目地址: https://gitcode.com/gh_mirrors/cp/cppjieba CppJieba作为"结巴"中文分词的C高性能实现&#xff0c;为C开发者提供了工业级的中文分词解决方案…...

从博弈论到你的模型:用‘公平分配’思想SHAP,拆解一次房贷审批预测

从博弈论到房贷审批&#xff1a;用SHAP算法拆解模型决策黑箱 想象一下&#xff0c;你作为银行风控部门的算法工程师&#xff0c;刚刚部署了一套全新的房贷审批模型。某天&#xff0c;业务主管拿着一个被模型拒绝的案例来找你&#xff1a;"这位申请人信用分680&#xff0c;…...

Web开发方向之人工智能核心技术线

① Python 基础与科学计算库Python 基础语法是开启人工智能学习的必备。深入学习 Python 的科学计算库是必不可少的一步。NumPy&#xff1a;是科学计算的基石&#xff0c;提供了高效的多维数组对象以及丰富的数学函数。通过 NumPy&#xff0c;我们能够快速进行矩阵运算、向量操…...

WPF新手村教程(七)—— 终章(MVVM架构初见杀)疤

1. 哑铃图是什么&#xff1f; 哑铃图&#xff08;Dumbbell Plot&#xff09;&#xff0c;有时也称为DNA图或杠铃图&#xff0c;是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中&#xff0c;我们通常使用两条折…...

打破B站字幕提取壁垒:BiliBiliCCSubtitle如何重构视频文字信息获取范式

打破B站字幕提取壁垒&#xff1a;BiliBiliCCSubtitle如何重构视频文字信息获取范式 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 在信息爆炸的视频时代&#xf…...

避坑指南:解决Gazebo模型贴图不显示的5个常见问题(以aruco.png为例)

Gazebo模型贴图实战&#xff1a;从ArUco标记到高级材质应用的深度解析 第一次在Gazebo中看到ArUco标记完美呈现在机器人末端时&#xff0c;那种成就感至今难忘——但在此之前&#xff0c;我经历了整整两天的路径错误、材质丢失和纹理错乱。本文将分享那些官方文档没告诉你的实战…...

Adobe-GenP 3.0逆向工程工具深度解析:技术架构与二进制修补实现方案

Adobe-GenP 3.0逆向工程工具深度解析&#xff1a;技术架构与二进制修补实现方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款基于AutoIt脚本…...

从办公室到车间:给IT网管的Profinet入门避坑指南(含VLAN与安全配置)

从办公室到车间&#xff1a;IT工程师的Profinet工业网络融合实战手册 当IT工程师第一次踏入嘈杂的工厂车间&#xff0c;面对那些闪烁着信号灯的PLC和伺服驱动器时&#xff0c;往往会感到一丝无所适从。这就像一位习惯在城市道路驾驶的司机&#xff0c;突然被要求操作一架喷气式…...

2026年重庆豆包排名GEO优化公司推荐与选型避坑指南(附5大服务商真实测评)

第一部分&#xff1a;引言与需求明确作为西部制造业核心、国际消费中心城市&#xff0c;重庆目前已形成汽车、电子信息、装备制造、先进材料、食品加工五大千亿级支柱产业&#xff0c;同时家装、文旅、大宗消费等赛道市场竞争逐年白热化。据2026年重庆本地数字营销行业调研数据…...

为什么92%的团队在2026 Q1前必须升级AOT?:Python原生编译配置失败率下降83%的7个关键参数调优

第一章&#xff1a;Python 原生 AOT 编译方案 2026 配置步骤详解Python 原生 AOT&#xff08;Ahead-of-Time&#xff09;编译方案 2026 是 CPython 官方实验性分支&#xff0c;旨在为标准 Python 代码生成独立、免解释器的原生可执行文件&#xff0c;无需运行时依赖 libpython.…...

【FastAPI 2.0流式AI生产部署终极指南】:5大避坑清单+3倍吞吐压测实录,92%团队忽略的异步上下文泄漏隐患

第一章&#xff1a;FastAPI 2.0流式AI生产部署全景认知FastAPI 2.0标志着异步AI服务部署范式的重大演进&#xff0c;其原生增强的流式响应能力&#xff08;StreamingResponse&#xff09;、零成本中间件生命周期管理、以及与 ASGI 3.0 深度对齐的事件驱动模型&#xff0c;为大语…...