【Tomcat】tomcat的多实例和动静分离

多实例:

在一台服务器上有多台Tomcat;就算是多实例

安装telnet服务,可以用来测试端口通信是否正常

yum -y install telnet

telnet 192.168.220.112 80

tomcat的日志文件

cd /usr/local/tomcat/logs

vim catalina.out

Tomcat多实例部署:

1.安装好 jdk
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm 
java -version
2.安装 tomcat
cd /opt
tar -xf 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
3.配置 tomcat 环境变量
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
4.修改 tomcat2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
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等前端服务器集成,以实现负载均衡、反向代理等功能
----------------------------------------------------------------------------------------------------------

5.修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量;分别把启动文件指向tomcat1和tomcat2
vim /usr/local/tomcat/tomcat1/bin/startup.sh 

##--G--在页尾添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1


vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
##--G--在页尾添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1


vim /usr/local/tomcat/tomcat2/bin/startup.sh 
##--G--在页尾添加以下内容
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2


vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
##--G--在页尾添加以下内容
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
6.启动各 tomcat 中的 /bin/startup.sh 
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh 

/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh 
7.浏览器访问测试
http://192.168.220.112:8080
http://192.168.220.112:8081

nginx+tomcat实现动静分离

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

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

nginx通过反向代理实现负载均衡——tomcat是后端服务器——web静态由nginx实现——静态请求会分配给nginx——动态页面则经有nginx转发分配给后端的tomcat

tomcat的并发能力比较弱只有nginx的1/6,所以需要由负载均衡对请求进行合理的分配

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

Nginx 静态处理优势:Nginx 处理静态页面的效率远高于Tomcat的处理能力,Nginx处理静态资源的能力是Tomcat 处理的6倍

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

Nginx+Tomcat负载均衡

【安装 Nginx 服务】

Nginx服务装在另一台linux上,不要和tomcat装在同一台机子上

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

1、安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make

2、创建运行用户
useradd -M -s /sbin/nologin nginx

3、编译安装
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/

cd nginx-1.22.0/
./configure --with-stream
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

make -j 4 && make install

4、优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

5、添加 Nginx 系统服务
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
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target


chmod 777 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
——
cd /usr/local/nginx/conf/
#先备份nginx.conf文件
cp nginx.conf nginx.conf.20230811.bak

vim nginx.conf
在--28行-- #tcp_nopush下插入
upstream ky30 {
    server 192.168.220.112:8080 weight=1;
    server 192.168.220.112:8081 weight=1;
    server 192.168.220.114:8080 weight=2;
}

