谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)

news2025/2/24 12:42:05

文章目录

  • 一,通过域名访问商城架构设计
    • 1,为什么nginx要将请求转发给网关
    • 2,架构设计
  • 二,配置
    • 1,nginx配置
      • 1.1 nginx.conf
      • 1.2 gulimall.conf
      • 1.3 配置原理
    • 2,网关配置
  • 三,记录2个问题
    • 1,网关路由匹配实现
    • 2,网关路由配置前后顺序导致的问题
    • 3,nginx.conf upstream配置缺少端口

一,通过域名访问商城架构设计

1,为什么nginx要将请求转发给网关

上一节实现通过Nignx将域名gulimall.com的请求直接转发给产品服务,这样的设计有比较大的缺陷:

  • 管理复杂性:如果需要更改服务的路由规则或负载均衡策略,可能需要在多个地方更新配置。
  • 安全性风险:直接暴露服务的IP地址可能会增加安全风险。

更好的方式是nginx将请求转发给网关,由网关实现路由转发和负载均衡。转发给网关的优势如下:

  • 统一入口:Nginx作为反向代理服务器,提供了一个统一的入口点,所有外部请求首先到达Nginx。
  • 安全性:隐藏了后端服务的真实IP地址,增加了系统的安全性。
  • 灵活性:可以在Nginx层面进行请求的路由、负载均衡、SSL终端等操作。
  • 可扩展性:易于添加新的服务或修改现有服务的路由规则,而不需要更改客户端的访问方式。

2,架构设计

在这里插入图片描述
根据图片,当我们在浏览器输入gulimall.com,nginx将这个请求转发给网关,原理如下:

  1. 本地DNS解析(hosts文件)

    • 在Windows系统的hosts文件中配置域名与虚拟机IP的映射关系。例如,gulimall.comsearch.gulimall.comitem.gulimall.commember.gulimall.com都被指向同一个虚拟机IP地址。这样,当在浏览器中输入这些域名时,系统会将它们解析到指定的虚拟机IP。
  2. Nginx作为网关

    • Nginx被配置为一个网关,用于接收来自上述域名的所有请求。
  3. server块配置

    • 在Nginx配置中,定义了一个server块来监听域名gulimall.com的80端口。这意味着所有HTTP请求都会首先到达这个server块。
  4. 反向代理配置(location块)

    • 在server块中,定义了一个location块,用于匹配根路径/的请求。使用proxy_pass指令将请求转发到内部网络的特定服务上,这里是转发到http://192.168.56.1:10000,即商品服务所在的地址。
  5. 请求处理

    • 当用户访问gulimall.com时,请求首先被发送到配置在hosts文件中的虚拟机IP。
    • 虚拟机上的Nginx监听80端口,接收到请求后,根据配置的location块,将请求转发到内部的商品服务。

二,配置

1,nginx配置

nginx修改两处配置:

  • 在nginx全局配置文件nginx.conf中配置服务器地址
  • 在server块配置文件gulimall.conf中配置负载均衡配置

1.1 nginx.conf

在这里插入图片描述

在nginx.conf中做如下配置。

	upstream gulimall{
        server 192.168.56.1:88;
    }   

在这里插入图片描述

1.2 gulimall.conf

在这里插入图片描述
在conf.d目录下的gulimall.conf做如下配置。

	location / {
    	proxy_pass http://gulimall;
    }

在这里插入图片描述
注意,配置完成要重启docker容器。

1.3 配置原理

  1. location / { … }

    • 这个location块定义了对于根路径/的请求的处理方式。location块可以包含在server块内,用于匹配特定的URI或路径。
    • location /表示匹配所有以根路径开始的请求。
  2. proxy_pass http://gulimall;

    • proxy_pass指令用于设置请求的代理转发目标。这里它指定了请求应该被转发到名为gulimall的上游服务器组(upstream)。注意,这里的http://是可选的,因为proxy_pass默认就是HTTP代理。
  3. upstream gulimall { … }

    • upstream块定义了一个服务器组的名称和一组后端服务器的地址。在这个例子中,gulimall是服务器组的名称。
    • upstream gulimall块内,使用server指令来指定后端服务器的地址和端口。这里的server 192.168.56.1;表示将请求代理到IP地址为192.168.56.1的服务器。默认情况下,如果没有指定端口,则使用80端口。

这两段配置是如何起作用的:

  • 当一个请求到达Nginx,并且请求的URI是根路径/时,Nginx会根据配置的location /块来处理这个请求。
  • location /块中,proxy_pass指令告诉Nginx将请求转发到名为gulimall的上游服务器组。
  • Nginx查找upstream gulimall块,找到后端服务器的列表。在这个例子中,只有一个服务器,即IP地址为192.168.56.1的服务器。
  • Nginx将请求转发到这个后端服务器,由它来处理请求并返回响应。

