【云原生】使用nginx反向代理后台多服务器

news2024/11/17 7:51:45
背景

随着业务发展, 用户访问量激增,单台服务器已经无法满足现有的访问压力,研究后需要将后台服务从原来的单台升级为多台服务器,那么原来的访问方式无法满足,所以引入nginx来代理多台服务器,统一请求入口。

什么是nginx

Nginx[engine x]是一个免费开源Web服务器,是一个HTTP和反向代理服务器,邮件代理服务器, 和一个通用的 TCP/UDP 代理服务器,最初由俄罗斯软件工程师Igor Sysoev撰写。nginx专注于高性能、高并发性和低内存使用率。能够在高并发下给网站提供稳定的服务。

相关概念
  • 正向代理
    请求概述:客户端C知道资源D在服务器A中,但是无法直接访问服务器A,此时知道服务器N与服务器A在同一局域网中,并且可以相互访问,因为客户端C可以访问服务器N,因此客户端C通过服务器N访问服务器A得到资源D
    在这里插入图片描述

理解

  1. 正向代理对于客户端C来说他明确知道他要访问的资源D在哪个服务器上;
  2. 对于服务器S1来说他只充当客户端C的中间代理角色;而对于服务器A来说他只知道访问他的资源的是服务器N,根本不知道客户端C的存在。
  • 反向代理
    请求概述客户端C并不知道服务器A和服务器B的存在,客户端C只知道访问服务器N能获得资源D,只不过提供客户端C资源的都来着服务器A或者服务器B
    在这里插入图片描述

理解

  1. 反向代理对于客户端C来说,他是不知道资源D具体在哪里,也不知道具体由谁提供。
  2. 对于服务器S1来说每次都接受用户的请求,然后再把请求根据调度策略交给提供资源D的服务器S2或者S3,对于服务器S2和S3来说同样也都不知道访问这份资源D的真实用户是谁,只是和服务器S1进行交互。
实操nginx代理springboot服务器

