0


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

一、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

测试负载均衡效果:


本文转载自: https://blog.csdn.net/qq_63994746/article/details/141326431
版权归原作者 码农鑫哥的日常 所有, 如有侵权,请联系我们删除。

“Nginx+Tomcat负载均衡、动静分离”的评论:

还没有评论