Nginx+Tomcat(负载均衡、动静分离)

news/2024/9/19 0:40:11/ 标签: tomcat, nginx

目录

一、Nginx概述

1.Nginx应用

二、正向代理和反向代理

1.正向代理

1.1主要作用 

1.2工作原理 

2.反向代理 

2.1主要作用 

2.2工作原理

三、负载均衡模式

1.轮询

2.最少连接数

3.IP 哈希

4.加权轮询

5.最少时间算法

6.一致性哈希

四、规划部署负载均衡和反向代理

1.部署Nginx负载均衡器

1.1安装所需的依赖包

1.2创建Nginx用户

1.3下载并解压Nginx源码

1.4创建软链接

1.5创建Nginx服务文件

1.6设置权限并启动Nginx

2.部署2台Tomcat应用服务器

2.1安装JDK 

2.2配置环境变量

2.3安装并启动Tomcat

3.动静分离配置

3.1Tomcat1服务器配置

3.2Tomcat2服务器配置

4.Nginx服务器配置 

1.准备静态页面和静态图片

2.修改Nginx配置文件

3.测试 


一、Nginx概述

1.Nginx应用

Nginx是一款非常优秀的HTTP服务器软件,广泛应用于大型网站的后端,它支持高达50000 个并发连接,并拥有强大的静态资源处理能力

Nginx的运行非常稳定,系统资源(如内存和 CPU)的消耗也非常低。因此,许多大型网站选择 Nginx 作为反向代理服务器和负载均衡器,以提升整个站点的负载并发能力

二、正向代理和反向代理

1.正向代理

正向代理:

是指代理服务器替客户端访问目标服务器,以加快访问速度或突破访问限制。客户端可以访问代理服务器,而代理服务器再去访问目标服务器,并将返回数据传递给客户端。目标服务器只知道请求来自代理服务器,但不清楚实际客户端的地址,因此正向代理可以隐藏客户端的信息

正向代理的工作原理类似于“跳板”:当用户无法直接访问某个网站时,用户可以先连接到能够访问该网站的代理服务器,由代理服务器代为获取网站内容,再将内容返回给用户。目标网站只能记录代理服务器的访问,而不一定知道是用户的请求,这取决于代理服务器是否向网站透露用户信息

1.1主要作用 

1.隐私保护
隐藏用户 IP 地址:正向代理可以隐藏客户端的真实 IP 地址,对目标服务器只暴露代理服务
器的 IP 地址,从而保护用户的隐私
2.绕过地理限制

访问受限内容:正向代理可以帮助用户访问被地理位置限制或被网络过滤器屏蔽的网站和服
务。例如,用户可以通过代理服务器访问在其所在国家或地区被禁止的网站
3.内容过滤和监控
访问控制:企业或机构可以通过正向代理实施访问控制,限制员工访问特定网站或内容,或
监控用户的上网行为
4.缓存和加速
减少延迟和带宽消耗:正向代理可以缓存请求的内容,减少对原始服务器的重复请求,从而
提高访问速度和减少带宽消耗
5.网络安全
安全隔离:通过将客户端请求通过代理服务器转发,可以减少直接暴露到目标服务器的风
险,提高网络安全性
6.数据压缩和优化
减小数据量:正向代理可以对传输的数据进行压缩,减少数据传输量,从而提高网络效率
7.绕过审查和防火墙
突破网络限制:在一些网络受限的环境中,如学校或工作场所的防火墙,通过正向代理可以
访问被封锁的资源或服务

1.2工作原理 