注:下文所有服务基于docker环境启动

  • 安装nginx容器
    可参考:Docker安装镜像操作相关命令下滑到第6步
    安装完成后可得到nginx映射在宿主机上相关的文件
    在这里插入图片描述
    并且启动nginx容器,映射端口:9001
    在这里插入图片描述

  • 打包springboot项目并docker运行
    可参考:【云原生】springboot项目打包部署docker镜像

    为了模拟多台服务器,本文通过修改项目端口号(8088、8089),上传打包了两个springboot项目镜像,分别启动了一个容器
    在这里插入图片描述

  • nginx代理配置修改
    进入宿主机中的nginx文件,进入conf文件
    在这里插入图片描述
    打开后编辑default.conf注:对于nginx代理配置,主要修改这个文件)文件
    在这里插入图片描述
    1.模拟正向代理或者说是一对一代理配置内容:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

   #nginx自带主页面配置
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

   # 本次配置服务器新增内容
    location /boot {
           	proxy_pass http://172.16.0.3:8089/web; # 单个服务器配置
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

注:配置文件新增内容中 “/boot” 表示为映射到服务器的名称前缀,当代理的服务器增多,根据实际情况自定义不同的名称,便于区分。

  1. 模拟反向代理或者说代理多个服务器配置:
# 新增内容 多个服务器配置
upstream backend {
        ip_hash; #负载均衡策略
        server 172.16.0.3:8089;  # 第一个 Tomcat 服务器的本地端口
        server 172.16.0.3:8088;  # 第二个 Tomcat 服务器的本地端口
}

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

   #nginx自带主页面
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

   #服务器配置
    location /boot {
           # proxy_pass http://172.16.0.3:8089/web; # 单个服务器配置
            proxy_pass http://backend/web; # 多个服务器配置
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

注:上述配置中 “ip_hash” 为nginx的一种负载均衡策略。nginx支持四种负载均衡策略。

  1. 轮询(Round Robin)策略
 upstream backend {
        server 172.16.0.3:8089;  # 第一个 Tomcat 服务器的本地端口
        server 172.16.0.3:8088;  # 第二个 Tomcat 服务器的本地端口
  } 
  1. 最少连接(Least Connections)策略:
  upstream backend {
  	  least_conn;
      server 172.16.0.3:8089;  # 第一个 Tomcat 服务器的本地端口
      server 172.16.0.3:8088;  # 第二个 Tomcat 服务器的本地端口
} 
  1. IP哈希(IP Hash)策略:
   upstream backend {
   	   ip_hash;
       server 172.16.0.3:8089;  # 第一个 Tomcat 服务器的本地端口
       server 172.16.0.3:8088;  # 第二个 Tomcat 服务器的本地端口
 } 
  1. 加权轮询(Weighted Round Robin)策略:
 upstream backend {
     server 172.16.0.3:8089 weight=2;  # 第一个 Tomcat 服务器的本地端口
     server 172.16.0.3:8088 weight=1;  # 第二个 Tomcat 服务器的本地端口
} 

详细解析可参考:Nginx负载均衡多种策略配置

  • 访问服务器
    完成上述nginx配置后,重启nginx容器。
    先不使用代理访问后台客户端:http://ip地址:8088/web/login
    在这里插入图片描述
    使用nginx代理访问客户端:http://ip地址:9001/boot/login

在这里插入图片描述
上述地址中的端口和路由地址都发生了改变,但代理访问客户端与不适用代理返回的页面一致,则nginx代理配置成功


使用nginx代理可以很好的隐藏内部服务器的地址,不暴露在公网中,可配置为内网地址,减少网络请求压力,安全性提高,只需开放代理服务器地址供外部访问即可。

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

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

相关文章

在idea命令行,or linux 终端执行命令,快速获取通过脚本上证指数、创业板实时行情

脚本编写 编写shell脚本如下,并保存命名为stock curl http://hq.sinajs.cn/list=s_sh000001 -H User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 -H Accept: */* -H Accept-Language: en-US,en;q=0.5 --compressed -H Referer…

SIEM 体系结构的组件

安全信息和事件管理(SIEM)软件可帮助 IT 安全专业人员保护其企业网络免受网络攻击,SIEM 解决方案从组织中的所有基础结构组件收集日志数据,为安全专业人员提供实时数据和对网络活动的见解。 网络的内部视图可以帮助您识别和预防威…

热像仪:使用 ESP32 和 MLX90640 传感器设计您自己的红外成像设备

本文详细介绍如何设计一款基于ESP32的热成像仪,文末包含完整的原理图,PCB,3D文件,程序源码的免费下载链接 使用 ESP32 和 MLX90640 传感器 DIY 热像仪 热像仪广泛应用于各种工业应用,例如热性能监控、检测温度异常、热基准测试等。我们甚至将热成像用于国防和军事应用。我…

Python教程:Pandas删除数据的4种情况

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 开始之前,pandas中DataFrame删除对象可能存在几种情况 1、删除具体列 2、删除具体行 3、删除包含某些数值的行或者列 4、删除包含某些字符、文字的行或者列…

2023-11-07 android 编译的时候出现 unused variable ‘temp0‘ [-Werror,-Wunused-variable]

一、android 编译的时候出现 unused variable temp0 [-Werror,-Wunused-variable] 二、解决方法:在android.mk里面添加 LOCAL_CFLAGS -Wno-unused-parameter -Wno-unused-variable 三、解释 -Woption 让编译器给出option指定的编译警告,常用的一些如…

CSS实现文本左右对齐

因为文本里面有中午符号,英文,英文符号等,导致设置宽度以后右侧凌乱,可以通过以下代码设置样式,让文本工整对齐。 让我们看一下设置前和设置后的对比图片: 效果图如下:(左边是设置…

揭秘Spring框架:模块装配的奥秘与实战技巧 【Spring|Java】

⭐简单说两句⭐ 作者:后端小知识,CSDN后端领域新星创作者|阿里云专家博主 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 揭秘Spring框架…

Cocos 进度条物体跟随效果

话不多说上代码,记录一下初学cocos解决的问题,实用小功能。 import { _decorator, Button, Component, Node, ProgressBarComponent, Sprite, UITransform, Vec3 } from cc; const { ccclass, property } _decorator;ccclass(game_scene1) export clas…

容联七陌携手岚时科技,解决医美机构回访3大痛点

近日,岚时科技研发中心联合容联七陌发布了全新的智能呼叫中心系统,5大功能模块解决了医美机构回访过程中的3大难题:客户资产保全困难、客户回访技术被卡脖子、回访人员(客服、咨询)效率管理困难。 “智能呼叫中心”通过…

ZKP8.1 Polynomial-IOP and Polynomial Commitment Schemes

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 8: FRI-based Polynomial Commitments and Fiat-Shamir (Justin Thaler) 8.1 Polynomial-IOP and Polynomial Commitment Schemes Recall: build an efficient SNARK Recall: Polynomial-IOP P’s first message in the pro…

Freeswitch代码

1.引入依赖 Freeswitch依赖版本 <dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>esl-client</artifactId><version>0.10.1</version> </dependency> 2.代码 import org.freeswitch.esl.client.inbound…

分享导致vcruntime140_1.dll丢失的原因,以及vcruntime140_1.dll的解决办法

电脑中缺失vcruntime140_1.dll文件的问题&#xff0c;是常有的问题&#xff0c;不仅仅是vcruntime140_1.dll文件&#xff0c;还会有很多的其他的dll文件都会出现这样的问题。今天就和大家聊聊vcruntime140_1.dll文件丢失的情况&#xff0c;和什么原因导致的丢失vcruntime140_1.…

【波形图】在波形图上显示相对时间并将原点设置为零

默认情况下&#xff0c;波形图有一个定义的窗口来显示 X 轴。当X值达到该窗口的上限时&#xff0c;图表开始滚动以显示最新值的窗口。为了防止这种情况&#xff0c;请通过右键单击图表并选择X Scale Autoscale X将 X 轴设置为自动缩放。此操作还将增加窗口的大小以显示从 0 到…

基于SSM的智慧作业试题管理系统(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的智慧作业试题管理系统&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sprin…

样式问题解决

1.深度样式选择器 1.vue2中 原生css >>> .el-card__header saas\scss ::v-deep .el-card__header less /deep/ .el-card__header 2.vue3中 :deep() { //styles } ::deep() { //styles } 2.修改element.style样式

【uniapp】解决在H5谷歌浏览器下 u-input 标签 设置只读后,click事件不生效

【问题描述】 谷歌浏览器更新后&#xff0c;h5模式下原本的input外层view中的click事件不触发了?? 但是更换浏览器后就可以&#xff0c;打包app也是正常可以触发的&#xff0c;本来是没打算兼容h5&#xff0c;既然遇到了就记录一下~ 【解决办法】 使u–input里写上readonly&…

python随机生成指定长度的字符串

需求&#xff1a;随机生成一个指定长度的字符串&#xff08;数字和小写字母&#xff09; 涉及到的python知识点 &#xff08;1&#xff09;python模块包&#xff1a;random random.choice(sequence)&#xff1a;从指定的序列中获取一个随机元素 random.choice(sequence)从序…

GoLong的学习之路(二十一)进阶,语法之并发(go最重要的特点)(协程的主要用法)

并发编程在当前软件领域是一个非常重要的概念&#xff0c;随着CPU等硬件的发展&#xff0c;我们无一例外的想让我们的程序运行的快一点、再快一点。Go语言在语言层面天生支持并发&#xff0c;充分利用现代CPU的多核优势&#xff0c;这也是Go语言能够大范围流行的一个很重要的原…

AI 视频 | 文本生视频工具又迎来重大更新,Runway Gen-2 到底有多强?Gen-2 怎么用(保姆级教程)

一、引言 不久前刚介绍了一个号称地表最强的文本生视频的工具 Moonvalley&#xff1a;免费的 AI 视频生成工具 Moonvalley 厉害了&#xff01;Moonvalley 怎么用&#xff08;保姆级教程&#xff09; 紧接着在 11 月 2 日&#xff0c;Runway 重磅发布了第 2 代文本到视频和图像…

unity打AB包,AssetBundle预制体与图集(三)

警告&#xff1a; spriteatlasmanager.atlasrequested wasn’t listened to while 条件一&#xff1a;图片打图集里面去了 条件二&#xff1a;然后图集打成AB包了 条件三&#xff1a;UI预制体也打到AB包里面去了 步骤一&#xff1a;先加载了图集 步骤二&#xff1a;再加载UI预…