Ngunx + Tomcat 负载均衡和动态分离

目录

一、tomcat简介

二、Nginx 负载均衡

1. Nginx 应用

2. Nginx 负载均衡实现原理

2.1 正向代理

2.2 反向代理

2.3 具体过程接收请求:Nginx作为反向代理服务器,接收客户端的请求。选择后端服务器:根据预先配置的负载均衡算法,Nginx选择一个后端服务器来处理请求。转发请求:Nginx将接收到的请求转发给选定的后端服务器。返回响应:后端服务器处理请求并生成响应,将响应发送回Nginx。返回客户端:Nginx将接收到的响应返回给客户端。      

 2.4 负载均衡原理

2.5 配置方向代理的主要参数

2.6 Nginx 代理转发类型

3. Nginx 负载均衡模式

三、Nginx 动静分离

1、nginx动静分离原理 

2、静态处理优势

3、吞吐量

4、并发量

四、案例


一、tomcat简介

在现代 Web 服务架构中,Tomcat 和 Nginx 是两个至关重要的组件,负责处理用户请求并实现高性能的服务。本篇博客将深入探讨这些技术的原理和部署配置方法。

最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发。
安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件。

二、Nginx 负载均衡

1. Nginx 应用

  Nginx是一款非常优秀的HTTP服务器软件。Nginx支持高达50000个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低。

  目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力。

2. Nginx 负载均衡实现原理

2.1 正向代理

首先我们需要明确,我们作为用户是从客户端去访问服务端,因此从客户端-→服务端可以简单的认为是正向。换句话说正向代理时,我们往往明确的知道我们需要访问哪个服务端,比如我想访问google,但是由于某种原因,我无法直接访问它,因此我需要一个能访问呢google的代理服务器去帮我完成这个通信,通过一系列代理服务器的配置,当我输入google的网站时,代理服务器接收请求并转交给目标服务端即google,最终返回内容给我客户端。至此完成了一个简单的正向代理,通过上文我们可以发现,服务端仅仅只与代理服务器产生了通信,因此服务端并不知道该请求来自于哪个客户端,它知道是从代理服务器而来,因此正向代理的最大特点即:其屏蔽或者隐藏了真实客户端的信息,即保护了客户端。

2.2 反向代理

弄清了正向代理,其实反向代理也很清晰了,不就是一个逆向思维嘛,即保护了服务端。反向代理往往应用于分布式环境下,例如我们的淘宝,为了解决高流星带来的服务器压力,单台服务器往往不能够解决问题,此时则需要搭建一个集群环境,并且其也拥有一个反向代理服务器,当大量的客户端请求淘宝时,往往请求并不会直接到服务端,而是先到代理服务器,由代理服务器进行反向代理,采用负载均衡9策略将请求分法给各台服务器,保证资源的充分利用。这就是反向代理最大的用处,我们是否也能发现,从某种意义上来说,反向代理屏蔽或者隐藏了服务器的信息,相对于单一服务端,采用了反向代理之后我们只知道访问了淘宝,却不知道访问了其具体的哪台服务器

2.3 具体过程
接收请求:Nginx作为反向代理服务器,接收客户端的请求。
选择后端服务器:根据预先配置的负载均衡算法,Nginx选择一个后端服务器来处理请求。
转发请求:Nginx将接收到的请求转发给选定的后端服务器。
返回响应:后端服务器处理请求并生成响应,将响应发送回Nginx。
返回客户端:Nginx将接收到的响应返回给客户端。      

当使用Nginx服务器作为前端时,可以配置Nginx来进行静态页面的处理,而将动态页面请求转发给后端的Tomcat服务器来处理。由于Tomcat是轻量级应用服务器,可能无法满足所有访问量,因此需要多台Tomcat服务器,并通过Nginx的配置权重来进行负载均衡,以确保请求能够被分发到不同的Tomcat服务器上

 2.4 负载均衡原理

客户端向反向代理发送请求,接着反向代理根据某种负载机制请求至目标服务器(这些服务器都运行着相同的应用),并把获取的内容返回给客户端,其中代理请求可能根据配置被发往不同的服务器。

2.5 配置方向代理的主要参数

配置后端服务器池,以提供响应数据

upstream 服务池名{}

配置将访问请求发送给后端服务器池的服务器处理

proxy_pass http://服务池名
2.6 Nginx 代理转发类型

4层代理

  使用NAT (Network Address Translation)技术,即网络地址转换。即请求进来的时候,nginx只修改数据包里面的目标IP、源IP、端口,然后就直接把数据包发给目标服务器(即nginx不知道请求的具体内容),目标服务器处理完成后,发给nginx,nginx数据包再做一次类似的修改,就返回给请求的客户端了。