1.客户端请求
客户端(如浏览器)发出请求,目标是访问互联网资源(例如一个网站)
2.请求发送到正向代理
客户端将请求发送到正向代理服务器,而不是直接发送到目标服务器。此时,客户端的请求
头中会包含代理服务器的地址,而目标服务器并不会直接接收到请求
3.正向代理处理请求
正向代理服务器接收到请求后,会处理请求的相关信息,包括解析目标URL、处理请求头等
4.请求转发到目标服务器
正向代理将请求转发到目标服务器。这时,目标服务器只会看到正向代理服务器的IP地址而无法看到客户端的真实 IP 地址
5.目标服务器响应
目标服务器处理请求,并生成响应数据,然后将响应发送回正向代理服务器
6.响应转发到客户端
正向代理服务器收到来自目标服务器的响应数据,并将其转发给原始的客户端
7.客户端接收响应
客户端从正向代理服务器接收响应数据,并对其进行处理和显示

2.反向代理 

反向代理:

则是代理服务器替服务器端处理客户端请求,通常用于负载均衡。反向代理屏蔽了后端服务器的信息,常用于多台服务器的分布式部署。对于访问量大的网站,反向代理服务器可以根据一定规则将客户端的请求分发到不同的后端服务器,客户端无需知道具体是哪台服务器处理了请求

2.1主要作用 

1.负载均衡
分配请求:反向代理可以将客户端的请求分发到多个后端服务器,从而实现负载均衡。这样
可以提高系统的处理能力和响应速度,避免单一服务器的过载
2.缓存加速
提高性能:反向代理可以缓存常见的响应内容,减少对后端服务器的重复请求,从而提高访
问速度和降低带宽消耗
3. SSL/TLS 终端
处理加密:反向代理可以处理 SSL/TLS 加密和解密(即 HTTPS 终端),将加密处理从后端服务器中剥离,提高后端服务器的性能和安全性
4.安全性增强
隐藏内部结构:反向代理可以隐藏后端服务器的真实 IP 地址和架构,对外只暴露代理服务器
的 IP 地址,从而提高系统的安全性
5.集中管理和监控
统一入口:通过反向代理,可以集中管理和监控所有流量,提供统一的访问日志和流量统
计,简化运维和监控工作
6.内容重写和路由
动态路由:反向代理可以根据请求的 URL、主机名或其他请求信息,动态地将请求路由到不
同的后端服务器或应用,从而支持复杂的应用场景和需求
7.应用层防火墙
增强防护:反向代理可以充当应用层防火墙,过滤恶意请求和攻击,提供额外的安全防护层
8.跨域支持
解决跨域问题:在某些情况下,反向代理可以帮助解决跨域请求问题,使得不同域名的资源
能够在同一个应用中进行交互

2.2工作原理

