Tomcat的优化及多实例部署

news2024/11/16 19:00:52

文章目录

  • 一.Tomcat的优化
    • 1.tomcat启动速度优化——random
    • 2.Tomcat配置文件参数优化
      • 2.1 常用的优化相关参数
      • 2.2 优化的配置文件
  • 二.Tomcat多实例部署
    • 1.为什么会有tomcat多实例部署
    • 2.多实例部署图示
    • 3.多实例部署的配置
      • 3.1 安装JDK
      • 3.2 安装启动Tomcat
      • 3.3 配置 tomcat 环境变量
      • 3.4 修改 tomcat2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
      • 3.5 修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
      • 3.6 启动各 tomcat 中的 /bin/startup.sh
      • 3.7 浏览器访问测试
  • 三.扩展优化jvm

一.Tomcat的优化

tomcat默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重新启动,只有通过不断压测优化才能让它高效率稳定的运行,优化主要包括三方面:分别为操作系统优化(内核、参数优化)、tomcat配置文件参数优化、java虚拟机(JVM调优)

1.tomcat启动速度优化——random

第一次启动tomcat可能会发现tomcat启动很慢,默认情况下可能需要几十秒,可以修改jdk参数调优

vim /usr/java/jdk1.8.0-x64/jre/lib/security/java.security
--117行--修改
securerandom.source=file:/dev/urandom
# 关闭Tomcat 应用程序脚本。
/usr/local/tomcat/bin/shutdown.sh 
#开启Tomcat 应用程序脚本。
/usr/local/tomcat/bin/startup.sh 

random:随机生成数,urandom:关闭随机生成数,会使启动的速度更快

总:jdk默认的使用/dev/random,random采用的是阻塞方式生成随机数,生成的速度很慢

2.Tomcat配置文件参数优化

2.1 常用的优化相关参数

(1)redirectPort

如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口。

8080:tomcat的http默认监听端口

8443:https的默认端口默认不是开启的,开启去生成证书(ssl)

8005:用来关闭tomcat的服务端口,使用shutdown关闭的就是这个端口

8009:连接器的监听端口(负责和其他的http服务器建立连接),把tomcat与其他http服务集成时,就需要用到连接器

(2)maxThreads

Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大的线程数,即支持的最大并发连接数,默认值是 200。(根据Tomcat的请求数量设置)

如tomcat挂了,服务正常起来:最大线程数的问题,查看是否超过了默认值或者自己设置的最大线程数

(3)minSpareThreads

最小空闲线程数,Tomcat启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。

平常设置50-80之间即可,设置的较大会浪费资源

(4)maxSpareThreads

最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值是-1(无限制)。一般不需要指定。
(5)URIEncoding

指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它web服务器软件配置方便,需要分别指定。

一般是utf-8

(6)connectionTimeout

网络连接超时,单位:毫秒,设置为 0

表示永不超时,这样设置有隐患的。通常默认 20000 毫秒就可以。
(7)enableLookups

是否反查域名,以返回远程主机的主机名,取值为: true 或false,如果设置为 false,则直接返回 IP 地址,为了提高处理能力,应设置为 false。(如不是false会陷入循环)
(8)disableUploadTimeout

上传时是否使用超时机制。应设置为 true。
(9)connectionUploadTimeout

上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
(10)acceptCount

指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为 100 个。如果超出默认值或者自己设置的值,将会丢弃。
(11)compression

是否对响应的数据进行GZIP压缩,off:表示禁止压缩、 on:表示允许压缩 (文本将被压缩)、force: 表示所有情况下都进行压缩,默认值为:off——压缩数据后可以有效的减少页面的大小,一般可以减小 1/3 左右,节省带宽。

(12)compressionMinSize

表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是 2048。

超过默认值才会开启压缩,低于不会压缩

(13)compressableMimeType

压缩类型,指定对哪些类型的文件进行数据压缩。

(14)noCompressionUserAgents=“gozilla,traviata”

对于以下的浏览器,不启用压缩

2.2 优化的配置文件

