当前位置: 首页 > news >正文

Nginx+Tomcat实现负载均衡、动静分离集群部署

文章目录

  • 一、Nginx​​实现负载均衡原理
    • 1.正向代理和反向代理
    • 2.负载均衡模式
      • 1. 轮询(Round Robin):
      • 2. 最少连接数(Least Connections):
      • 3. IP 哈希(IP Hash):
      • 4. 加权轮询(Weighted Round Robin):
      • 5. 最少时间算法(Least Time):
      • 6. 一致性哈希(Consistent Hashing):
  • 二、Nginx+Tomcat负载均衡、动静分离实验
    • 1.实验占用内存,内存最好4G以上
    • 2.关闭所有实验机器的防火墙
    • 3.配置nginx服务器
      • 3.1安装所需开发包和编译环境、编译器
      • 3.2创建程序用户,便于准确控制访问
      • 3.3编译安装nginx
    • 4.部署2台Tomcat 应用服务器
    • 3.动静分离配置
    • 4.Nginx server 配置
  • 三、Nginx四层代理配置

一、Nginx​​实现负载均衡原理

Nginx实现负载均衡是通过反向代理实现
在这里插入图片描述
Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。​​

​​但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。​​

​​据我们所知,Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器,然后通过Nginx配置权重来进行挑选Tomcat服务器去进行处理,负载均衡的一种策略

Nginx配置反向代理的主要参数

upstream 服务池名 { }配置后端服务器池,以提供响应数据proxy_pass http://服务池名配置将访问请求转发给后端服务器池的服务器处理

1.正向代理和反向代理

① 正向代理
正向代理 : 代理的是客户端 去访问 服务器 加快访问速度
② 反向代理
反向代理: 代理的是服务端 负载均衡

2.负载均衡模式

1. 轮询(Round Robin):

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

数据流向:每个请求依次被分配到下一个服务器。假设有三台服务器(Server A、Server B、Server C),第一个请求被分配到 Server A,第二个请求分配到 Server B,第三个请求分配到 Server C,第四个请求又回到 Server A,依此类推。
特点:请求均匀分布,无视服务器的当前负载和响应时间。

配置示例:

upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}

2. 最少连接数(Least Connections):

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

数据流向:每个请求被分配到当前连接数最少的服务器。例如,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 Hash):

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. 加权轮询(Weighted Round Robin):

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

数据流向:根据服务器设置的权重值分配请求。假设 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. 最少时间算法(Least Time):

最少时间算法基于请求的响应时间,将请求分配给响应时间最短的服务器。这种算法在 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. 一致性哈希(Consistent Hashing):

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

数据流向:根据请求的某个特定参数(如 URL、Cookie 或其他 Header),进行哈希计算,将请求分配到哈希值对应的服务器。假设 Server A 和 Server B,参数 “foo” 的哈希值指向 Server A,参数 “bar” 的哈希值指向 Server B,则 “foo” 请求总是流向 Server A,“bar” 请求总是流向 Server B。
特点:适应服务器节点变动,减少请求的重新分配,适合缓存敏感的场景。

配置示例(需要第三方模块如 ngx_http_upstream_hash_module):

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

二、Nginx+Tomcat负载均衡、动静分离实验

Nginx 服务器:192.168.44.10:8080
Tomcat服务器1:192.168.44.30:8080
Tomcat服务器2:192.168.44.40:8080

1.实验占用内存,内存最好4G以上

在这里插入图片描述

2.关闭所有实验机器的防火墙

systemctl stop firewalld
setenforce 0

在这里插入图片描述

3.配置nginx服务器

3.1安装所需开发包和编译环境、编译器

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

3.2创建程序用户,便于准确控制访问

useradd -M -s /sbin/nologin nginx

3.3编译安装nginx

cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/./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  --with-http_ssl_modulemake && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/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
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.targetchmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service------------------------------------------------------------------------------------------------------
./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层调度

在这里插入图片描述

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

systemctl stop firewalld
setenforce 0tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/vim /etc/profile
export 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:$PATHsource /etc/profiletar zxvf apache-tomcat-8.5.16.tar.gzmv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.shnetstat -ntap | grep 8080

在这里插入图片描述

3.动静分离配置

Tomcat server 配置

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>cd /usr/local/tomcat/conf/
cp server.xml{,_bak}
vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"></Context>
</Host>/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

在这里插入图片描述

4.Nginx server 配置

echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
#放入图片
cd /usr/local/nginx/html/imgvim /usr/local/nginx/conf/nginx.confhttp {
......#gzip on;#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大upstream tomcat_server {server 192.168.44.30:8080 weight=1;server 192.168.44.40:8080 weight=1;}server {listen 80;server_name www.kgc.com;charset utf-8;#access_log logs/host.access.log main;#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理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;}#配置Nginx处理静态图片请求location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;expires 10d;}location / {root html;index index.html index.htm;}
......}
......
}nginx -s reload       #不关闭服务器的情况下,重新加载配置文件-------------------------------------------------------------------------------------------------------------------
proxy_pass http://tomcat_server;
##它告诉 Nginx 将该位置匹配到的请求转发到指定的后端服务器proxy_set_header X-Real-IP $remote_addr;
##将原始请求中的客户端IP地址存储在X-Real-IP请求头中,然后将这个请求头发送到后端服务器。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
##将原始请求中的客户端 IP 地址添加到 X-Forwarded-For 请求头中,并将这个请求头发送到后端服务器。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、Nginx四层代理配置

Nginx 四层代理配置

./configure --with-stream和http同等级:所以一般只在http上面一段设置,
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 {
......}nginx -s reload

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 无人机随车飞行技术详解
  • 矩阵快速幂优化状态机dp,LeetCode 552. 学生出勤记录 II
  • redis学习笔记——redis中的常见数据类型以及相关命令
  • Java基础——IService.class 中查询数据方法list() 源码剖析及使用
  • 《区块链与监管合规:在创新与规范之间寻求平衡》
  • 基于ssm+vue+uniapp的二手物品交易平台小程序
  • Linux安装MQTT 服务器(图文教程)
  • Swift 基本语法
  • 【算法】dfs转dp的通用方式
  • Python 办公自动化 处理 Excel 数据 【1】推荐
  • 设计模式实战:即时通讯应用的设计与实现
  • 主成分分析SPSS步骤+Matlab程序
  • OLAP引擎之Druid
  • 洛谷 CF295D Greg and Caves
  • Java数组的应用场景
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Docker入门(二) - Dockerfile
  • fetch 从初识到应用
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java|序列化异常StreamCorruptedException的解决方法
  • Koa2 之文件上传下载
  • Laravel 菜鸟晋级之路
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpringBoot 实战 (三) | 配置文件详解
  • Vue 动态创建 component
  • 基于游标的分页接口实现
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 解析带emoji和链接的聊天系统消息
  • nb
  • 【干货分享】dos命令大全
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Note)C++中的继承方式
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (SERIES12)DM性能优化
  • (二十六)Java 数据结构
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (十八)三元表达式和列表解析
  • (十一)图像的罗伯特梯度锐化
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转) ns2/nam与nam实现相关的文件
  • (转载)(官方)UE4--图像编程----着色器开发
  • ****三次握手和四次挥手
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net 7 上传文件踩坑
  • .net mvc 获取url中controller和action
  • .NET 快速重构概要1
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET和.COM和.CN域名区别
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • /*在DataTable中更新、删除数据*/
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @NotNull、@NotEmpty 和 @NotBlank 区别