Bootstrap

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

目录

一、Tomcat简介

二、nginx简介

2.1 nginx概述

2.2 正向代理和反向代理

2.3 负载均衡模式

1、轮询(Round Robin)

2、最少连接数(Least Connections)

3、IP 哈希(IP Hash)

4、加权轮询(Weighted Round Robin)

5、最少时间算法(Least Time)

6、一致性哈希(Consistent Hashing)

三、规划部署负载均衡和反向代理(动静分离)

3.1 Nginx配置动静分离实验主要参数

3.2 Nginx动静分离实现原理

3.3 Nginx静态处理优势(为什么要动静分离)

3.4 生产环境实操


一、Tomcat简介

Tomcat 概述

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

Tomcat 重要目录

目录名

作用

bin存放启动和关闭Tomcat的脚本
conf存放Tomcat 不同的配置文件
doc存放Tomcat文档
lib存放Tomcat 运行需要的jar包(库文件)
logs存放Tomcat运行过程中产生的日志文件
src存放Tomcat的源代码
webappsTomcat的主要web发布目录
work存放jsp编译后产生的class文件

二、nginx简介

2.1 nginx概述

Nginx是一款非常优秀的HTTP服务器软件

  • 支持高达50 000个并发连接数的响应
  • 拥有强大的静态资源处理能力
  • 运行稳定
  • 内存、CPU等系统资源消耗非常低
  • 目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力

2.2 正向代理和反向代理

正向代理

正向代理,指的是通过代理服务器 代理浏览器/客户端去重定向请求访问到目标服务器 的一种代理服务。
正向代理服务的特点是代理服务器 代理的对象是浏览器/客户端,也就是对于目标服务器 来说浏览器/客户端是隐藏的

反向代理

应用场景:动态资源

反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问代理服务器 ,代理服务器再通过反向代理 +负载均衡实现请求分发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器 代理的对象是应用服务器,也就是对浏览器/客户端 来说应用服务器是隐藏的

2.3 负载均衡模式

应用场景:高并发

Nginx支持常见的分流算法

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;
}

三、规划部署负载均衡和反向代理(动静分离)

3.1 Nginx配置动静分离实验主要参数

  • upstream服务池名{}:(负载均衡)配置后端服务器池,以提供响应数据
  • proxy_pass http:/服务池名,:(反向代理)配置将访问请求转发给后端服务器池的服务器处理

3.2 Nginx动静分离实现原理

服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源由Nginx提供服务,动态资源Nginx转发至后端

3.3 Nginx静态处理优势(为什么要动静分离)

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

3.4 生产环境实操

实验设计

1、部署三台服务器

  • Nginx 服务器:192.17.20.100
  • Tomcat 服务器1:192.17.20.101
  • Tomcat 服务器2:192.17.20.102:8080 192.17.20.102:8081

2、Tomcat服务器搭建两个内容不同的网站

3、Nginx服务器上安装Nginx,反向代理两个Tomcat站点,并实现负载均衡

注:关闭防火墙和增强功能

实验部署:

1、部署Nginx负载均衡器(192.17.20.100)

systemctl stop firewalld
setenforce 0

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

useradd -M -s /sbin/nologin 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 \					#启用 gzip静态压缩
--with-http_flv_module \							#启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module								#启用 SSL模块,提供SSL加密功能
--with-stream

make && 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.target

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

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

#停止防火墙并禁用 SELinux
systemctl stop firewalld
setenforce 0

#安装 JDK
tar 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:$PATH

#加载环境变量
source /etc/profile

#安装并启动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、动静分离配置

①tomcat1 服务器配置

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>
</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 

②tomcat2 服务器配置

创建JSP页面:

mkdir /usr/local/tomcat/tomcat1/webapps/test
 
vim /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 

③Nginx服务器配置

准备静态页面和静态页面

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

修改Nginx配置文件

vim /usr/local/nginx/conf/nginx.conf
 
http {
    ...
    upstream tomcat_server {
        server 172.16.88.22:8080 weight=1;
        server 172.16.88.33:8080 weight=1;
        server 172.16.88.44: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;
        }
    }
    ...
}

④测试

测试静态页面效果:

  • 浏览器访问:192.17.20.100

  • 浏览器访问:192.17.20.100/index.jsp

测试负载均衡效果:

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;