Nginx+Tomcat实现负载均衡和动静分离

目录

前瞻

动静分离和负载均衡原理

实现方法

实验(七层代理)

部署Nginx负载均衡服务器(192.168.75.50:80)

部署第一台Tomcat应用服务器(192.168.75.60:8080)

[多实例部署第二台Tomcat应用服务器(192.168.75.70:8080 192.168.75.70:8081)](#多实例部署第二台Tomcat应用服务器(192.168.75.70:8080 192.168.75.70:8081))

添加动态和静态测试页面

第一台Tomcat应用服务器(192.168.75.60:8080)

[第二台Tomcat应用服务器(192.168.75.70:8080 192.168.75.70:8081)](#第二台Tomcat应用服务器(192.168.75.70:8080 192.168.75.70:8081))

Nginx负载均衡服务器(192.168.75.50:80)

在nginx服务器配置文件中添加动静分离配置

本机浏览器测试


前瞻

动静分离和负载均衡原理

Nginx处理静态页面的效率远高于Tomcat的处理能力

若Tomcat的请求量为1000次,则Nginx的请求量为6000次

Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M

Nginx处理静态资源的能力是Tomcat处理的6倍

由于Nginx服务是轻量级、高性能,处理静态页面强,但是几乎不能处理动态页面,所以需要转发给多台tomcat服务器处理动态页面请求。

负载均衡是以Nginx为复制均衡器,Tomcat作为应用服务器。Nginx的负载均衡是通过反向代理实现的。反向代理即作为服务端的代理,接受客户端的请求,并根据配置转发给后端的tomcat服务器,处理完之后再通过nginx返回给客户端。

实现方法

nginx + tomcat 动静分离

nginx使用location去正则匹配用户的访问路径的前缀或者后缀,去判断接收的请求是静态的还是动态的,静态资源请求在Nginx本地进行处理响应,动态页面请求通过反向代理转发给后端应用服务器

负载均衡

使用反向代理,先在http块中使用upstream模块定义服务器组名和服务器列表,使用location匹配路径再用proxy_pass http://... 服务器组名进行七层代理转发。

实验(七层代理)

实验准备

Liunx服务器

Nginx 服务器:192.168.75.50:80

Tomcat服务器1:192.168.75.60:8080

Tomcat服务器2:192.168.75.70:8080 192.168.75.70:8081

windows客户端

本机(用于访问网页测试):192.168.75.1

部署Nginx负载均衡服务器( 192.168.75.50:80**)**

关闭防火墙,安全机制

bash 复制代码
systemctl stop firewalld
setenforce 0

下载安装编译环境,创建nginx程序用户

bash 复制代码
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx

去官网下载安装nginx压缩包nginx:下载https://nginx.org/en/download.html

解压压缩包,添加模块编译安装nginx

bash 复制代码
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./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
make && make install

注:编译时每个模块的作用

创建软连接将nginx添加到$PATH路径下,直接调用

bash 复制代码
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

将nginx添加到systemd服务中去,以便直接使用systemd服务管理

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

启动nginx服务,并且查看状态是否成功

bash 复制代码
systemctl start nginx.service
systemctl status nginx.service

部署第一台Tomcat应用服务器(192.168.75.60:8080)

关闭防火墙,安全机制

bash 复制代码
systemctl stop firewalld
setenforce 0

解压jdk压缩包到/usr/local路径下

bash 复制代码
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

配置jdk环境

bash 复制代码
打开配置文件
vim /etc/profile.d/java.sh
添加以下内容
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:${JRE_HOME}/bin:$PATH
运行此文件
source /etc/profile.d/java.sh

解压tomcat压缩包,移到/usr/local路径下并改名为tomcat

bash 复制代码
tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat

开启tomcat服务并检测状态

bash 复制代码
./usr/local/tomcat/bin/startup.sh
netstat -ntap | grep 8080

多实例部署第二台Tomcat应用服务器(192.168.75.70:8080 192.168.75.70:8081)

关闭防火墙,安全机制

bash 复制代码
systemctl stop firewalld
setenforce 0

解压jdk压缩包到/usr/local路径下

bash 复制代码
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

配置jdk环境

bash 复制代码
打开配置文件
vim /etc/profile.d/java.sh
添加以下内容
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:${JRE_HOME}/bin:$PATH
运行此文件
source /etc/profile.d/java.sh

解压tomcat压缩包

bash 复制代码
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

.配置 tomcat 环境变量

bash 复制代码
vim /etc/profile.d/tomcat.sh
添加以下内容
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1

#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2

运行
source /etc/profile.d/tomcat.sh

修改 tomcat2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号

bash 复制代码
vim /usr/local/tomcat/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">		#22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1"		#69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />	#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010

注:第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。

第二个连接器默认监听8009端口,AJP端口,即容器使用,如Apache能通过AJP协议访问Tomcat的8009端口。

修改各 tomcat 实例中的 startup.shshutdown.sh 文件,添加 tomcat 环境变量

bash 复制代码
vim /usr/local/tomcat/tomcat1/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1


vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1


vim /usr/local/tomcat/tomcat2/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2


vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

例:

启动各 tomcat 中的 /bin/startup.sh ,并查看状态

bash 复制代码
/usr/local/tomcat/tomcat1/bin/startup.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh 

netstat -natp | grep java

浏览器访问测试

bash 复制代码
http://192.168.75.70:8080
http://192.168.75.70:8081

添加动态和静态测试页面

第一台Tomcat应用服务器(192.168.75.60:8080)

添加动态测试页面1

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

修改配置文件

bash 复制代码
vim /usr/local/tomcat/conf/server.xml
找到此行
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" >
在下面添加
	<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
	</Context>

开启服务
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

第二台Tomcat应用服务器(192.168.75.70:8080 192.168.75.70:8081)

添加动态页面2

bash 复制代码
mkdir /usr/local/tomcat/tomcat1/webapps/test 
mkdir /usr/local/tomcat/tomcat2/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>   #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>

修改配置文件

bash 复制代码
vim /usr/local/tomcat/tomcat1/conf/server.xml
找到此行
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" >
在下面添加
	<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true">
	</Context>

开启服务
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

添加动态页面3

bash 复制代码
vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>   #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>

修改配置文件

bash 复制代码
vim /usr/local/tomcat/tomcat2/conf/server.xml
找到此行
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" >
在下面添加
	<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true">
	</Context>

开启服务
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

Nginx负载均衡服务器( 192.168.75.50:80**)**

添加静态页面

bash 复制代码
echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/111.jpg /usr/local/nginx/html/img

在nginx服务器配置文件中添加动静分离配置

bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
	#gzip on;
	
	#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
	upstream tomcat_server {
		server 192.168.75.60:8080 weight=1;
		server 192.168.75.70:8080 weight=1;
		server 192.168.75.70:8081 weight=1;
	}
	
	server {
		listen 80;
		server_name localhost;
	
		charset utf-8;
	
		#access_log logs/host.access.log main;
		
		#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
		location ~ .*\.jsp$ {
			proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
			proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IP
			proxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
			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;
		}
......
	}
......
}

检测语法,没错直接重启nginx服务

本机浏览器测试

浏览器访问 http://192.168.75.50/111.jpg

浏览器访问 http://192.168.75.50/index.jsp

动态页面1

刷新,动态页面2

刷新,动态页面3

相关推荐
无名-CODING7 小时前
从零手写一个迷你 Tomcat —— 彻底理解 Servlet 容器原理
java·servlet·tomcat
速易达网络7 小时前
Java Web旅游网站系统介绍
java·tomcat
Full Stack Developme8 小时前
Nginx 代理 mysql redis MQ 等各种软件,供客户端访问链接
redis·mysql·nginx
云和数据.ChenGuang9 小时前
运维工程师免费技术教程之tomcat动态日志监控
运维·tomcat·firefox·运维工程师·运维技术
根哥的博客10 小时前
编译nginx-1.28.0支持lua语法
nginx·lua·openresty·nosql注入漏洞
虎头金猫10 小时前
openEuler 22.03 LTS 时序数据库实战:InfluxDB 深度性能评测与优化指南
网络·数据库·python·网络协议·tcp/ip·负载均衡·时序数据库
qq_54702617910 小时前
Docker 搭建 Nginx 服务
nginx·docker·容器
中杯可乐多加冰10 小时前
openEuler软件生态体验:快速部署Nginx Web服务器
服务器·前端·nginx
邪恶喵喵10 小时前
nginx反向代理和负载均衡
运维·nginx·负载均衡
AI 搜索引擎技术10 小时前
智能电网中的AI Agent负载均衡
运维·人工智能·ai·负载均衡