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

目录

一、Tomcat简介

二、nginx简介

[2.1 nginx概述](#2.1 nginx概述)

[2.2 正向代理和反向代理](#2.2 正向代理和反向代理)

[2.3 负载均衡模式](#2.3 负载均衡模式)

[1、轮询(Round Robin)](#1、轮询(Round Robin))

[2、最少连接数(Least Connections)](#2、最少连接数(Least Connections))

[3、IP 哈希(IP Hash)](#3、IP 哈希(IP Hash))

[4、加权轮询(Weighted Round Robin)](#4、加权轮询(Weighted Round Robin))

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

[6、一致性哈希(Consistent Hashing)](#6、一致性哈希(Consistent Hashing))

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

[3.1 Nginx配置动静分离实验主要参数](#3.1 Nginx配置动静分离实验主要参数)

[3.2 Nginx动静分离实现原理](#3.2 Nginx动静分离实现原理)

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

[3.4 生产环境实操](#3.4 生产环境实操)


一、Tomcat简介

Tomcat 概述

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

Tomcat 重要目录

|-------------|---------------------------------|
| 目录名 | 作用 |
| bin | 存放启动和关闭Tomcat的脚本 |
| conf | 存放Tomcat 不同的配置文件 |
| doc | 存放Tomcat文档 |
| lib | 存放Tomcat 运行需要的****jar包(库文件) |
| logs | 存放Tomcat运行过程中产生的日志文件 |
| src | 存放Tomcat的源代码 |
| webapps | Tomcat的主要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,依此类推
**特点:**请求均匀分布,无视服务器的当前负载和响应时间

html 复制代码
配置示例:
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
**特点:**动态均衡负载,适用于请求处理时间不一的场景

html 复制代码
配置示例:

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
**特点:**同一个客户端总是被分配到同一台服务器,有助于会话保持

html 复制代码
配置示例:

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
**特点:**高权重服务器接收更多的请求,适用于服务器性能差异较大的场景

html 复制代码
配置示例:

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
**特点:**进一步优化了最少连接算法,适用于高负载环境下的动态负载均衡

html 复制代码
配置示例:

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
**特点:**适应服务器节点变动,减少请求的重新分配,适合缓存敏感的场景

html 复制代码
配置示例(需要第三方模块如 `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)

bash 复制代码
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 应用服务器

bash 复制代码
#停止防火墙并禁用 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 服务器配置

XML 复制代码
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

R 复制代码
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

ruby 复制代码
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

②tomcat2 服务器配置

创建JSP页面:

python 复制代码
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

Swift 复制代码
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

rust 复制代码
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

③Nginx服务器配置

准备静态页面和静态页面

Haskell 复制代码
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配置文件

Lisp 复制代码
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

测试负载均衡效果:

相关推荐
桃花岛主7031 分钟前
Nginx搭建直播服务器,并用rtmp,http-flv,hls三种模式拉流观看直播的流程
运维·服务器·nginx
小蒜学长10 小时前
集团门户网站设计与实现
java·开发语言·数据库·学习·tomcat·maven
程序员大金17 小时前
基于SpringBoot+Vue+MySQL的美术馆管理系统
java·vue.js·spring boot·后端·mysql·tomcat
&星辰入梦来&19 小时前
Nginx从入门到入土(一):DNS域名解析
linux·服务器·nginx
打败40420 小时前
nginx_shell脚本扩展配置虚拟主机三种方式
运维·nginx·docker·flask
weixin_443290691 天前
10- 【JavaWeb】Tomcat、Servlet基础
java·servlet·tomcat
亦舒.1 天前
Nginx 反向代理与负载均衡:深入解析 location 优先级
运维·nginx·负载均衡
凯哥Java1 天前
Nginx实用篇:实现负载均衡、限流与动静分离
运维·nginx·负载均衡
杨侨治1 天前
Docker安装mysql&安装nginx&安装Redis
开发语言·redis·笔记·学习·mysql·nginx·docker
程序员古德1 天前
《论负载均衡技术在Web系统中的应用》写作框架,软考高级系统架构设计师
前端·系统架构·负载均衡