四层代码配置:
 

stream {
    
    upstream appserver {
        server 192.168.80.100:8080 weight=1;
        server 192.168.80.101:8080 weight=1;
        server 192.168.80.101:8081 weight=1;
    }
    server {
        listen 8080;
        proxy_pass appserver;
    }
}
 
http {
......

7层代理

   nginx读取并解析Http请求内容,然后将具体内容(请求行、请求头、空行、请求数据)转发到相应的服务器,转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。

七层代码配置

3. Nginx 负载均衡模式

3.1 rr 轮询 负载均衡模式 (自带的)
每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。

3.2 least_conn 最少连接(自带的)
优先将客户端请求调度到当前连接最少的服务器。

3.3 weight 加权轮询(自带的)
weight代表权重的意思,用于指定轮询的几率,默认权重都是1,可以手动设置调整,权重越高,被分配的次数越多,weight权重和访问比例是成正比的,用于解决后端服务器性能不均衡时,调整访问比例。

3.4 ip_hash (自带的)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。

3.5 url_hash(第三方)
基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。

3.6 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

三、Nginx 动静分离

1、nginx动静分离原理

客户端发送请求想要访问服务器端,首先会经过一个代理服务器(即包含Nginx服务的服务器),如果发送的请求中既有静态资源也有动态资源,其中的静态资源会有Nginx提供服务进行返回响应给客户端,动态资源则会由Nginx转发给后端(即包含Tomcat服务的服务器),然后由后端在进行返回响应给代理服务器,再由代理服务器返回响应给客户端。其本质就是是location规则的匹配

2、静态处理优势

Nginx处理静态页面的效率高于Tomcat的处理能力;
若Tomcat的请求为1000次,则Ntginx的请求两位6000次;
Tomcat每秒的吞吐量位0.6M,Nginx的每秒吞吐量位3.6,;
Nginx处理静态资源的能力是Tomcat处理的6倍。

3、吞吐量

 吞吐量可以理解成带宽流量,以每个请求0.5KB大小,并发每秒25万,0.5/1024MB*250000=122MB*8bit=977Mbps。

4、并发量

 以10分钟有5000万用户平均每人访问2次为例,并发量为每秒(5000w*2)/(60*10)=16.7万,再double下,就说每秒25万并发量

四、案例

1、搭建七层代理准备三台服务器Nginx作为负载均衡器,Tomcat作为应用服务器

nginx:20.0.0.100:80

tomcat1:20.0.0.101:80

tomcat2:20.0.0.102:8080          20.0.0.200:8081

初始化三台机器

###关闭firewalld
[root@localhost ~]# systemctl stop firewalld.service
###关闭防火墙开机自启
[root@localhost ~]# systemctl disable firewalld.service 
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
关闭selinux
[root@localhost ~]# setenforce 0

部署nginx  编译安装

[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
nginx-1.24.0.tar.gz  rh
[root@localhost opt]# tar xf nginx-1.24.0.tar.gz 
[root@localhost opt]# ls
nginx-1.24.0  nginx-1.24.0.tar.gz  rh
[root@localhost opt]# cd nginx-1.24.0/
[root@localhost nginx-1.24.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \									#启用文件修改支持
--with-http_stub_status_module \					#启用状态统计
--with-http_gzip_static_module \					#启用 gzip静态压缩
--with-http_flv_module \							#启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module								#启用 SSL模块,提供SSL加密功能
--with-stream										#启用 stream模块,提供4层调度
###编译安装
[root@localhost nginx-1.24.0]# make -j2 && make install
 
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream
 

添加nginx服务

###把nginx服务的可执行程序文件放入路径环境变量的目录中便于系统识别
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
###修改nginx服务的配置文件
[root@localhost nginx-1.24.0]# vim /lib/systemd/system/nginx.service
[Unit]                    					#服务的说明
Description=nginx         		 			#描述服务
After=network.target       					#依赖,当依赖的服务启动之后再启动自定义的服务
[Service]                           		#服务运行参数的设置
Type=forking                				#是后台运行的形式,使用此启动类型应同时指定  
PIDFile=/usr/local/nginx/logs/nginx.pid 	 #PID文件位置以便systemd能够跟踪服务的主进程
ExecStart=/usr/local/nginx/sbin/nginx  	 	#服务的具体运行命令
ExecReload=/bin/kill -s HUP $MAINPID  	 	#重启命令
ExecStop=/bin/kill -s QUIT $MAINPID     	#停止命令
PrivateTmp=true                     	 	#给服务分配独立的临时空间
[Install]                             		#服务安装的相关设置
WantedBy=multi-user.target           	 	#可设置为多用户
 
###给予文件权限
[root@localhost ~]# chmod 754 /lib/systemd/system/nginx.service
###启动nginx服务
[root@localhost ~]# systemctl start nginx.service
###开机自启nginx服务
[root@localhost ~]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

测试访问ip地址

tomcat1部署

安装jdk

[root@localhost opt]# cd /opt
###查询指定软件包的文件列表
[root@localhost opt]# rpm -qpl jdk-8u201-linux-x64.rpm 
###安装jdk
[root@localhost opt]# rpm -ivh jdk-8u201-linux-x64.rpm 
###查看jdk版本号
[root@localhost opt]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

然后配置jdk环境变量

vim /etc/profile

保存退出 然后 source /etc/profile

然后到根目录下 创建一个 XXX.java文件  我这里创建的是Hello.java文件

配置内容如图

保存退出

此时 jdk环境变量配置好了

安装tomcat

此时 到浏览器访问本地路径

 出现tomcat服务  就是安装启动好了

部署第二台tomcat  操作一样 但是端口号不能一样

[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
###22行,修改Server prot,默认为8005 -> 修改为8006
<Server port="8006" shutdown="SHUTDOWN">
 
###69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8081" protocol="HTTP/1.1"
 
###116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

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

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

相关文章

23种设计模式之享元模式

享元模式 1、定义 享元模式&#xff1a;运用共享技术有效的支持大量细粒度对象的复用 2、享元模式结构 Flyweight&#xff08;抽象享元类&#xff09;&#xff1a;通常是一个接口或抽象类&#xff0c;在抽象享元类中声明了具体享元类公共的方法&#xff0c;这些方法可以向外…

从多线程设计模式到对 CompletableFuture 的应用

大家好&#xff0c;我是 方圆。最近在开发 延保服务 频道页时&#xff0c;为了提高查询效率&#xff0c;使用到了多线程技术。为了对多线程方案设计有更加充分的了解&#xff0c;在业余时间读完了《图解 Java 多线程设计模式》这本书&#xff0c;觉得收获良多。本篇文章将介绍其…

几种经典查找算法

几种经典查找算法 顺序查找法二分查找法判定树 二叉查找树&#xff08;BST&#xff09;索引查找B-树B树散列表&#xff08;hash&#xff09;查找 顺序查找法 顺序查找的平均查找长度为&#xff1a; 时间复杂度为0&#xff08;n&#xff09;&#xff1b; 二分查找法 int bin…

CNN学习(7):用C++实现简单不同参数的卷积模型

目录 一、参数说明和计算公式 1、符号约定 2、输出大小计算公式 二、不同类型的卷积 1、输入3*3*1&#xff0c;卷积核3*3*1&#xff0c;输出1*1*1 &#xff08;1&#xff09;实现代码 &#xff08;2&#xff09;代码说明 2、输入4*4*1&#xff0c;卷积核3*3*1&#xff…

环保评A的意义与价值

环保评A&#xff0c;这个看似简单的称谓&#xff0c;背后却蕴藏着深厚的环保理念和实践标准。在当今社会&#xff0c;环保已经成为一项全球性的议题&#xff0c;各国都在努力推动绿色发展&#xff0c;实现可持续发展目标。那么&#xff0c;环保评A究竟是全国性的认证还是地方性…

Java SSTI服务端模版注入漏洞原理与利用

文章目录 前言Velocity基础语法基础示例命令执行 靶场实践漏洞代码漏洞验证检测工具 FreeMarker基础示例漏洞示例CMS案例 Thymeleaf基础示例漏洞示例安全方案 总结 前言 SSTI&#xff08;Server Side Template Injection&#xff09;全称服务端模板注入漏洞&#xff0c;在 Jav…

开放式耳机值得入手买吗?可以对比这几款开放式耳机看看

居家办公时&#xff0c;选择一款合适的耳机能够有效地提高工作效率。入耳式耳机虽然能够有效地隔绝外界噪音&#xff0c;但长时间佩戴会对耳朵造成负担&#xff0c;甚至引发耳道感染。而头戴式耳机虽然能够提供更好的音质&#xff0c;但体积较大&#xff0c;佩戴起来不够灵活。…

PyTorch -- Batch Normalization(BN) 快速实践

Batch Normalization 可以 改善梯度消失/爆炸问题&#xff1a;前面层的梯度经过多次传递后会变得非常小(大)&#xff0c;从而导致网络收敛速度慢(不收敛)&#xff0c;应用 BN 可缓解加速网络收敛&#xff1a;BN 使得每个神经元的输入分布更加稳定减少过拟合&#xff1a;BN 可减…

求导,积分

求导公式&#xff1a; 复合函数求导法则&#xff1a;两个函数导函数的乘积. 例如&#xff1a;f(x)2x1,f(x)2,g(x)x^24x4,g(x)2x4 那么复合函数&#xff1a; g(f(x))(2x1)^24(2x1)4 把&#xff08;2x1&#xff09;看做整体,则g2(2x1)4 然后再求&#xff08;2x1&#xff09;的导函…

LeetCode | 2879.显示前三行

在 pandas 中&#xff0c;可以使用 head() 方法来读取 DataFrame 的前几行数据。如果想读取指定数量的行&#xff0c;可以在 head() 方法中传入一个参数 n&#xff0c;读取前 n 行 import pandas as pddef selectFirstRows(employees: pd.DataFrame) -> pd.DataFrame:retur…

Dictionary 字典

文章目录 一、什么是字典1.1 字典的创建方式 一、什么是字典 字典&#xff1a; 用来存储数据&#xff0c;与列表和元组不一样的是&#xff0c;字典以键值对的形式对数据进行存储&#xff0c;也就是 key 和 value。相当于 Java 中的 Map。 注意&#xff1a; 1、 key 的值不可重…

C++进阶(一)

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 本篇博客是讲解函数的重载以及引用的知识点的。 文章目录 前言 1.函数重载 1.1何为函数重载 1.2函数重载的作用 1.3函数重载的实现 2.引用 2.1何为引用 2.2定义引用 2.3引用特性 2.4常引用 2…

认识一些分布函数-Frechet分布及其应用

1. 何为Frechet分布 Frechet分布也称为极值分布(EVD)类型II,用于对数据集中的最大值进行建模。它是四种常用极值分布之一。另外三种是古贝尔分布、威布尔分布和广义极值分布(Gumbel Distribution, the Weibull Distribution and the Generalized Extreme Value Distributi…

34 Debian如何配置ELK群集

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置ELK群集 《傅老师Debian知识库系列之34》——原创 ==前言== 傅老师Debian知识库特点: 1、拆解Debian实用技能; 2、所有操作在VMware虚拟机实测完成; 3、致力于最终形成Debian知识手…

LVS-DR模式详解:提升网站性能的最佳解决方案

LVS-DR模式原理 用户请求到达Director Server&#xff1a; 用户请求到达Director Server&#xff08;负载均衡服务器&#xff09;&#xff0c;数据包首先到达内核空间的PREROUTING链。数据包源IP&#xff1a;CIP&#xff0c;目标IP&#xff1a;VIP&#xff0c;源MAC&#xff1a…

【内存管理之C语言数组】

1.栈空间上的C数组 糟糕的可用性&#xff0c;但是你将在遗留代码中见到它们 相同类型的对象的内存块 大小必须是常量表达式 第一个元素索引为0 2.指针和C数组 更奇怪的是&#xff1a;数组标识符退化为指向第一个元素的指针 3.访问数组 4.堆空间上的C数组 相同类型的对象的内…

数据库开发——并发控制(第十一章)

文章目录 前言并发执行例题一、封锁二、封锁协议三、可串行调度四、总结 学习目标&#xff1a;重点为并发控制的基本概念及几个基本协议 前言 数据库管理系统必须提供并发控制机制&#xff0c;保证事务的隔离性和一致性 并发执行例题 一、封锁 排他锁称为写锁&#xff0c;共…

智能化状态管理:自动状态流转处理模块

目录 基本背景介绍 具体实现 基本数据准备 基本数据表 状态转换常量 状态转换注解 任务处理模版 各任务实现逻辑 开启比对任务进行处理 降噪字段处理任务处理 开启业务数据比对处理 业务数据比对处理 开始核对数据生成最终报告处理 核对数据生成最终报告处理 状…

小红书教程简化版,从0开始走向专业,小红书-主理人培养计划 (13节)

课程目录 1-小红书分析与拆解.mp4 2-小红书电商玩法.mp4 3-小红书基础信息设置10_1.mp4 4-小红书如何开店&#xff1f;.mp4 5-小红书店铺设置&#xff08;1&#xff09;.mp4 5-小红书店铺设置.mp4 6-小红书笔记制作与产品发布.mp4 7-小红书运营的文案与标题.mp4 8-小红…

Spring Boot 自定义Starter

自定义starter 创建pom项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…