1.客户端请求发送到反向代理服务器
客户端向某个域名或IP 地址发送请求(例如`www.example.com'),这个地址指向反向代理服务器,而不是实际的后端服务器
2.反向代理服务器接收请求
反向代理服务器接收到客户端的请求,解析该请求,确定需要转发给哪个后端服务器。此
时,客户端并不知道实际的后端服务器的地址
3.反向代理转发请求至后端服务器
反向代理服务器根据配置,将请求转发到适当的后端服务器进行处理。它可以根据不同的策
略(如负载均衡、内容路由等)选择合适的后端服务器
4.后端服务器处理请求并生成响应
后端服务器接收到从反向代理转发的请求后,处理该请求,并生成响应(例如,返回 HTML
页面、API数据等)
5.反向代理接收后端服务器的响应
反向代理服务器接收到后端服务器的响应后,它可以选择缓存这些响应以提高后续的请求速
度,或者对响应内容进行处理(如数据压缩、内容修改等)
6.反向代理将响应返回给客户端
反向代理服务器将处理后的响应返回给客户端。客户端感知到的服务器就是反向代理服务
器,而不是实际处理请求的后端服务器

三、负载均衡模式

1.轮询

轮询算法:

是 Nginx 的默认分流算法。它按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配了流量

数据流向:

每个请求依次被分配到下一个服务器。假设有三台服务器(ServerA、ServerB、ServerC)第一个请求被分配到 Server A,第二个请求分配到 Server B,第三个请求分配到 Server C,第四个请求又回到 Server A,依此类推
特点:

请求均匀分布,无视服务器的当前负载和响应时间

配置示例upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

2.最少连接数

最少连接数算法:

将请求分配给当前活动连接数最少的服务器。这种算法适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载

数据流向:

每个请求被分配到当前连接数最少的服务器。例如,Server A 有 2 个连接,Server B 有 5 个连接,新的请求会被分配到 Server A
特点:

动态均衡负载,适用于请求处理时间不一的场景

配置示例upstream backend {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

3.IP 哈希

IP 哈希算法:

通过计算客户端 IP 地址的哈希值,将请求始终分配给同一台服务器。适用于需要将特定客户端的请求固定在同一台服务器上的场景

数据流向:

每个客户端的 IP 地址被哈希计算,然后根据哈希值将请求固定分配到某一台服务器。假设客户端 X 的哈希值指向 Server A,客户端 Y 的哈希值指向 Server B,则无论多少次请求,X 的请求总是流向 Server A,Y 的请求总是流向 Server B
特点:

同一个客户端总是被分配到同一台服务器,有助于会话保持

配置示例upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

4.加权轮询

加权轮询算法:

允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求。适用于服务器性能不均衡的情况

数据流向:

根据服务器设置的权重值分配请求。假设 Server A 权重为 3,Server B 权重为 1,则 4 个请求中,3 个会被分配到 Server A,1 个会被分配到 Server B
特点:

高权重服务器接收更多的请求,适用于服务器性能差异较大的场景

配置示例upstream backend {server backend1.example.com weight=3;server backend2.example.com weight=1;server backend3.example.com weight=2;
}

5.最少时间算法

最少时间算法:

基于请求的响应时间,将请求分配给响应时间最短的服务器。这种算法适用于需要最大化响应速度的场景,在 Nginx 1.15.3 及以后版本中可用

数据流向:

每个请求分配到响应时间最短或平均连接时间最短的服务器。假设 Server A 的响应时间较快,Server B 较慢,则新的请求更可能流向 Server A
特点:

进一步优化了最少连接算法,适用于高负载环境下的动态负载均衡

配置示例upstream backend {least_time header;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

6.一致性哈希

一致性哈希算法:

可以保证当集群中某台服务器故障时,只有部分请求会重新分配到其他服务器,而不是全部重新分配。这在缓存等场景中非常有用

数据流向:

根据请求的某个特定参数(如 URL、Cookie 或其他 Header),进行哈希计算,将请求分配到哈希值对应的服务器。假设 Server A 和 Server B,参数 "foo" 的哈希值指向 Server A,参数 "bar" 的哈希值指向 Server B,则 "foo" 请求总是流向 Server A,"bar" 请求总是流向 Server B
特点:

适应服务器节点变动,减少请求的重新分配,适合缓存敏感的场景

配置示例upstream backend {hash $request_uri consistent;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

四、规划部署负载均衡和反向代理

1.部署Nginx负载均衡器

关闭防火墙和临时防护systemctl stop firewalld
setenforce 0

1.1安装所需的依赖包

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

1.2创建Nginx用户

useradd -M -s /sbin/nologin nginxtail -2 /etc/passwd

1.3下载并解压Nginx源码

解压
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/编译安装
cd nginx-1.20.2/./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-http_ssl_module \--with-streammake && make install

1.4创建软链接

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

1.5创建Nginx服务文件

vim /lib/systemd/system/nginx.service[Unit]
Description=nginx
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
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

1.6设置权限并启动Nginx

chmod 777 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

2.部署2台Tomcat应用服务器

停止防火墙并禁用SELinuxsystemctl stop firewalld
setenforce 0

2.1安装JDK 

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

2.2配置环境变量

vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH加载环境变量
source /etc/profile

2.3安装并启动Tomcat

tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh检查端口
netstat -ntap | grep 8080

3.动静分离配置

3.1Tomcat1服务器配置

创建JSP页面
mkdir /usr/local/tomcat/webapps/testvim /usr/local/tomcat/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>修改server.xml
vim /usr/local/tomcat/conf/server.xml<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
</Host>重启Tomcat服务
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

3.2Tomcat2服务器配置

创建JSP页面
mkdir /usr/local/tomcat/tomcat1/webapps/testvim /usr/local/tomcat/tomcat1/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>修改server.xml
vim /usr/local/tomcat/tomcat1/conf/server.xml<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>重启Tomcat服务
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

4.Nginx服务器配置 

1.准备静态页面和静态图片

echo '<html><body><h1>汪铭是帅哥</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img

2.修改Nginx配置文件

vim /usr/local/nginx/conf/nginx.confhttp {...upstream tomcat_server {server 172.16.58.10:8080 weight=1;server 172.16.58.20:8080 weight=1;server 172.16.58.30:8080 weight=1;}server {listen 80;server_name www.kgc.com;charset utf-8;location ~ .*\.jsp$ {proxy_pass http://tomcat_server;proxy_set_header HOST $host;   proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;expires 10d;}location / {root html;index index.html index.htm;}}...
}

3.测试 

测试静态页面

浏览器访问:http://172.16.58.40

浏览器访问:http://172.16.58.40/game.jpg

测试负载均衡效果

浏览器访问:http://172.16.58.40/index.jsp


http://www.ppmy.cn/news/1525939.html

相关文章

HarmonyOS学习(十二)——数据管理(一)分布式数据

文章目录 1、分布式数据服务概述2、KV数据模型&#xff08;键值对数据库&#xff09;3、分布式数据服务的约束和限制4、接口说明5、分布式数据服务开发步骤5.1、导入模块5.2、构造分布式数据库管理类实例5.3、获取、创建分布式数据库5.4、订阅分布式数据库的数据变化5.5、插入数…

canal.adapter同步 ES 索引创建 大概配置详情

canal.adapter同步 ES 索引创建 大概配置详情 PUT /test {"settings": {"number_of_shards": 1,"number_of_replicas": 0,"analysis": {"analyzer": {"htmlStripAnalyzer": {"filter": ["lower…

LabVIEW多语言支持优化

遇到的LabVIEW多语言支持问题&#xff0c;特别是德文显示乱码以及系统区域设置导致的异常&#xff0c;可能是由编码问题或区域设置不匹配引起的。以下是一些可能的原因及解决方案&#xff1a; 问题原因&#xff1a; 编码问题&#xff1a;LabVIEW内部使用UTF-8编码&#xff0c;但…

【鸿蒙开发 day12】

鸿蒙开发-布局进阶 一.定位1.绝对定位2.相对定位3.定位案例-VIP 二.Z序控制三.层叠布局四.bilibili卡片案例五.list列表容器组件滚动条状态列表分割线 六.通用属性七.动画八.图形变换1.平移2.定位结合平移实现精准定位3.旋转和缩放 九.总结 一.定位 作用&#xff1a;改变组件位…

机器学习-------数据标准化

什么是归一化&#xff0c;它与标准化的区别是什么&#xff1f; 一 作用 在做训练时&#xff0c;需要先将特征值与标签标准化&#xff0c;可以防止梯度防炸和过拟合&#xff1b; 将标签标准化后&#xff0c;网络预测出的数据是符合标准正态分布的—StandarScaler()&#xff0c…

setImmediate() vs setTimeout() 在 JavaScript 中的区别

setImmediate() vs setTimeout() 在 JavaScript 中的区别 在 JavaScript 中&#xff0c;setImmediate() 和 setTimeout() 都用于调度任务&#xff0c;但它们的工作方式不同。 JavaScript 的异步特性 JavaScript 以其非阻塞、异步行为而闻名&#xff0c;尤其是在 Node.js 环境…

[000-002-01].第03节:Linux系统下Oracle的安装与使用

2.1.Docker安装Oracle 在CentOS7中使用Docker安装Oracle&#xff1a; 1.安装Docker,详细请参考&#xff1a;https://blog.csdn.net/weixin_43783284/article/details/1211403682.拉取镜像&#xff1a; docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g3.下载…

用Blender来烘培模型材质

通常我们在做三维设计&#xff0c;游戏开发的时候&#xff0c;经常需要从网上下载一些3D模型&#xff0c;这些模型采用的材质分辨率通常都不一样&#xff0c;而我们从性能考虑&#xff0c;需要对材质进行统一的处理&#xff0c;例如把材质都统一为2K的分辨率。 我们可以在Blen…

105页PPT:华为ISC集成供应链变革、模式与方法解析

105页PPT:华为ISC变革、模式与方法PPT,下载链接见文末~ 华为ISC&#xff08;Integrated Supply Chain&#xff0c;集成供应链&#xff09;规划管理与变革是华为公司战略转型和提升核心竞争力的关键举措之一。通过多年的努力与实践&#xff0c;华为已经成功构建了一个高效、协同…

怎么把网站设置成HTTPS访问?

有很多的网站尤其是公司网站都是可以HTTPS访问的&#xff0c;而且在地址栏前面还会显示安全锁&#xff0c;这就是HTTPS证书所起到的作用。没有安装HTTPS证书的网站强制用HTTPS访问会被浏览器提醒不安全。那么我们怎么解决这个问题呢&#xff1f; 解决办法 一&#xff1a;首先…

Unity的Button组件进行扩展

废话不多说,在Untiy中,如果想要对Button等组件进行扩展的话,那么不仅仅只需要将新增的属性设置为public或者增加SerializeField字段就行了的,同时需要对Inspector的GUI面板进行修改,以下直接展示代码: using UnityEngine; using UnityEngine.EventSystems; using UnityE…

17、电科院FTU检测标准学习笔记-录波性能

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 ———————————————————…

Qt 菜单、工具栏 的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupU…

【AcWing】快速排序的Go实现

快速排序的Go实现 这一部分参考了AcWing当中使用Go语言实现快速排序的题解&#xff1a;https://www.acwing.com/activity/content/code/content/296206/。 其中有很多部分非常值得参考&#xff0c;故写一个博客进行记录。 Code package mainimport "fmt"func qui…

后端开发刷题 | 矩阵的最小路径和

描述 给定一个 n * m 的矩阵 a&#xff0c;从左上角开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;输出所有的路径中最小的路径和。 数据范围: 1≤n,m≤500&#xff0c;矩阵中任意值都满足 0≤ai,j…

基于VUE的在线音乐播放管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于VUE的在线音乐播放管理系统3是前后端分离项目&#xff0c;拥有两种角色 管理员&#xff1a;用户管理、收藏管理、歌手管理、歌曲管理、歌单管理、评论管理等 用户&#xff1a;登录注…

DFS 算法:洛谷B3625迷宫寻路

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…

rust解说

Rust 是一种开源的系统编程语言&#xff0c;由 Mozilla 研究院开发&#xff0c;旨在提供高性能、内存安全且并发性良好的编程体验。 Rust 于 2010 年由 Graydon Hoare 开始设计&#xff0c;并在 2015 年发布了第一个稳定版本。 Rust 的设计目标是解决 C 等传统系统编程语言在…

Java LinkedList 总结

1.特点 LinkedList的内部实现类似于链表&#xff0c;所以使用方法也和链表类似。 2.常用方法 LinkedList list new LinkedList();//创建//插入数据 list.add("jojo");//在尾部插入 list.add(1,"jojo");//在指定位置插入list.addFirst("jojo"…

Docker:对已有的容器,对当前容器映射的端口实时 (增删改查)

首先我的docker已经起了一个容器&#xff0c;我突然想把他的80->80映射的端口改成80->8080 但是我不想去新启动容器&#xff0c;想在现有容器基础上去修改&#xff0c;或者我想删除某个端口映射&#xff08;只是大概思路&#xff09; 如何寻找容器配置文件位置 首先我这…