vim /usr/local/tomcat/conf/server.xml
. . . . . .
#端口
<Connector port="8080" protocol="HTTP/11.1"connectionTimeout="20000"
redirectPort="8443"
--71行--插入
#最小空闲线程数
minSpareThreads="50"
是否反查域名
enableLookups="false"
#上传时是否使用超时机制
disableUploadTimeout="true"
#指定当前所有可以使用处理请求的线程数
acceptCount="300"
#使用线程数来处理接受的每个请求
maxThreads="500"
#系统或程序可以使用 500 MB 的处理器(CPU)缓存空间,以提高程序的运行速度。
processorCache="500"
#指定tomcat容器的URL编码格式
URIEncoding="UTF-8"
#是否对响应的数据进行GZIP压缩
compression="on"
#压缩的最小值
compressionMinSize="2048"
#支持压缩类型
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image /jpg,image/png"/>

二.Tomcat多实例部署

1.为什么会有tomcat多实例部署

高并发量的话一个tomcat只支持小部分,添加变成多实例部署会支持的更多,解决高并发的情况

多实例部署的时候端口一定要不一样,不然服务无法起来

2.多实例部署图示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iwzWU3GE-1688117012593)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630152703830.png)]

3.多实例部署的配置

3.1 安装JDK

关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下

jdk-8u371-linux-x64.rpm
apache-tomcat-8.5.16.tar.gz 
 
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMnGmzIa-1688117012595)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630153814309.png)]

安装JDK

cd /opt
#先安装jdk
rpm -ivh jdk-8u371-linux-x64.rpm 
#查看Java的版本信息
java -version
rpm -qpl jdk-8u371-linux-x64.rpm

设置JDK环境变量

#使用脚本设置jdk的环境变量
vim /etc/profile.d/java.sh
#指定安装的包所在的路径家目录
export JAVA_HOME=/usr/java/jdk1.8.0-x64
#将 CLASSPATH 变量设置为当前目录、$JAVA_HOME/lib/tools.jar 和 $JAVA_HOME/lib/dt.jar 所代表的 Java 类文件搜索路径。
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
#指定变量,放入执行文件
export PATH=$JAVA_HOME/bin:$PATH

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHkRdBcQ-1688117012596)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630154124316.png)]

#读取脚本
source /etc/profile.d/java.sh
java -version

测试jdk是否安装成功

vim hello.java
public class hello {			
  public static void main(String[] args){
    System.out.println("Hello world!");
  }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8FAI6xiR-1688117012597)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630154443076.png)]

3.2 安装启动Tomcat

cd /opt
tar zxvf apache-tomcat-8.5.16.tar.gz 
mkdir /usr/local/tomcat
mv apache-tomcat-8.5.16.tar.gz /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

#启动tomcat #
#后台启动
/usr/local/tomcat/bin/startup.sh 
或
/usr/local/tomcat/bin/catalina.sh start
	
#前台启动
/usr/local/tomcat/bin/catalina.sh run	
netstat -natp | grep 8080

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j1b3ZFAj-1688117012598)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630155141716.png)]

3.3 配置 tomcat 环境变量

vim /etc/profile.d/tomcat.sh

#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1export CATALINA_BASE1=/usr/local/tomcat/tomcat1export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2export CATALINA_BASE2=/usr/local/tomcat/tomcat2export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
source /etc/profile.d/tomcat.sh 

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

首先检查local目录下是否已经有tomcat的文件,然后根据标准路径修改配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NOeSFteK-1688117012599)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630161253215.png)]

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

第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的web应用时使用的就是这个连接器。第二个连接器默认监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。

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

vim /usr/local/tomcat1/bin/startup.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
#添加以下的内容
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1


vim /usr/local/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
#添加以下的内容
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
vim /usr/local/tomcat2/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
#添加以下的内容
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/romcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
vim /usr/local/tomcat2/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/romcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2

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

/usr/local/tomcat1/bin/startup.sh
/usr/local/tomcat2/bin/startup.sh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VGiRZKwH-1688117012599)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630163426655.png)]

#因为启动调用的是java,所以查的是java
netstat -natp | grep java

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXwUF9Wy-1688117012600)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630163539627.png)]

3.7 浏览器访问测试

http://192.168.198.13:8080/

http://192.168.198.13:8081/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B0TDjY0A-1688117012600)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630163716659.png)]

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwnjP1jV-1688117012601)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630163735226.png)](https://img-blog.csdnimg.cn/7e04d00055c740d7a156182cfeeb3779.png)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v1PHfCGU-1688117012601)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630170012547.png)]

查看线程数

ps -aT | grep -c java

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t2YP11tt-1688117012601)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230630163850749.png)]

三.扩展优化jvm