这种配置方式允许Nginx作为一个反向代理服务器,将请求分发到不同的后端服务。使用upstream可以方便地进行负载均衡和故障转移等操作,而proxy_pass则定义了具体的请求转发行为。

2,网关配置

在网关服务的配置文件中,增加如下配置。

        - id: gulimall-index-route
          uri: lb://gulimall-product
          predicates:
            - Host=**.gulimall.com

这段配置的作用是:

  • 当API网关接收到一个HTTP请求时,它会检查请求的Host头部。
  • 如果Host头部匹配**.gulimall.com的模式(即任何子域名的gulimall.com),则这个请求将被路由到名为gulimall-product的服务。
  • 请求将通过负载均衡器发送到后端服务实例,以实现请求分发和故障转移。

配置完成重启网关。

三,记录2个问题

1,网关路由匹配实现

在网关中配置工具域名来进行路由转发,测试发现并未生效,原因是nginx转发请求会丢失域名信息,需要在nginx的server块配置文件gulimall.conf中配置中重设请求头域名信息,配置如下。

在这里插入图片描述

 	location / {
        proxy_set_header Host $host;
        proxy_pass http://gulimall;
    }

2,网关路由配置前后顺序导致的问题

如果将下列配置放在路由配置的最前面,将会出现一些问题。

在这里插入图片描述

路由规则gulimall-index-route使用Host谓词匹配所有以.gulimall.com结尾的请求。