然后到--47行--#access_log下插入
location ~ .*\.jsp$ {
    proxy_pass http://ky30;
    proxy_set_header HOST $host;
    #将真实的IP地址传给后端服务器
    proxy_set_header X-Real-IP $remote_addr;
    #记录代理服务器地址
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ .*\.(gif|jpg|png)$ {
    root html;
    index index.html index.htm;
}
检查配置文件并重启
nginx -t

systemctl restart nginx.service
1号机
创建网页文件
Tomcat1的配置
mkdir /usr/local/tomcat1/webapps/test
vim /usr/local/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,http://www.test1.com");%>
</body>
</html>


Tomcat2的配置
mkdir /usr/local/tomcat2/webapps/test
vim /usr/local/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,http://www.test2.com");%>
</body>
</html>
修改server.xml配置文件
cd /usr/local/tomcat1/conf/
改之前先备份一下
cp server.xml server.xml.20230811.bak

vim server.xml

#在原有的<host>标签下新添下面的内容
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        <Context docBase="/usr/local/tomcat1/webapps/test" path="" reloadable="true" />
</Host>



cd /usr/local/tomcat2/conf/
改之前先备份一下
cp server.xml server.xml.20230811.bak

vim server.xml

#在原有的<host>标签下新添下面的内容
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        <Context docBase="/usr/local/tomcat2/webapps/test" path="" reloadable="true" />
</Host>
重启tomcat服务
/usr/local/tomcat1/bin/shutdown.sh
/usr/local/tomcat1/bin/startup.sh

/usr/local/tomcat2/bin/shutdown.sh
/usr/local/tomcat2/bin/startup.sh
打开另一台虚拟机;安装好tomcat服务
访问一下1号机的tomcat,看能否连得上——显示网页代码
curl 192.168.220.112:8080
curl 192.168.220.112:8081

或者打开浏览器访问
192.168.220.112:8080
192.168.220.112:8081

mkdir /usr/local/tomcat/webapps/test
vim index.jsp

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 test3  page</title>  
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>
修改配置文件
cd /usr/local/tomcat/conf/
cp server.xml server.xml.20230811.bak
vim server.xml

在原有的<host>标签下添加
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
重启tomcat服务
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
回到装有Nginx服务的机子
cd /usr/local/nginx/html/
vim index.html

<html>
<head>
<title>Nginx test page</title>
</head>
<body>
<h1>this is Nginx static test !</h2>
<img src="1.jpg"/>
</body>
</html>


systemctl stop firewalld
setenforce 0


将图片文件添加到/usr/local/nginx/html/目录下,注意文件名要一致

打开浏览器访问Nginx服务所在机子的IP地址
192.168.220.102

加上/index.jsp访问,刷新页面,页面内容也随之刷新
192.168.220.102/index.jsp

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MAUI+Blazor 如何开启浏览器调试工具

文章目录 前言如何开启调试模式输入快捷键打开浏览器有什么意义&#xff1f; 前言 MAUIBlazor其实就是浏览器套壳&#xff0c;我觉得很有意义&#xff0c;因为现在性能已经不是主要的限制了&#xff0c;很多时候讲究的快速开发。而且MAUIBlazor跨平台的未来感觉实在是太香了。…

Java课题笔记~ Servlet编程

1.Servlet编程基础 (1)什么是Servlet Servlet是基于Java语言的Web编程技术&#xff0c;部署在服务器端的Web容器里&#xff0c;获取客户端的访问请求&#xff0c;并根据请求生成响应信息返回给客户端。 创建Servlet的方式&#xff0c;有 如下图&#xff1a;一般创建Servlet都…

skynet 网络模块解析

文章目录 前言环境准备sneak peek线程数据结构会话对象&#xff1a;持有基础套接字&#xff0c;封装了套接字的基础操作。会话管理器&#xff1a;持有并管理会话池&#xff0c;给外部模块提供网络接口。 网络模块管理会话管理器的生命周期管理工作模式 总结技术点原子数据管道描…

opencv实战项目 手势识别-手势控制键盘

手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&#xff08;封装调用&am…

计算机竞赛 - 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广&#xff0c;比如无人机航拍&#xff0c;遥感图像等等&#xff0c;图像拼接是进一步做图像理解基础步骤&#xff0c;拼接效果的好坏直接影响接下来的工作&#xff0c;所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧&#xff0c;…

Java基础入门篇——修饰符

在Java中&#xff0c;修饰符&#xff08;Modifiers&#xff09;是一种用于修改类、方法、变量和其他实体的访问权限、行为或特性的关键字。Java提供了一组修饰符&#xff0c;可以用于实现对代码的封装、继承、多态和访问控制等功能。 1、访问修饰符&#xff08;Access Modifie…

【Spring Boot】夺名连环问(持续更新ing)

Spring的了解与特性 简单介绍&#xff1a;快速开发Spring项目的脚手架。简化Spring应用的初始搭建以及开发过程。 特性 提供了很多内置的Starter结合自动配置&#xff0c;对主流框架的无配置集成、开箱即用。即不需要自己去引入很多依赖。 并且管理了常用的第三方依赖的版本&…

Node.js |(二)Node.js API:fs模块 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;文件写入&#x1f407;writeFile 异步写入&#x1f407;writeFileSync 同步写入&#x1f407;appendFile / appendFileSync 追加写入&#x1f407;createWriteStrea…

LeetCode150道面试经典题--验证回文串(简单)

1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否…

pve组网实现公网访问pve,访问电脑,访问pve中的openwrt同时经过openwrt穿透主路由地址nginx全公网访问最佳办法测试研究...

一台路由器 做主路由 工控机 装pve虚拟机 虚拟机里面装一个openwrt, 外网可以直接访问pve,可以访问pve里的openwrt 一台主机 可选择连 有4个口&#xff0c;分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 &#xff0c;没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界…

TCP协议的报头格式和滑动窗口

文章目录 TCP报头格式端口号序号和确认序号确认应答&#xff08;ACK&#xff09;机制超时重传机制 首部长度窗口大小报文类型URGACKSYNPSHFINRST 滑动窗口滑动窗口的大小怎么设定怎么变化滑动窗口变化问题 TCP报头格式 端口号 两个端口号比较好理解&#xff0c;通过端口号来找…

el-tree-select那些事

下拉菜单树形选择器 用于记录工作及日常学习涉及到的一些需求和问题 vue3 el-tree-select那些事 1、获取el-tree-select选中的任意层级的节点对象 1、获取el-tree-select选中的任意层级的节点对象 1-1数据集 1-2画面 1-3代码 1-3-1画面代码 <el-tree-selectv-model"s…

ELK常见部署架构以及出现的问题及解决方案

ELK常见部署架构以及出现的问题及解决方案 ELK 已经成为目前最流行的集中式日志解决方案&#xff0c;它主要是由Beats 、Logstash 、Elasticsearch 、 Kibana 等组件组成&#xff0c;来共同完成实时日志的收集&#xff0c;存储&#xff0c;展示等一站式的解决方案。本文将会介…

Stable Diffusion - 哥特 (Goth) 风格服装与背景的 LoRA 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132177882 图像来源于 Goth Clothing 的 LoRA 效果&#xff0c;配合哥特 (Goth) 风格服饰的相关提示词。 测试模型&#xff1a;DreamShaper 8 哥…

STM32CubeMX之freeRTOS互斥量

这是大哥保护小弟的故事 高中低等级的任务 互斥量就是谁要敢插我小弟的队&#xff0c;我就要打他&#xff0c;不能让其他人插我小弟的队 互斥量的使用是默认开启的不用手动开启&#xff01; 最高优先级任务&#xff1a;延时&#xff08;10ms&#xff09;再上厕所 中间&#x…

【网络编程·传输层】UDP和TCP的经典八股文

目录 一、端口号划分 二、部分指令 1、pidof&#xff08;用于查看进程id&#xff09; 2、netstat&#xff08;查看网络状态&#xff09; 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …

【百度翻译api】中文自动翻译为英文

欸&#xff0c;最近想做一些nlp的项目&#xff0c;做完了中文的想做做英文的&#xff0c;但是呢&#xff0c;国内爬虫爬取的肯定都是中文 &#xff0c;爬取外网的技术我没有尝试过&#xff0c;没有把握。所以我决定启用翻译&#xff0c;在这期间chatGPT给了我非常多的方法&…

hive修改表或者删除表时卡死问题的解决(2023-08-08)

背景&#xff1a;前阶段在做hive表的改表名时&#xff0c;总是超时&#xff0c;表是内部表&#xff0c;数据量特别大&#xff0c;无论你是修改表名还是删除表都是卡死的状态&#xff0c;怎么破&#xff1f; 终于&#xff1a;尝试出来一个新的方法 将内部表转化成外部表&#…

24.Netty源码之合理管理堆内存

highlight: arduino-light 合理管理 Netty 堆外内存 内存使用目标 •内存占用少(空间) •应用速度快(时间) 即多快好省 对 Java 而言&#xff1a;减少 Full GC 的 STW(Stop the world)时间 内存使用技巧 • 减少对象本身大小 md 例 1&#xff1a;用基本类型就不要用包装类。 例…

嵌入式虚拟仿真实验教学平台之串口发送数据

嵌入式虚拟仿真实验教学平台课程系列 串口发送数据实验 课程内容 本实验使用 STM32 的串口发送数据。开始仿真后,打开串口监视器&#xff0c;串口监视器会打印出要发送的数据。 课程目标 学习配置使用GPIO功能学习配置使用复用功能学习配置使用UART功能 硬件设计 本课程…