Tomcat多实例部署及nginx+tomcat的负载均衡和动静分离

news2024/12/23 7:20:22

Tomcat多实例部署

安装 jdk、tomcat(流程可看之前博客)

配置 tomcat 环境变量

[root@localhost ~]# 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






[root@localhost ~]# source /etc/profile.d/tomcat.sh

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

[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml


#22行,修改Server prot,默认为8005 -> 修改为8006
<Server port="8006" shutdown="SHUTDOWN">

#69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8081" protocol="HTTP/1.1"		

#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />	
第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器默认监听8009端口,负责和其他的HTTP服务器建立连接。
在把Tomcat与其他HTTP服务器集成时,需要用到这个连接器。

第三个连接器
port="8010":指定AJP连接器监听的端口号。在这个示例中,AJP连接器监听在8010端口上。

protocol="AJP/1.3":指定连接器所使用的协议。这里设置为AJP/1.3,表示使用AJP协议的版本1.3。

redirectPort="8443":指定重定向端口。当AJP连接器接收到HTTP请求时,如果请求是通过HTTPS(加密)访问的,
则会将请求重定向到8443端口。

AJP连接器用于将静态资源和动态请求从前端Web服务器(如Apache HTTP Server)转发到Tomcat服务器。
这样可以将Tomcat服务器隐藏在防火墙之后,提高安全性,同时提供更高的性能,特别是在处理动态请求时。
常见的AJP连接器配置是为了将Tomcat与Apache HTTP Server或Nginx等前端服务器集成,以实现负载均衡、反向代理等功能

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

[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/startup.sh 

##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1



[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/shutdown.sh

##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
[root@localhost ~]# vim /usr/local/tomcat/tomcat2/bin/startup.sh 


export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2



[root@localhost ~]# vim /usr/local/tomcat/tomcat2/bin/shutdown.sh


export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

启动/重启各 tomcat 中的 /bin/startup.sh 

#启动tomcat1
/usr/local/tomcat/tomcat1/bin/startup.sh 

#启动tomcat2
/usr/local/tomcat/tomcat2/bin/startup.sh 



netstat -natp | grep java

浏览器访问测试

nginx+tomcat实现动静分离


静:静态页面   动: 动态页面

分别可以对静态页面和动态页面发起不同的请求,会有不同的响应结果。

ngix反向代理——负均均衡——>tomcat为后端服务器——web静态nginx——>静态请求nginx——>动态页面——>tomcat

Nginx实现负载均衡的原理

Nginx实现负载均衡是通过反向代理实现Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。 但不是把所有的web请求转发,而是将静态页面请求Ncinx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。

Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器。并且Tomcat并发量处理能力弱(约Nginx的六分之一),所以需要Nginx方向代理时,进行合理的调用分配


Nginx实现负载均衡的主要配置项 

upstream 服务池名 {   }
作用:配置后端服务器池,以提供响应数据

proxy_pass http:// 服务池名
作用:配置将访问请求转发给后端服务器池的服务器处理

Nginx+Tomcat负载均衡的组合的优点

Nginx 静态处理优势:Nginx 处理静态页面的效率远高于Tomcat的处理能力,Tomcat的请求量为1000次,Nginx 的请求量为6000次,Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M,Nginx处理静态资源的能力是Tomcat 处理的6倍

动静分离原理:服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源由Nginx 提供服务,动态资源由Nginx转发至后端。

Nginx+Tomcat实现负载均衡实例

部署nginx的负载器

#关闭防火墙和安全机制

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0


#安装必要组件
[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

注意要提前装好epel源否则stream模块的组件会无法装载

准备已经安装好的nginx



基于之前tomcat的多实例已部署,在第三台服务器上部署一个tomcat即可

搭建第三台tomcat

#关闭防火墙和安全机制

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

#软件包的方式安装jdk环境和tomcat

[root@localhost ~]# tar -zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/


[root@localhost ~]# 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:${JRE_HOME}/bin:$PATH
 

[root@localhost ~]# source /etc/profile

#tomcat安装

[root@localhost ~]# tar zxvf apache-tomcat-9.0.16.tar.gz
 
[root@localhost ~]# mv /opt/apache-tomcat-9.0.16/ /usr/local/tomcat

#重启tomcat服务
/usr/local/tomcat/bin/shutdown.sh 

/usr/local/tomcat/bin/startup.sh
#查看端口
[root@localhost ~]# netstat -ntap | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN     70787/java          

回到多实例服务器,配置动态页面

#创建指定网页存放目录

[root@localhost ~]# mkdir -p /usr/local/tomcat/tomcat1/webapps/test
[root@localhost ~]# mkdir -p /usr/local/tomcat/tomcat2/webapps/test


Tomcat1配置:

[root@localhost ~]# vim /usr/local/tomcat/tomcat1/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,test1 page!!!");%>
</body>
</html>


[root@localhost ~]# vim /usr/local/tomcat/tomcat1/conf/server.xml  
#要把前面的host配置删除
<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>
#重启tomcat1	
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

Tomcat2的配置

[root@localhost ~]# 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>  
</head>
<body>
<% out.println("动态页面2,test2 page!!!");%>
</body>
</html>

[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
#要把前面的host配置删除
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
#重启tomcat2
/usr/local/tomcat/tomcat2/bin/shutdown.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh

在准备好的nginx服务器上配置nginx负载均衡和动静分离

[root@localhost ~]# vim /usr/local/nginx/html/index.html

<html>
<body>
<h1> this is Nginx static test !</h2>
<img src="preview.jpg"/>
</body>
</html>


[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
	#gzip on;
	
	#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
	upstream zh1 {
		server 20.0.0.100:8080 weight=1;            #多实例tomcat1
		server 20.0.0.100:8081 weight=1;            #多实例tomcat2
        server 20.0.0.32:8080 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;
			expires 10d;
		}
		
		location / {
			root html;
			index index.html index.htm;
		}
......
	}
......
}

location ~ .*\.jsp$ {
			proxy_pass http://zh1;
			proxy_set_header HOST $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}

访问测试

静态页面访问

 静态页面请求访问动态页面

刷新一次后轮询

刷新后轮询

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库(dm8) 在Centos7环境 单节点安装

国产数据库-达梦 一、环境详情二、Centos7 参数优化三、创建用户四、开始安装 当前安装 在指定版本环境下 测试&#xff0c;仅供参考 一、环境详情 软件版本 软件版本下载地址Centos 7CentOS Linux release 7.9.2009 (Core) x86达梦数据库dm8_20230418_x86_rh6_64.zip 节点分配…

html2canvas生成图片地址Base64格式转成blob在转成file(二进制)可正常发送(保姆教程,复制粘贴可用)

开始: 最终结果: 1. html2canvas方法生成的图片地址已Base64编码形式放在img标签src中可直接展示生成的图片(注意页面标签获取位置,还有个setTimeout页面渲染需要时间) setTimeout(function () {var result {};v…

最新Anaconda安装-保姆级教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Anaconda下载 二、使用步骤 手动配置环境变量 &#xff08;上面选择just me和默认配置的可以跳过这一步&#xff09; 简要说明五条路径的用途&#xff1a;这五…

Spring(三):Spring中Bean的生命周期和作用域

前言 在 Spring 中&#xff0c;那些组成应用程序的主体及由 Spring IOC 容器所管理的对象&#xff0c;被称之为 bean。简单地讲&#xff0c;bean 就是由 IOC 容器初始化、装配及管理的对象&#xff0c;除此之外&#xff0c;bean 就与应用程序中的其他对象没有什么区别了。而 b…

金蝶云星空和易快报单据接口对接

金蝶云星空和易快报单据接口对接 来源系统:易快报 易快报是敏捷的企业报销费控与聚合消费平台&#xff0c;为企业提供移动报销、聚合消费、全程费控、预算管理、发票管理等一站式解决方案。同时&#xff0c;易快报可集成多家银行及第三方支付平台&#xff0c;打通对公对私付款&…

GD32F103VE使用软件扫描读取多通道AD值

GD32F103VE使用软件扫描读取多通道AD值。 GD32F103的ADC为12位AD转换器,ADC转换结果保存在16位数据寄存器中; 模拟输入通道&#xff1a; 16个外部模拟输入通道; 1个内部温度传感器通道(Vsense) 1个内部参考电压输入通道(VrefInt) ADC的VDDA电源引脚需要接入3.3V; ADC输入模拟…

Algorithem Review 5.2 图论

网络流 设源点为 s s s&#xff0c;汇点为 t t t&#xff0c;每条边 e e e 的流量上限为 c ( e ) c(e) c(e)&#xff0c;流量为 f ( e ) f(e) f(e)。割 指对于某一顶点集合 P ⊂ V P \subset V P⊂V&#xff0c;从 P P P 出发指向 P P P 外部的那些原图中的边的集合&a…

WMS系统出库操作规范:提高效率与准确性的关键

WMS系统出库管理是指通过仓库管理系统&#xff08;Warehouse Management System&#xff0c;简称WMS&#xff09;对仓库中的货物进行出库操作的管理过程。WMS系统是一种利用自动化和数字化技术提高仓库管理效率和准确性的工具&#xff0c;它提供了对仓库内货物的全面控制和可视…

CentOS7源码安装MySQL详细教程

&#x1f60a; 作者&#xff1a; Eric &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_47316183?typeblog &#x1f389; 主题&#xff1a;CentOS7源码安装MySQL详细教程 ⏱️ 创作时间&#xff1a; 2023年08月014日 文章目录 1、安装的四种方式2、源码安装…

selenium的环境搭建

selenium是一个自动化测试框架&#xff0c;主要针对web项目进行UI自动化。他的工作原理如下图&#xff1a; 那么我们在学习selenium之前就需要就行一个环境的搭建&#xff0c;就是要下载配置我们的浏览器驱动。进入正题&#xff1a; CNPM Binaries Mirror 在网站中选择对应自…

五种方法,教你如何在Mac上查看文件完整路径

在MacOS上&#xff0c;Finder显示文件默认是不带路径展示的&#xff0c;你进入某个文件夹只会显示文件夹的名称而已&#xff0c;如下图&#xff1a; 那如何获取或者显示文件的完整路径呢&#xff1f;在MacOS中有五种方法可以显示文件完整路径。 第一种&#xff1a;使用【终端】…

go入门实践四-go实现一个简单的tcp-socks5代理服务

文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议&#xff0c;主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解socks协议。然后实现一个socks5的tcp代理服务端。最后&#…

excel填数据转json格式

定制化比较严重&#xff0c;按需更改 excel文件如下 代码 # -*- coding: utf-8 -*- import oss2 import shutil import sys import xlwt import xlrd import json from datetime import datetime, timedeltafile1 "C:\\Users\\cxy\\Desktop\\generate.xls" #打开表…

【Spring专题】手写简易Spring容器过程分析——引导篇

目录 前言说在前面阅读准备 思路整理手写源码示例一、手写前的准备1.1 注解1.2 测试Bean1.3 调用实例 二、构造方法&#xff08;构建基本流程&#xff09;三、实现scan()方法3.1 doGetScanPackage()&#xff1a;获取扫描路径3.2 doLoadClassFromDiskAndScan()&#xff1a;从电脑…

【100天精通python】Day34:使用python操作数据库_ORM(SQLAlchemy)使用

目录 专栏导读 1 ORM 概述 2 SQLAlchemy 概述 3 ORM&#xff1a;SQLAlchemy使用 3.1 安装SQLAlchemy&#xff1a; 3.2 定义数据库模型类&#xff1a; 3.3 创建数据表&#xff1a; 3.4 插入数据&#xff1a; 3.5 查询数据&#xff1a; 3.6 更新数据&#xff1a; 3.7 删…

24届最新计算机毕业设计选题推荐 -计算机专业毕业设计题目参考大全

大家好&#xff0c;我们是竹林可以&#xff08;计算机毕ye设ji代做团队&#xff09;&#xff0c;大四的同学马上要开始毕业设计开题啦&#xff0c;大家要好好准备哦。 学长学姐们给大家详细整理了计算机毕设最新选题&#xff0c;我们专注毕ye设ji多年&#xff0c;积累了丰富的…

【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍登场角色应用场景 案例实现案例一类图实现 案例二&#xff1a;借贷平台源码剖析传统方式实现分析状态修改流程类图实现 案例三&#xff1a;金库警报系统系统的运行逻辑伪代码传统实现方式使用状态模式 类图实现分析问题问题一问题二 总结文章说明…

element-ui的el-dialog,简单的封装。

el-dialog是使用率很高的组件 使用el-dialog很多都是按照文档的例子&#xff0c;用一个变量控制是否显示&#xff0c;再来一个变量控制标题。 如果我这个对话框多个地方使用的话还要创建多个变量&#xff0c;甚至关闭之后还要清空一些变量&#xff0c;应该可以简化一点。我写…

数据结构:力扣OJ题(每日一练)

目录 题一&#xff1a;环形链表 思路一&#xff1a; 题二&#xff1a;复制带随机指针的链表 思路一&#xff1a; 本人实力有限可能对一些地方解释的不够清晰&#xff0c;可以自己尝试读代码&#xff0c;望海涵&#xff01; 题一&#xff1a;环形链表 给定一个链表的头节点…

奥威BI数据可视化工具:报表就是平台,随时自助分析

别的数据可视化工具&#xff0c;报表就只是报表&#xff0c;而奥威BI数据可视化工具&#xff0c;一张报表就约等于一个平台&#xff0c;可随时展开多维动态自助分析&#xff0c;按需分析&#xff0c;立得数据信息。 奥威BI是一款多维立体分析数据的数据可视化工具。它可以帮助…