目录
一、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,依此类推
特点:请求均匀分布,无视服务器的当前负载和响应时间
配置示例:
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
测试负载均衡效果:
- 浏览器访问:http://172.16.88.11/index.jsp (不断刷新浏览器)