【云原生】使用nginx反向代理后台多服务器
背景
随着业务发展, 用户访问量激增,单台服务器已经无法满足现有的访问压力,研究后需要将后台服务从原来的单台升级为多台服务器,那么原来的访问方式无法满足,所以引入nginx来代理多台服务器,统一请求入口。
什么是nginx
Nginx[engine x]是一个免费开源Web服务器,是一个HTTP和反向代理服务器,邮件代理服务器, 和一个通用的 TCP/UDP 代理服务器,最初由俄罗斯软件工程师Igor Sysoev撰写。nginx专注于高性能、高并发性和低内存使用率。能够在高并发下给网站提供稳定的服务。
相关概念
- 正向代理
请求概述:客户端C知道资源D在服务器A中,但是无法直接访问服务器A,此时知道服务器N与服务器A在同一局域网中,并且可以相互访问,因为客户端C可以访问服务器N,因此客户端C通过服务器N访问服务器A得到资源D

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

理解:
- 反向代理对于客户端C来说,他是不知道资源D具体在哪里,也不知道具体由谁提供。
- 对于服务器N来说每次都接受用户的请求,然后再把请求根据调度策略交给提供资源D的服务器A或者B,对于服务器A和B来说同样也都不知道访问这份资源D的真实用户是谁,只是和服务器N进行交互。
实操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” 表示为映射到服务器的名称前缀,当代理的服务器增多,根据实际情况自定义不同的名称,便于区分。
- 模拟反向代理或者说代理多个服务器配置:
# 新增内容 多个服务器配置
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支持四种负载均衡策略。
- 轮询(Round Robin)策略
upstream backend {server 172.16.0.3:8089; # 第一个 Tomcat 服务器的本地端口server 172.16.0.3:8088; # 第二个 Tomcat 服务器的本地端口}
- 最少连接(Least Connections)策略:
upstream backend {least_conn;server 172.16.0.3:8089; # 第一个 Tomcat 服务器的本地端口server 172.16.0.3:8088; # 第二个 Tomcat 服务器的本地端口 }
- IP哈希(IP Hash)策略:
upstream backend {ip_hash;server 172.16.0.3:8089; # 第一个 Tomcat 服务器的本地端口server 172.16.0.3:8088; # 第二个 Tomcat 服务器的本地端口}
- 加权轮询(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代理可以很好的隐藏内部服务器的地址,不暴露在公网中,可配置为内网地址,减少网络请求压力,安全性提高,只需开放代理服务器地址供外部访问即可。
相关文章:
【云原生】使用nginx反向代理后台多服务器
背景 随着业务发展, 用户访问量激增,单台服务器已经无法满足现有的访问压力,研究后需要将后台服务从原来的单台升级为多台服务器,那么原来的访问方式无法满足,所以引入nginx来代理多台服务器,统一请求入口…...
Linux awk命令
除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk。 曾有人推测 awk 命令的名字来源于 awkward 这个单词。其实不然,此命令的设计者有 3 位,他们的姓分别是 Aho、Weingberger 和 Kernighan&#x…...
南大通用数据库-Gbase-8a-学习-42-定位与释放锁
目录 一、测试版本 二、模拟锁表场景 1、查看自动提交参数 2、关闭自动提交 3、测试表结构 4、测试数据 5、会话一更新数据不提交 6、会话二更新数据卡住 7、会话三查看连接信息 8、会话三查看锁信息 9、解决方法 10、会话一插入数据不提交 11、会话二更新报错 三…...
css绘制常见的一些图形
以下是在CSS中绘制常见图形的示例代码: 线条: .line {width: 100px;height: 1px;background-color: black; }箭头: .arrow {width: 0;height: 0;border-top: 10px solid transparent;border-bottom: 10px solid transparent;border-right:…...
【网络协议】
网络协议 1 网络通讯1.1 防火墙1.2 子网掩码1.3 网关1.4 2 SSH2.1 SSH2.2 SSH12.3 SSH2 3 Telnet4 Telnet/SSL5 NFS6 TFTP7 FTP8 SFTP9 HTTP10 HTTPS11 NAT12 加密 1 网络通讯 1.1 防火墙 所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法&…...
如何在JVS低代码表单配置中实现数据的高效管理?
在数字化时代,表单已经成为企业、机构和个人收集、整理、分析数据的重要工具。然而,随着数据复杂性的增长,传统的单一表单往往难以满足需求。JVS低代码表单引擎中子表格允许在主表单中嵌套另一个子表数据,使得数据的收集和组织更加…...
【Python大数据笔记_day04_Hadoop】
分布式和集群 分布式:多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务) 集群:多台服务器联合起来独立做相同的任务(多个服务器分担客户发来的请求) 注意:集群如果客户端请求量(任务量)多,多个服务器同时处理不同请求(不同任务),如果请求量…...
Android超简单的显示网络图片方法
Android显示网络图片的方法如下: 1、首先,需要在AndroidManifest.xml文件中添加网络权限: <uses-permission android:name"android.permission.INTERNET" /> 2、在布局文件中添加ImageView控件: <ImageVie…...
基于自然语言处理的结构化数据库问答机器人系统
温馨提示:文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 知识库,就是人们总结出的一些历史知识的集合,存储、索引以后,可以被方便的检索出来供后人查询/学习。QnA Maker是用于建立知识库的工具,使用…...
JVM Native内存泄露的排查分析(64M 问题)
我们有一个线上的项目,刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G,这明显不合理,于是进行了一些分析找到了根本的原因,下面是完整的分析过程,希望对你有所帮助。 会涉及到下面这些内容 Linux 经典的 64M…...
智能网联汽车基础软件信息安全需求分析
目录 1.安全启动 2.安全升级 3.安全存储 4.安全通信 5.安全调试 6.安全诊断 7.小结 1.安全启动 对于MCU,安全启动主要是以安全岛BootROM为信任根,在MCU启动后,用户程序运行前,硬件加密模块采用逐级校验、并行校验或者混合校…...
《QT从基础到进阶·十八》QT中的各种鼠标事件QEvent
1、界面标题栏事件: NonClientAreaMouseButtonPress 标题栏点击事件 NonClientAreaMouseButtonRelease 标题栏释放事件 bool CustomPopDialog::event(QEvent* event) {switch (event->type()){case QEvent::MouseButtonRelease://Event of mouse releasing wind…...
CSDN中调整图片和文本样式
1.调整图片比例 插入图片后,觉得图片比例不协调,想改小点。只需要在文件后缀加个参数即可:?pic_center 60x。 NOTE:等号左边一定要加个空格,否则格式不生效 2.修改字体颜色 如上 NOTE:等号左边一定要…...
社区团购商品数据抓取
爬虫程序的实现需要使用到C#编程语言以及相关爬虫框架,如Scrapy、WebScraper等。以下是一个简单的示例,展示了如何使用C#爬取网站上的商品数据: using System; using System.Net; using System.IO; using HtmlAgilityPack;class Program {st…...
Nginx用做sip代理
https://www.jianshu.com/p/14d134cbf8d3?tdsourcetags_pcqq_aiomsg 看了这篇文章的方案一,我专门试了试,记录如下: 测试环境为: fs1(5080 --- nginx --- fs2(5060) 局域网同一个网段&…...
C# set的一些使用方法
在C#应用中,使用set监控值的改变触发事件是一种非常常见的编程模式。 比如下面一些应用。 1、属性更改通知:当某个属性的值发生变化时,可以使用set监控属性的改变,并触发一个事件来通知其他部分代码。这在MVVM(Model…...
机器学习——回归
目录 一、线性回归 1、回归的概念(Regression、Prediction) 2、符号约定 3、算法流程 4、最小二乘法(LSM) 二、梯度下降 梯度下降的三种形式 1、批量梯度下降(Batch Gradient Descent,BGD)ÿ…...
JAVA代码视频转GIF(亲测有效)
1.说明 本次使用的是JAVA代码视频转GIF,maven如下: <dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>3.2.0</version></dependency><dependency&…...
挑战100天 AI In LeetCode Day03(热题+面试经典150题)
挑战100天 AI In LeetCode Day03(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-52.1 题目2.2 题解 三、面试经典 150 题-53.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&am…...
【手写模拟Spring底层原理】
文章目录 模拟Spring底层详解1、结合配置类,扫描类资源1.1、创建需要扫描的配置类AppConfig,如下:1.2、创建Spring容器对象LyfApplicationContext,如下1.3、Spring容器对象LyfApplicationContext扫描资源 2、结合上一步的扫描&…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
