当前位置: 首页 > 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;}
......}
......
}-------------------------------------------------------------------------------------------------------------------
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 {
......}
http://www.lryc.cn/news/427622.html

相关文章:

  • 英语学习8月19日
  • 关于windows环境使用nginx的一些性能问题
  • “解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“
  • 第10章 无持久存储的文件系统 (2)
  • 云计算实训29——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现
  • AI搜索引擎Perplexica的本地部署(之二)Perplexica的非docker安装
  • Oracle环境下在相同参数和数据源的情况,mybatis-plus查询和sql查询结果不一致
  • springboot静态资源访问问题归纳
  • HTML与CSS学习Day01
  • Tina-Linux Bootloaer简述
  • 【Python】 Scrapyd:Python Web Scraping 的强大分布式调度工具
  • 吴恩达机器学习课后题-01线性回归
  • 白盒报告-jacoco
  • 【MySQL】SQL语句执行流程
  • Selenium自动化防爬技巧:从入门到精通,保障爬虫稳定运行,通过多种方式和add_argument参数设置来达到破解防爬的目的
  • 从数据类型到变量、作用域、执行上下文
  • 一文读懂:AI时代到底需要什么样的网络?
  • 基于HarmonyOS的宠物收养系统的设计与实现(一)
  • 严格模式报错
  • nginx: [emerg] the “ssl“ parameter requires ngx_http_ssl_module in nginx.conf
  • Docker 部署loki日志 用于微服务
  • [Day 57] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • 06结构型设计模式——代理模式
  • 《深入浅出多模态》(九)多模态经典模型:MiniGPT-v2、MiniGPT5
  • 调试和优化大型深度学习模型 - 0 技术介绍
  • 华为S3700交换机配置VLAN的方法​
  • 学懂C++(三十八):深入详解C++网络编程:套接字(Socket)开发技术
  • SpringBoot-配置加载顺序
  • 第八周:机器学习笔记
  • 音乐怎么剪切掉一部分?5个方法,轻松学会音频分割!(2024全新)