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

文章目录

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

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

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

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

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

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

2,架构设计

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

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

    • 在Windows系统的hosts文件中配置域名与虚拟机IP的映射关系。例如,gulimall.com、search.gulimall.com、item.gulimall.com和member.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中做如下配置。

dart 复制代码
	upstream gulimall{
        server 192.168.56.1:88;
    }   

1.2 gulimall.conf

在conf.d目录下的gulimall.conf做如下配置。

dart 复制代码
	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,网关配置

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

dart 复制代码
        - 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中配置中重设请求头域名信息,配置如下。

dart 复制代码
 	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.conf中upstream配置缺少端口。

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

相关推荐
小lu飞8 分钟前
2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程
前端·笔记·ai·ai编程
无心水4 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd4 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
Lsetea7 小时前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
Zhao-Jichao7 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李7 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga9 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd9 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白10 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李11 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议