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

相关推荐
irisart3 分钟前
第二章【NGINX 开源功能】—— 四层反向代理
运维·nginx·开源
MACKEI35 分钟前
图片加速效果验证与查看
nginx
qinyia1 小时前
WisdomSSH解决Ubuntu 25.04服务器上因dpkg中断导致的Nginx安装失败问题并成功部署科技感个人主页
服务器·nginx·ubuntu
阿干tkl1 小时前
Tomcat文件上传及下载
java·tomcat
Overt0p11 小时前
抽奖系统(4)
java·spring boot·tomcat
用户61354114601613 小时前
Tomcat Connectors 1.2.32 源码编译安装教程(含 mod_jk 配置步骤)
tomcat
hgz071021 小时前
MyBatis插件(拦截器)
java·tomcat
tzhou6445221 小时前
Docker 部署 Nginx HTTPS 服务(CentOS 7)
nginx·docker·https
等什么君!1 天前
nginx启动失败 ,报404和 idea端口号被占用的解决办法
运维·nginx
全栈工程师修炼指南1 天前
Nginx | HTTP 反向代理:当缓存失效时如何减轻后端(上游)服务压力?
运维·网络协议·nginx·http·缓存