谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)
文章目录
- 一,通过域名访问商城架构设计
- 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将这个请求转发给网关,原理如下:
-
本地DNS解析(hosts文件):
- 在Windows系统的hosts文件中配置域名与虚拟机IP的映射关系。例如,
gulimall.com
、search.gulimall.com
、item.gulimall.com
和member.gulimall.com
都被指向同一个虚拟机IP地址。这样,当在浏览器中输入这些域名时,系统会将它们解析到指定的虚拟机IP。
- 在Windows系统的hosts文件中配置域名与虚拟机IP的映射关系。例如,
-
Nginx作为网关:
- Nginx被配置为一个网关,用于接收来自上述域名的所有请求。
-
server块配置:
- 在Nginx配置中,定义了一个server块来监听域名
gulimall.com
的80端口。这意味着所有HTTP请求都会首先到达这个server块。
- 在Nginx配置中,定义了一个server块来监听域名
-
反向代理配置(location块):
- 在server块中,定义了一个location块,用于匹配根路径
/
的请求。使用proxy_pass
指令将请求转发到内部网络的特定服务上,这里是转发到http://192.168.56.1:10000
,即商品服务所在的地址。
- 在server块中,定义了一个location块,用于匹配根路径
-
请求处理:
- 当用户访问
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 配置原理
-
location / { … }:
- 这个
location
块定义了对于根路径/
的请求的处理方式。location
块可以包含在server
块内,用于匹配特定的URI或路径。 location /
表示匹配所有以根路径开始的请求。
- 这个
-
proxy_pass http://gulimall;:
proxy_pass
指令用于设置请求的代理转发目标。这里它指定了请求应该被转发到名为gulimall
的上游服务器组(upstream)。注意,这里的http://
是可选的,因为proxy_pass
默认就是HTTP代理。
-
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-routeuri: lb://gulimall-productpredicates:- 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
放在最前面,可能出现的问题包括:
-
匹配优先级问题:
- 路由规则是从上到下匹配的,一旦匹配成功,就不会再考虑下面的规则。如果
gulimall-index-route
放在最前面,所有.gulimall.com
的请求都会被这个规则捕获,即使这些请求的路径可能更适合下面的某个Path
谓词规则。
- 路由规则是从上到下匹配的,一旦匹配成功,就不会再考虑下面的规则。如果
-
路径路由失效:
- 由于
gulimall-index-route
会捕获所有.gulimall.com
的请求,其他基于特定API路径(如/api/search/**
、/api/coupon/**
等)的路由规则将不会生效,因为请求在到达这些规则之前已经被gulimall-index-route
匹配并路由了。
- 由于
-
服务发现问题:
- 如果
gulimall-product
服务不能处理所有可能的API请求(例如,它不包含搜索、优惠券、库存等API的实现),那么将所有请求都路由到这个服务将导致错误或不期望的响应。
- 如果
3,nginx.conf upstream配置缺少端口
重启nginx和网关后,仍然不能正常访问页面,查看nginx日志,发现转发到80端口,而网关是在88端口,说明配置nginx.conf
中upstream
配置缺少端口。
如下图修改之后,即能正常访问。
相关文章:

谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)
文章目录 一,通过域名访问商城架构设计1,为什么nginx要将请求转发给网关2,架构设计 二,配置1,nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2,网关配置 三,记录2个问题1,网…...

【Android Studio】 创建第一个Android应用HelloWorld
文章目录 创建项目查看AndroidManifest.xml(清单)查看MainActivity.java(Activity)查看activity_main.xml(布局) 创建项目 查看AndroidManifest.xml(清单) 查看MainActivity.java(Activity&…...
C++中的错误处理机制:异常
C中的错误处理机制:异常 在软件开发中,错误处理是确保程序稳定性和健壮性的关键环节。C作为一种高级编程语言,提供了比C语言更为灵活和强大的错误处理机制——异常处理。异常处理机制允许程序在运行时检测到错误或异常情况时,能够…...

概率论原理精解【9】
文章目录 集类拓扑空间基 参考文献 集类 C是一个集类(以G的某些子集为元素的集合称为G的集类)。 A i ∈ C , ∩ i 1 n A i ∈ C , 此为有限交封闭 C 所得集类 C ∩ f A_i \in C,\cap_{i1}^nA_i \in C,此为有限交封闭C所得集类C_{\cap f} Ai∈C,∩i1n…...
Pytorch添加自定义算子之(11)-C++应用程序将onnx模型编译并转成tensorrt可执行模型
一、环境 参考 opencv tensorrt cuda visual studio 2019 cmake 二、CMakeLists.txt配置文件 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)PROJECT(segment)set(CMAKE_CXX_FLAGS "-std=c++14 -O1")link_directories(/usr/local/cuda/lib64) # set(OpenCV_DIR "/opt/…...

C++笔记1•C++入门基础•
1.C关键字 C总计63个关键字,C语言32个关键字: 2.命名空间: 在 C/C 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目…...

Linux查看系统线程数
Linux查看系统线程数 查看线程数查看进程内的线程统计线程数 查看线程数 想要查看Linux操作系统允许的最大线程数,可以通过命令 ulimit -a返回配置项的详细说明: # core文件的最大值为100blocks core file size (blocks, -c) 0# 进程的数…...

【Python基础】Python六种标准数据类型中哪些是可变数据,哪些是不可变数据
文章目录 1.基本介绍可变数据类型不可变数据类型2.可变和不可变到底指的是什么?可变(Mutable)不可变(Immutable)总结1.基本介绍 Python 中的六种标准数据类型分为可变数据类型和不可变数据类型。以下是这些数据类型的分类: 可变数据类型 列表(List) 列表是一种有序集…...

android13去掉安全模式 删除安全模式
总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题排查 3.修改方法 3.1方法1 3.2方法2 4.测试 5.彩蛋 1.前言 Android设备上的安全模式是一种诊断模式,当设备无法正常启动时,它会启动到这个模式。在这个模式下,只有系统自带的程序和服务会被运行,所有的第三方…...
LeetCode239 滑动窗口最大值
前言 题目: 239. 滑动窗口最大值 文档: 代码随想录——滑动窗口最大值 编程语言: C 解题状态: 没有思路,困难题,恐怖如斯 思路 本题的关键在于对单调队列的应用,时间复杂度 O ( n ) O(n) O(n)限…...

文件解析漏洞—IIS解析漏洞—IIS7.X
在IIS7.0和IIS7.5版本下也存在解析漏洞,在默认Fast-CGI开启状况下,在一个文件路径/xx.jpg后面加上/xx.php会将 “/xx.jpg/xx.php” 解析为 php 文件 利用条件 php.ini里的cgi.fix_pathinfo1 开启IIS7在Fast-CGI运行模式下 在 phpstudy2018 根目录创建…...
vue中子传父之间通信(this.$emit触发父组件方法和.sync修饰符与$emit(update:xxx))
文章目录 前言一、通过this.$emit触发父组件方法实现二、.sync修饰符与$emit(update:xxx) 前言 看了几篇帖子,都没有将$emit两种用法汇聚总结在一起。需要额外的浪费时间去查看其他帖子,索性自己总结一下,方便以后查看。 一、通过this.$emit…...
SocketIO 的 html 代码示例
话不多说,以下为前端 SocketIO 代码示例 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title>TestConnect</title><base><script src&quo…...

Vercel Error: (Azure) OpenAI API key not found
题意:Vercel 错误:(Azure) OpenAI API 密钥未找到 问题背景: I implemented openAI API in my Next.js app with the help of langchain library and it works superb on localhost, but in Vercel (ProVersion) it throws an error: 我使用…...

SPSS、Python员工满意度问卷调查激励保健理论研究:决策树、随机森林和AdaBoost|附代码数据
全文链接:https://tecdat.cn/?p37293 原文出处:拓端数据部落公众号 在深入了解公司当前的实际情况和员工内心真实想法的基础上,我们旨在从专业视角出发,为企业在组织管理方面的不足进行诊断,并进行全面审视。 为了…...
常见深度学习优化器总结
Adam 是一种非常流行的优化器,因为它结合了动量和自适应学习率的优点,通常在大多数情况下表现良好。不过,如果你在使用 Adam 时遇到性能问题或希望进一步调优,以下是几种可以考虑的替代优化器: 1. AdamW (Adam with W…...
python并发编程之多线程和多进程
了解过python 编程语言的人,可能很多人都听过,python的多线程是假的。 之所以这么说的原因是因为,大家应该都知道python 是一门解释型语言,在cpython解释器中有一个GIL(Global Interpreter Lock),全局解释锁ÿ…...
gorm入门——根据条件查询列表
在 GORM 中,你可以通过 Where 方法结合多个条件来查询符合条件的记录列表。Where 方法支持 AND 和 OR 条件,并且可以链式调用以构建复杂的查询。 示例代码: 假设你有一个 User 结构体,并希望根据多个条件查询符合条件的记录列表…...

笔面试编程题总结
8/6诺瓦星云 修改程序 void point(int *p){*p p[2];}; int main() {int c[] {1,2,3,4,5},*p c;point(p1);for(;p <c5;){printf("%d",*p);}return 0; }1、分隔字符串 strtok //c语言 #include <stdio.h> #include <string.h>// 函数声明 char* fin…...
[other][知识]八大行星的英文各是什么?
1、水星英文名 Mercury,水星最接近太阳,是太阳系中体积和质量最小的行星; 2、金星英文名 Venus,太阳系中第六大行星,太阳系中温度最高的行星,中国古代称之为太白或太白金星; 3、地球英文 E…...
SparkSQL 优化实操
一、基础优化配置 1. 资源配置优化 # 提交Spark作业时的资源配置示例 spark-submit \--master yarn \--executor-memory 8G \--executor-cores 4 \--num-executors 10 \--conf spark.sql.shuffle.partitions200 \your_spark_app.py 参数说明: executor-memory: 每…...
平滑技术(数据处理,持续更新...)
一.介绍 “平滑”是一种用于减少数据中的短期波动、噪声或者异常值的技术,从而更清晰地揭示数据的长期趋势或周期性特征。 平滑的主要作用: 1.减少噪声。数据中常常包含各种随机噪声或误差,这些误差可能会掩盖数据的真实趋势。平滑可以降低…...

Cursor快速梳理ipynb文件Prompt
1. 整体鸟瞰 请在不运行代码的前提下,总结 <文件名.ipynb> 的主要目的、核心逻辑流程和输出结果。阅读整个项目目录,列出每个 .ipynb / .py 文件的角色,以及它们之间的数据依赖关系(输入→处理→输出)。2. 结构…...

JVM 内存溢出 详解
内存溢出 内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值,从而使用内存时因空间不足而失败,虚拟机一般会抛出指定的错误。 在Java虚拟机中,只有程序计数器不会出现内存溢出的情况,因为每个线程的程序计数器只保…...
CSS中text-align: justify文本两端对齐
text-align: justify; 是 CSS 中用于控制文本对齐方式的属性值,它的核心作用是让文本两端对齐(分散对齐),使段落左右边缘整齐排列。以下是详细解析: 作用效果 均匀分布间距 浏览器会自动调整单词/字符之间的间距&#…...

Excel-vlookup -多条件匹配,返回指定列处的值
前提:先了解vlookup 的简单使用, 参照:https://blog.csdn.net/yanweijie0317/article/details/144886106?spm1011.2124.3001.6209 要求:按照Sheet0的B列和I列,在Sheet1中查找H列。 函数: VLOOKUP(B509&a…...
文件上传漏洞深度解析:检测与绕过技术矩阵
文件上传漏洞深度解析:检测与绕过技术矩阵 引言:无处不在的文件上传风险 在当今的Web应用生态系统中,文件上传功能几乎无处不在。从社交媒体分享图片到企业文档管理系统,用户上传文件已成为现代Web应用的核心功能之一。然而&…...

智能制造数字孪生全要素交付一张网:智造中枢,孪生领航,共建智造生态共同体
在制造业转型升级的浪潮中,数字孪生技术正成为推动行业变革的核心引擎。从特斯拉通过数字孪生体实现车辆全生命周期优化,到海尔卡奥斯工业互联网平台赋能千行百业,数字孪生技术已从概念验证走向规模化落地。通过构建覆盖全国的交付网络&#…...
【Redis】Cluster集群
目录 1、背景2、核心特性【1】数据分片【2】高可用【3】去中心化【4】客户端重定向 3、集群架构【1】最小规模【2】节点角色【3】通信协议 4、数据分片与路由【1】哈希槽分配【2】客户端路由逻辑 5、故障恢复6、适用场景 1、背景 Redis Cluster是Redis官方提供的分布式解决方案…...
Ubuntu中常用的网络命令指南
Ubuntu中常用的网络命令指南 在Ubuntu系统中,网络管理是日常运维和故障排查的核心技能。 🛠️ 基础网络诊断 ping - 测试网络连通性 ping google.com # 持续测试 ping -c 4 google.com # 发送4个包后停止traceroute / tracepath - 追踪数据包路径 …...