如果这个规则gulimall-index-route放在最前面,可能出现的问题包括:

  1. 匹配优先级问题

    • 路由规则是从上到下匹配的,一旦匹配成功,就不会再考虑下面的规则。如果gulimall-index-route放在最前面,所有.gulimall.com的请求都会被这个规则捕获,即使这些请求的路径可能更适合下面的某个Path谓词规则。
  2. 路径路由失效

    • 由于gulimall-index-route会捕获所有.gulimall.com的请求,其他基于特定API路径(如/api/search/**/api/coupon/**等)的路由规则将不会生效,因为请求在到达这些规则之前已经被gulimall-index-route匹配并路由了。
  3. 服务发现问题

    • 如果gulimall-product服务不能处理所有可能的API请求(例如,它不包含搜索、优惠券、库存等API的实现),那么将所有请求都路由到这个服务将导致错误或不期望的响应。

3,nginx.conf upstream配置缺少端口

重启nginx和网关后,仍然不能正常访问页面,查看nginx日志,发现转发到80端口,而网关是在88端口,说明配置nginx.confupstream配置缺少端口。
在这里插入图片描述

如下图修改之后,即能正常访问。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt的项目结构

目录 创建新的项目 第一个hell0程序,qt的项目结构 main函数 Widget头文件: pro文件 命名规范 QtCreator 常用快捷键 Qt里边绝大部分的类都是继承自QObject是一个顶层类 父子关系 Qt坐标系 QT常用API函数 对象树 信号和槽机制 自定义信号和槽 自定义信号…

PHP企业培训考试系统小程序源码

🚀企业培训考试系统,赋能员工成长新引擎📚 🌱 开篇:解锁企业培训新篇章 在快速变化的商业环境中,员工的能力提升是企业持续发展的关键。🚀 传统的培训方式已难以满足现代企业的需求&#xff0…

CentOS7.9误删了yum,怎么办?

起因是这样的,有人不小心将CentOS7.9的yum插件给删除了,导致了yum命令不能用了。 据他说是执行了这句命令之后,导致的问题。 pm -qa |grep yum | xargs rpm -e --nodeps解决办法 本方法只针对:CentOS Linux release 7.9.2009 (Core)版本生效,其他版本可以参考: https://vau…

Studying-代码随想录训练营day62| Floyd 算法精讲、A*算法精讲(A star算法)、最短路算法总结篇、图论总结

第62天,完结撒花*★,*:.☆( ̄▽ ̄)/$:*.★* ,最后的两个算法学习,编程语言C 目录 Floyd 算法精讲 A*算法精讲(A star算法) A*算法 复杂度分析 A*算法的缺点 最短路算法总结篇 图论总结…

log4j2: CVE-2021-44228[RCE]

漏洞概述 CVE-2021-44228为Apache Log4j2漏洞,被称为"Log4Shell"。攻击者将恶意代码与服务器进行交互,使服务器日志组件将其记录并执行,从而造就RCE远程代码执行漏洞。 漏洞原理 日志记录机制:Log4j2是一个日志记录工…

【ML】自监督学习 self-supervised Learning

【ML】 自监督学习 1. 自监督学习 bert 为例子1.1 BERT 的特点:1.2 BERT 的模型结构:1.3 训练 BERT 的步骤: 2. how to use BERT![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f8cccb378f844923a057043fadb60758.png)2. multi-lin…

DL00765-光伏故障检测高分辨率无人机热红外图像细粒度含数据集4000+张

光伏发电作为清洁能源的重要组成部分,近年来得到了广泛应用。然而,随着光伏电站规模的扩大,光伏组件在运行过程中可能会出现各种故障,如热斑、遮挡、接线盒故障等。这些故障不仅会影响光伏电站的发电效率,还可能导致更…

【日常开发】 java返回ECharts数据结构封装

java返回ECharts数据结构封装 一、前端页面示例图如下: 二、准备测试数据: 三、后端 格式封装代码: 四、最终结果: 🎈边走、边悟🎈迟早会好 一、前端页面示例图如下: 二、准备测试数据&am…

4.11.seq2seq 序列到序列学习

序列到序列学习(seq2seq) ​ 使用两个循环神经网络的编码器和解码器&#xff0c;应用于序列到薛烈类的学习任务。 ​ ​ 在图中&#xff0c;特定的"<eos>"表示序列结束词元。一旦输出序列生成此词元&#xff0c;模型就会停止预测。在循环神经网络解码器的初…

Go语言中gin+gorm开发前端端分离博客时遇到的问题,gorm执行查询时如何选中特定字段?

代码获取 本篇文章的代码放在了Github上&#xff0c;可以免费获取。 https://github.com/zhangdapeng520/zdpgo_gin_examples 概述 在查询用户信息的时候&#xff0c;由于密码这个字段比较敏感&#xff0c;需要进行处理&#xff0c;不要返回给前端。 我一开始的解决方案是直…

统计学:条件概率模型

照片由Edge2Edge Media在Unsplash上拍摄 一、介绍 在概率的许多应用中&#xff0c;不可能直接观察实验的结果&#xff1b;而是观察与结果相关的事件。因此&#xff0c;条件概率模型对于考虑和利用从观察到的事件中获得的信息至关重要。此外&#xff0c;条件概率模型与贝叶斯定理…

【vue3】【elementPlus】【黑暗模式】

从创建vue3项目到引入elementPlus组件并设置黑暗模式 1.创建vue3项目&#xff1a; npm init vuelatest1.1 根据需求定制项目插件&#xff1a; 2.引入elementPlus组件&#xff1a; npm install element-plus --save2.1 如图注册全局elementPlus组件&#xff1a; ------------…

充电不再难,高质量充电体系‘智’领绿色出行新时代

充电不再难&#xff0c;高质量充电体系‘智’领绿色出行新时代 国家发展改革委新闻发言人近日在新闻发布会上郑重声明&#xff0c;将持续强化统筹协调&#xff0c;协同各相关部门加速构建高质量充电基础设施体系&#xff0c;以更有效地满足人民群众对绿色出行的需求。 新能源汽…

C语言:文件处理

文件处理 一、文件的类型&#xff08;一&#xff09;文本文件和二进制文件 &#xff08;二&#xff09;程序文件和数据文件数据文件按照二进制储存 二、文件的打开和关闭&#xff08;一&#xff09;文件指针&#xff08;二&#xff09;文件的打开和关闭1、fopen2、fclose &…

webshell管理工具-中国蚁剑

中国蚁剑 版本说明&#xff1a;中国蚁剑 下载地址&#xff1a;GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器AntSword 加载器. Contribute to AntSwordProject/AntSword-Loader development by creating an account on GitHub.https://github.com/AntSwordProj…

数值分析【2】

目录 第三章 求解三角方程组​编辑 高斯消元​编辑 乘除次数&#xff1a;系数阵k^2,每行系数计算1&#xff0c;右边那列1 乘除总次数&#xff1a;​编辑 平方和 公式 列主元消去法 ​编辑 目的&#xff1a;舍入误差不扩散​编辑 直接LU分解​编辑 改进平方…

C#开发常见面试题三(浅复制和深复制的区别)

C#开发常见面试题三(浅复制和深复制的区别) 一.浅复制和深复制定义 &#xff08;1&#xff09;浅复制&#xff1a;复制一个对象的时候&#xff0c;仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。&#xff08;新对象和原对象将共享所有引用类型成员的实…

django如何更新数据库字段并与数据库保持同步?

关键步骤&#xff1a; 第一步&#xff1a; 执行&#xff1a;python manage.py makemigrations 你的项目名称第二步&#xff1a;它会提示你选1还是2&#xff0c;这里因为添加字段&#xff0c;所以选1第三步&#xff1a;出现>>>这个&#xff0c;直接输入这个第四步&am…

Win11+docker+vscode配置anomalib并训练自己的数据(3)

在前两篇博文中,我使用Win11+docker配置了anomalib,并成功的调用了GPU运行了示例程序。这次我准备使用anomalib训练我自己的数据集。 数据集是我在工作中收集到的火腿肠缺陷数据,与MVTec等数据不同,我的火腿肠数据来源于多台设备和多个品种,因此,它们表面的纹理与颜色差异…

C语言 | Leetcode C语言题解之第329题矩阵中的最长递增路径

题目&#xff1a; 题解&#xff1a; const int dirs[4][2] {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int rows, columns;typedef struct point {int x, y; } point;int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize) {if (matrixSize 0 || matrixC…