【云原生】使用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
    在这里插入图片描述

理解

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP编程及基础知识

一、端口号 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区分TCP端口号与UDP端口号独立端口用两个字节来表示 2byte(65535个) 众所周知端口:1~1023(1~255之间为众所周知端口&#xff…

Ubuntu网络IP地址一直显示127.0.0.1

问题描述: 终端输入ip a显示127.0.0.1,原来类似192.168.231.1的地址不见了。 ip a 点击网络配置(ubuntu桌面版),发现无线网络模块看不见了 正常情况应该有wired 模块,就是下面标红的 解决方案&#xff1a…

学为贵雅思写作备考

准确通顺,言之有物 两次读不懂,6分以下, 6分没有印象,味同嚼蜡,但是没错(书面语过关) 英语比较过关 8-9分,很有见地 6-7单个的句子读得懂,前后是贯通的、逻辑是通顺…

发现一款PDF转换成翻页电子书的网站

​随着科技的发展,电子书越来越受到人们的喜爱。而PDF格式的文件也越来越多地被人们使用。那么,如何将PDF文件转换成翻页电子书呢?今天就为大家推荐一款好用的PDF转翻页电子书网站。 一、网站介绍 这款网站是一款非常实用的在线转换工具&…

Devchat AI尝鲜试用:程序员开发提效利器,告别脏活累活

DevChat 简介 在当今的软件开发领域,程序员们每天都要面对海量的代码和复杂的任务。尽管技术不断发展,但程序员们依然需要花费大量时间进行重复性工作,如代码审查、错误排查、文档编写等。这些脏活累活不仅消耗了程序员们大量的时间和精力&am…

draw.io与项目管理——如何利用流程图工具提高项目管理效率

draw.io 是一款强大的图形绘制工具,用于创建各种类型的图表、流程图、组织结构图、网络图和平面设计等。它提供了丰富的绘图工具和预定义的图形库,使用户能够轻松创建专业水平的图形作品。 draw.io具有直观的界面和简单易用的功能,适合各种用…

gradle学习笔记

gradle学习笔记 一、下载安装配置环境变量二、使用gradle管理spring项目1、创建项目2、导入项目至编辑器3、打包部署4、将maven项目转为gradle项目 三、gradle介绍1、常用命令2、Gradle Wrapper包装器3、gradle进阶说明4、gradle插件 四、Groovy 简介 参考博客:http…

VM虚拟机逆向 --- [NCTF 2018]wcyvm 复现

文章目录 前言题目分析 前言 第四题了,搞定,算是独立完成比较多的一题,虽然在还原汇编的时候还是很多问题。 题目分析 代码很简单,就是指令很多。 opcode在unk_6021C0处,解密的数据在dword_6020A0处 opcode [0x08, …

原子化 CSS 真能减少体积么?

前言 最近看到这样一篇文章:《要喷也得先做做功课吧?驳Tailwind不好论》 个人觉得说的还是有一定道理的,就是该作者的语气态度可能稍微冲了点: 不过他说的确实有道理,如果这种原子化工具真的如评论区里那帮人说的那么…

【jvm】虚拟机栈

目录 一、背景二、栈与堆三、声明周期四、作用五、特点(优点)六、可能出现的异常七、设置栈内存大小八、栈的存储单位九、栈运行原理十、栈帧的内部结构10.1 说明10.2 局部变量表10.3 操作数栈10.4 动态链接10.5 方法返回地址10.6 一些附加信息 十一、代…

明御安全网关任意文件上传漏洞复现

简介 安恒信息明御安全网关(NGFW) 秉持安全可视、简单有效的理念,以资产为视角的全流程防御的下一代安全防护体系,并融合传统防火墙、入侵防御系统、防病毒网关、上网行为管控、VPN网关、威胁情报等安全模块于一体的智慧化安全网关。 较低版本的系统存…

淘宝API技术文档解析,从入门到实战

探索淘宝数据的奥秘,淘宝是目前国内最大的B2C电商平台之一,每天都会产生海量的数据。借助淘宝API技术文档,我们可以轻松地获取到这些数据,从而为电商运营和数据分析提供有力支持。 1.什么是淘宝API? 淘宝API&#xf…

用免费GPU线上优化猫狗识别实践

该部分以“猫狗识别模型”为例,学习如何直接通过平台提供的开发环境调用GPU资源 一.学习准备 获取官方代码文件:https://platform.virtaicloud.com/gemini_web/workspace/space/n9tte8i2aspd/project/list 二.创建项目 1)进入趋动云用户工…

轻量封装WebGPU渲染系统示例<12>- 基础3D对象实体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/PrimitiveEntityTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见:引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔…

不会写文档的程序员不是好的程序员

在当今数字化的世界中,软件开发行业正经历着前所未有的繁荣。从移动应用到大型企业系统,软件构建了现代社会的基础。在IT行业中,文档是一种非常重要的沟通工具。它可以帮助程序员和客户及团队成员之间进行有效的沟通和协作,提高工…

基于springboot实现原创歌曲分享平台系统项目【项目源码+论文说明】

基于springboot实现原创歌曲分享平台系统演示 摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理平台应运而生…

工业自动化工厂PLC远程控制网关物联网应用

远程控制网关在工厂自动化领域中起到了至关重要的作用,特别是在工厂PLC数据通讯方面。它充当着数据传输的桥梁,连接了工厂中的各类设备和系统,实现了远程监控和控制的功能。本文将详细介绍远程控制网关在工厂PLC数据通讯中的应用。 远程控制网…

项目上线前发现严重Bug怎么办?

今天分享一个面试问题,现在有一个面试场景: 项目计划明天发布,但是在今天你作为测试人员发现了一个严重的bug,市场相关人员又在催发布的事情,这个时候你应该怎么办? 这是测试工程师不管是在面试&#xff0…

大数据毕业设计选题推荐-智慧小区大数据平台-Hadoop-Spark-Hive

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

gitlab数据备份和恢复

gitlab数据备份 sudo gitlab-rake gitlab:backup:create备份文件默认存放在/var/opt/gitlab/backups路径下, 生成1697101003_2023_10_12_12.0.3-ee_gitlab_backup.tar 文件 gitlab数据恢复 sudo gitlab-rake gitlab:backup:restore BACKUP1697101003_2023_10_12_…