/bin/catalina.shserver:jvm的server工作模式,对应的有client工作模式。使用"java-version”可以查看当前工作模式
-Xms1024m:初始Heap大小,使用的最小内存-Xmx1024m: Java heap最大值,使用的最大内存。

经验:设置Xms大小等于Xmx大小-XX:NewSize=512m:表示新生代初始内存的大小,应该小于 -Xms的值-XX:MaxNewSize=1024M: 表示新生代可被分配的内存的最大上限,应该小于 -Xmx的值-xX:PermSize=1024m: 设定内存的永久保存区域,内存的永久保存区域,VM 存放CLass 和 Meta信息,JVM在运行期间不会清除该区域-XX:MaxPermsize=1024m: 设定最大内存的永久保存区域。经验:设置PermSize大小等于MaxPermSize大小、-XX:+DisableExplicitGC:自动将System.qc() 调用转换成一个空操作,即应用中调用System.qc()会变成一个空操作,避免程序员在代码里进行System.gc()这种危险操作。System.gc()除非是到了万不得也的情况下使用,都应该交给 JVM。

优化总结:

(1)提高tomcat效率:radom修改uradom启动速度

(2)连接器支持协议

(3)最大并发连接数:默认200,一般100,根据请求数量

(4)线程数最小空闲(默认值10),最大备用线程数(一般不指定)

(5)tomcat URL编码格式,需要自己设置:utf-8

(6)tomcat网络连接超时,默认值200s即可

(7)是否反查域名,false设置false为了提高处理能力

(8)tomcat超时机制,应为true,一定要开启,设置超时时间

(9)tomcat对数据是否进行压缩,on允许压缩,压缩大小默认2048,超过2048才会压缩

(10)tomcat对哪些类型的文件进行压缩(image、jpg、text、html、png)

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

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

相关文章

筹码分布图高级用法——历史换手衰减系数自动计算公式

在使用筹码分布图时&#xff0c;很多人习惯于采用软件的默认设置&#xff0c;然而默认设置不一定能满足我们的要求。今天将向大家介绍筹码分布图的高级用法——历史换手衰减系数&#xff0c;并编写历史换手衰减系数自动计算公式。有些网友认为通过修改衰减系数&#xff0c;可以…

【远程控制】向日葵连接Ubuntu黑屏

Ubuntu 远程黑屏 Ubuntu 22.04 方法 1&#xff1a;切换桌面工作模式方法 2&#xff1a;安装 lightdm 插件来渲染界面客服工单回答 Ubuntu 22.04 方法 1&#xff1a;切换桌面工作模式 进入到登录页 点击用户名 点击右下角&#xff0c;切换桌面工作模式为Ubuntu on xorg即可 …

基于Python+MySQL所写的音乐网管理系统

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87971719?spm1001.2014.3001.5503 《甜橙音乐网》程序使用说明 在虚拟环境下输入命令“python manage.py runserver”启动项目&#xff0c;启动成功后&#xff0c;访问“http://127.0…

x264 deblock filter 代码解读

在x264源码里&#xff0c;void x264_frame_deblock_row( x264_t *h, int mb_y )函数中定义了如下的宏片段&#xff0c;这段代码旨在完成对MB的deblocking 操作&#xff0c;其中针对edge 取不同的值的时候&#xff0c;有的做deblocking&#xff0c; 有的不做&#xff0c;看这部分…

计算机网络的89个核心概念

主机&#xff1a;计算机网络上任何一种能够连接网络的设备都被称为主机或者说端系统&#xff0c;比如手机、平板电脑、电视、游戏机、汽车等&#xff0c;随着 5G 的到来&#xff0c;将会有越来越多的终端设备接入网络。 通信链路&#xff1a;通信链路是由物理链路&#xff08;…

[nexus]基于nexus搭建npm仓库及上传插件到仓库

目录 环境信息搭建npm仓库创建存储位置创建proxy仓库创建hosted仓库创建group仓库配置域 下载及上传登录下载上传 环境信息 nexus: 3.29.2-02node: v14.18.2npm: 6.14.15 搭建npm仓库 创建存储位置 这一步不是必须的&#xff0c;可以跟之前创建的复用 依次打开 [设置] ->…

【Docker】Docker的简介安装以及使用Docker安装Mysql案例

Docker docker概述 Docker是一个开源的应用容器引擎诞生于2013年初&#xff0c;基于Go语言实现&#xff0c;dotClou公司出品&#xff08;后改名为Docker inc&#xff09;Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可以直接的容器中&#xff0c;然后发布到任何…

测试的流程

目录&#xff1a; 测试流程价值与体系测试计划业务架构分析思路bug基本概念bug处理流程测试流程管理jira系统-测试用例管理测试流程管理 jira 系统-Bug管理测试总结业务架构分析工具plantuml测试流程管理jira系统-测试流程定制测试流程管理 jira 系统-Bug管理流程定制 1.测试…

HTML5新特性总结

新增语义化标签 新增了很多语义化标签&#xff0c;如header、footer、nav、article、section(页面中的某段文字&#xff0c;或文章中的某段文字)、aside、main 其中article标签里可以包含多个section&#xff1b; section强调的是分段或分块&#xff0c;若想将一块内容分成几…

ARM学习(23)AMP和SMP的认识与理解

笔者来聊聊AMP和SMP架构理解&#xff08;多核下系统&#xff09;。 简介介绍 笔者经常听到ARM架构时&#xff0c;谈到SMP的架构或者AMP的架构&#xff0c;今天特意来了解一下&#xff0c; SMP&#xff1a;Symmetric multiprocessing&#xff0c;对称多处理器AMP&#xff1a;A…

leetcode:2154. 将找到的值乘以 2(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums &#xff0c;另给你一个整数 original &#xff0c;这是需要在 nums 中搜索的第一个数字。 接下来&#xff0c;你需要按下述步骤操作&#xff1a; 如果在 nums 中找到 original &#xff0c;将 original 乘以 2 &#xff0c;得到新…

LangChain大型语言模型(LLM)应用开发(二):Conversation Memory

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

Java9集合类新增功能

前言 Java8及Java9在集合Collection类中新增了一些很好用的新方法&#xff0c;能方便程序员更便捷的处理集合数据&#xff0c;本文对其中的一些方法进行总结 一. List 1.创建 // 传统方法List<String> list1 new ArrayList<>();list1.add("item1");li…

论文导读 | Operation ResearchManagement Science近期文章精选

推文作者&#xff1a;周梓渊 编者按 本期我们选取了最近来自Operation Research和Management Science的六篇文章以飨读者&#xff0c;前四篇文章来自OR&#xff0c;最后两篇文章来自MS&#xff1b;内容涉及多个方面&#xff0c;实现了方法论与具体应用实践的结合&#xff0c;例…

Node.js HTTP 模块的内存泄露问题

很久没有逛社区了&#xff0c;晚上回来看了一下最近的情况&#xff0c;突然看到一个内存泄露问题&#xff0c;作为一个 APM 开发者&#xff0c;自然想分析其中的原因。 问题 下面介绍一下具体的问题。看一下 demo。 const http require(http)async function main () {let i…

用NumPy,梯度下降的方法来解决线性回归

import matplotlib.pyplot as plt import numpy as npdef reckonCost(X,y,theta):my.shape[0]innernp.power( ( (Xtheta)-y.T ) , 2)return np.sum(inner) / (2*m)# 定义梯度下降函数 def gradient_descent(X, y, theta, alpha, num_iters):# m len(y) # 样本数量my.shape[0]…

Leetcode-每日一题【86.分隔链表】

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3输…

【数据挖掘】时间序列教程【三】

2.7 平稳性 序列的平稳性 是一个关键属性&#xff0c;它允许我们应用许多时间序列分析的标准工具。 如果对于大小 n 和任何整数 ,观察发现 具有与 相同的联合分布&#xff0c;则时间序列是严格平稳的。 换句话说&#xff0c;从分布的角度来看&#xff0c;平稳时间序列对移位…

【嵌入式Qt开发入门】初识信号与槽

信号与槽&#xff08;Signal & Slot&#xff09;是 Qt 编程的基础&#xff0c;也是 Qt 的一大创新。因为有了信号与槽的编程机制&#xff0c;在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号&#xff08;Signal&#xff09;就是在特定情况下被发射的事件&a…

【Linux】C++项目实战-高并发服务器详析

目录 多进程实现并发服务器多线程实现并发服务器BIO模型NIO模型I/O多路复用(I/O多路转接)select主旨思想图解原理函数解析代码举例select的缺点 poll函数解析代码示例 epoll&#xff08;最重要&#xff0c;请重点掌握&#xff09;函数解析代码举例epoll的两种工作模式 橙色 多…