【Web应用服务器_Tomcat】二、Tomcat 核心配置与集群搭建

在企业级 Java Web 应用的部署场景中,Tomcat 作为主流的 Servlet 容器和 Web 服务器,其核心配置的优化以及集群搭建对于保障应用的高性能、高可用性至关重要。

一、Tomcat 核心配置优化​

1.1 server.xml 配置文件解析​

Tomcat 的核心配置文件server.xml位于/usr/local/tomcat/conf/目录下,它定义了 Tomcat 服务器的整体架构和运行参数。以下是对server.xml中关键部分的详细解析:

<Server port="8005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><!-- 省略其他Listener --><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" /><Engine name="Catalina" defaultHost="localhost"><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><!-- 可以在此添加Context配置 --></Host></Engine></Service>
</Server>

注释详解:

  • <Server>元素:作为整个配置文件的根元素,代表 Tomcat 服务器实例。port属性指定了 Tomcat 用于接收关闭命令的端口(默认为 8005),shutdown属性定义了关闭服务器的命令字符串(默认为SHUTDOWN)。例如,通过telnet localhost 8005连接该端口并发送SHUTDOWN命令,可正常关闭 Tomcat 服务器。在生产环境中,为了安全考虑,可修改port为不常用端口,并设置复杂的shutdown命令 ,防止恶意关闭服务器。​
  • <Service>元素:包含一个或多个Connector和一个Container(即Engine)。name属性用于标识服务名称,如Catalina是 Tomcat 默认的服务名。一个 Tomcat 实例可以包含多个Service,每个Service可以独立配置Connector和Engine,以满足不同的应用需求,比如同时提供 HTTP 和 AJP 协议的服务。​
  • <Connector>元素:负责处理网络通信,接收客户端请求。常见的配置参数如下:​
  • port:指定监听的端口号,默认 8080,可根据需求修改,如将其改为 80,使 Tomcat 通过默认 HTTP 端口提供服务。如果服务器上已经存在占用 80 端口的其他服务,需要先停止该服务或者修改 Tomcat 的端口。​
  • protocol:指定使用的协议,默认HTTP/1.1,也可选择org.apache.coyote.http11.Http11NioProtocol等更高效的协议。Http11NioProtocol基于 Java NIO 实现,在高并发场景下相比传统的HTTP/1.1协议,能更有效地利用系统资源,减少线程阻塞。​
  • connectionTimeout:连接超时时间(单位:毫秒),超过该时间未完成的连接将被关闭,默认为 20000 毫秒。对于一些长时间运行的请求,如文件上传,如果设置的connectionTimeout过短,可能导致上传失败,此时需要根据实际情况适当延长该时间。​
  • redirectPort:当需要将 HTTP 请求重定向到 HTTPS 时,指定重定向的端口号,默认为 8443。​
  • <Engine>元素:代表 Servlet 引擎,处理来自Connector的请求并分配给相应的Host。name属性标识引擎名称,defaultHost属性指定默认的虚拟主机。当有多个Host时,defaultHost用于处理没有明确指定Host的请求。​
  • <Host>元素:表示一个虚拟主机,用于部署多个 Web 应用。name属性是虚拟主机的域名或 IP 地址,appBase属性指定 Web 应用的部署目录(默认为webapps),unpackWARs属性表示是否自动解压 WAR 文件,autoDeploy属性表示是否自动部署 Web 应用。若将unpackWARs设置为false,则需要手动解压 WAR 文件,适合对 Web 应用部署有特殊要求的场景。

1.2 线程池优化策略​

Tomcat 通过线程池处理客户端请求,合理配置线程池参数能显著提升服务器性能。线程池相关参数主要在Connector元素中配置,以下是关键参数说明:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"maxThreads="200"minSpareThreads="25"maxSpareThreads="75"acceptCount="100" />

 注释详解:

  • maxThreads:最大工作线程数,即 Tomcat 能够同时处理的最大请求数量。在高并发场景下,可适当增大该值,但过大的值可能导致服务器资源耗尽。一般建议根据服务器硬件资源设置在 200 - 500 之间。例如,对于配备 4 核 8 线程 CPU、16GB 内存的服务器,在测试环境中可先将maxThreads设置为 300,然后通过压力测试工具如 JMeter 进行测试,观察服务器的 CPU、内存使用率和请求响应时间,根据测试结果进一步调整该参数。​
  • minSpareThreads:最小空闲线程数,Tomcat 会始终保持至少这么多空闲线程,以快速响应新的请求。建议设置在 25 - 50 之间。如果设置过小,在突发流量时,可能会因为创建新线程的开销导致请求响应延迟;设置过大,则会占用过多系统资源。​
  • maxSpareThreads:最大空闲线程数,当空闲线程数超过该值时,Tomcat 会回收多余的线程。​
  • acceptCount:当线程池已满时,等待处理的请求队列长度。超过该数量的请求将被拒绝,默认值为 100。可根据实际情况适当调整,例如在流量突发时增大该值。但如果acceptCount设置过大,可能会导致大量请求堆积,消耗过多内存,甚至引起服务器崩溃。

1.3 JVM 参数优化​

Tomcat 作为 Java 应用,其性能与 JVM 参数配置密切相关。通过调整 JVM 参数,可以优化内存分配、垃圾回收等。在 CentOS 7 上,可通过修改 Tomcat 启动脚本/usr/local/tomcat/bin/catalina.sh来设置 JVM 参数。在文件中找到JAVA_OPTS变量(如果没有则添加),以下是一些常用的 JVM 参数配置示例:

JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32m"

 注释详解:

  • -Xms:设置 JVM 堆内存的初始大小,这里设置为 512MB。如果应用启动时需要加载大量数据或执行复杂的初始化操作,可适当增大该值,以避免频繁的内存扩展操作带来的性能开销。​
  • -Xmx:设置 JVM 堆内存的最大大小,这里设置为 1024MB。应根据服务器可用内存和应用实际需求合理设置,避免内存不足或浪费。例如,对于一个中小型 Web 应用,1GB 的堆内存通常能满足需求;但对于大型数据处理应用,可能需要将-Xmx设置为服务器物理内存的 70% - 80%。​
  • -XX:+UseG1GC:启用 G1 垃圾回收器,G1 在处理大内存时具有较好的性能表现,适用于大多数场景。G1 采用分区算法,将堆内存划分为多个大小相等的区域,能够更灵活地管理内存和进行垃圾回收。​
  • -XX:MaxGCPauseMillis:设置目标最大垃圾回收停顿时间(单位:毫秒),G1 会尽量满足该目标。但该值不能设置过小,否则 G1 可能会频繁进行垃圾回收,影响应用的响应性能。​
  • -XX:G1HeapRegionSize:设置 G1 堆内存区域大小,将堆内存划分为多个固定大小的区域,提高垃圾回收效率。区域大小可根据应用的内存使用情况进行调整,一般建议设置为 2 的幂次方,如 1MB、2MB、4MB 等。

二、Tomcat 集群搭建​

2.1 多实例集群配置​

2.1.1 环境准备​

在 CentOS 7 系统上搭建 Tomcat 集群,需要准备多台服务器(本文以两台服务器为例,IP 分别为 192.168.1.101 和 192.168.1.102),并在每台服务器上安装 Tomcat。安装步骤与单机安装相同,可参考前文内容。在安装前,需要确保每台服务器的硬件配置基本一致,以保证集群的负载均衡效果。同时,关闭服务器的防火墙或者开放相关端口(如 Tomcat 的 8080 端口、Nginx 的 80 端口等),确保服务器之间能够正常通信。​

2.1.2 配置负载均衡器(以 Nginx 为例)​

        1、安装 Nginx:使用以下命令在 CentOS 7 上安装 Nginx:

sudo yum install epel-release
sudo yum install nginx

         2、配置 Nginx 负载均衡:修改 Nginx 的配置文件/etc/nginx/nginx.conf,在http块中添加以下配置:

http {upstream tomcat_cluster {server 192.168.1.101:8080;server 192.168.1.102:8080;# 可根据需求设置负载均衡策略,如轮询(默认)、权重等# weight参数可设置服务器权重,如 server 192.168.1.101:8080 weight=2;}server {listen 80;server_name localhost;location / {proxy_pass http://tomcat_cluster;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}

上述配置中,upstream块定义了 Tomcat 集群的服务器列表,server块配置了 Nginx 作为反向代理,将请求转发到 Tomcat 集群。proxy_set_header指令用于设置转发请求时的 HTTP 头部信息,其中X-Real-IP和X-Forwarded-For用于记录客户端的真实 IP 地址,方便应用获取客户端信息进行日志记录和安全防护。

        3、启动 Nginx

sudo systemctl start nginx

可以通过访问http://服务器IP来验证 Nginx 是否正常启动。如果 Nginx 启动失败,可以查看/var/log/nginx/error.log日志文件,根据错误信息进行排查。​

2.1.3 配置 Tomcat 实例​

在每台 Tomcat 服务器上,修改server.xml文件,确保以下配置:​

        1、修改Connector的port属性,避免端口冲突。例如,在第二台服务器上,将8080改为8081。

<Connector port="8081" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />

        2、修改Server的port属性,如将8005改为8006,防止关闭命令端口冲突。

<Server port="8006" shutdown="SHUTDOWN">

修改完配置后,需要重启 Tomcat 服务,使配置生效。可以使用/usr/local/tomcat/bin/shutdown.sh停止 Tomcat,再使用/usr/local/tomcat/bin/startup.sh启动 Tomcat。

2.2 会话管理方案​

2.2.1 粘性会话​

粘性会话是指负载均衡器将同一个客户端的后续请求始终转发到同一台 Tomcat 服务器,以保持会话一致性。在 Nginx 中,可通过ip_hash指令实现粘性会话:

http {upstream tomcat_cluster {ip_hash;server 192.168.1.101:8080;server 192.168.1.102:8080;}# 省略其他配置
}

ip_hash指令根据客户端 IP 地址计算哈希值,将同一 IP 地址的请求固定转发到某一台服务器。但这种方式存在局限性,当某台服务器故障时,客户端会话可能丢失。为了提高可靠性,可以结合 Nginx 的健康检查机制,当检测到某台 Tomcat 服务器故障时,将该服务器从负载均衡列表中移除,避免将请求转发到故障服务器。​

2.2.2 Redis 共享会话​

Redis 是一种高性能的键值对存储数据库,可用于实现 Tomcat 集群的共享会话。​

        1、安装 Redis

sudo yum install redis

        2、配置 Redis:修改 Redis 配置文件/etc/redis.conf,主要配置如下:

bind 127.0.0.1 192.168.1.100  # 绑定服务器IP,确保Tomcat服务器可访问
protected-mode no  # 关闭保护模式(测试环境使用,生产环境需谨慎)

在生产环境中,不建议直接关闭protected-mode,可以通过设置密码(requirepass yourpassword)来提高 Redis 的安全性,同时只允许授权的 Tomcat 服务器访问 Redis。

        3、启动 Redis

sudo systemctl start redis

        4、在 Tomcat 中集成 Redis 共享会话:

  • 下载tomcat-redis-session-manager插件,将相关 jar 包放置在 Tomcat 的lib目录下。​
  • 修改 Tomcat 的context.xml文件(位于/usr/local/tomcat/conf/目录下),添加以下配置:
<Context><Manager className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /><Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /><Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"host="192.168.1.100"port="6379"database="0"maxInactiveInterval="60" />
</Context>

上述配置中,host和port指定 Redis 服务器的地址和端口,database指定使用的 Redis 数据库,maxInactiveInterval指定会话的最大非活动时间(单位:秒)。配置完成后,Tomcat 集群中的会话数据将存储在 Redis 中,实现会话共享,即使某台 Tomcat 服务器故障,客户端会话也不会丢失。 

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

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

相关文章

Linux(文件管理)

文件命名规则 除了字符“/”之外&#xff0c;所以的字符都可以使用&#xff0c;但要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;如&#xff1a;<、>、?、*等 如果一个文件名中包含了特殊字符&#xff0c;例如空格&#xff0c;那…

Windows服务器部署全攻略:Flask+Vue+MySQL跨平台项目实战(pymysql版)

当你的后端(Flask+pymysql,Windows开发)与前端(Vue,Mac开发)需要统一部署到Windows服务器时,通过「IIS反向代理+原生组件适配」方案可实现稳定交互。以下是针对Windows环境的专属部署指南,解决路径适配、服务启动等核心问题。 一、Windows服务器环境准备(必做!) 1…

wpf 输入框 在输入时去除水印

wpf ScrollViewer 在输入数据时去除水印 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;ScrollViewer控件通常用于显示滚动内容。如果你想在ScrollViewer中使用数据输入&#xff08;例如文本输入&#xff09;&#xff0c;并且希望在输入时去除水…

动态思维——AI与思维模型【91】

一、定义 动态思维思维模型是一种强调在思考问题和分析情况时&#xff0c;充分考虑到事物的变化性、发展性和相互关联性&#xff0c;不局限于静态的、孤立的视角&#xff0c;而是以发展变化的眼光看待事物&#xff0c;能够根据不同时间、环境和条件的变化&#xff0c;灵活调整…

多模态大语言模型arxiv论文略读(五十五)

MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文标题&#xff1a;MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文作者&#xff1a;Kunpeng Song, Yizhe Zhu, Bingchen Liu, Qing Yan, Ahmed Elgammal, Xiao…

Go-web开发之帖子功能

帖子功能 route.go r.Use(middleware.JWTAuthMiddleware()){r.POST("/post", controller.CreatePostHandler)r.GET("/post/:id", controller.GetPostDetailHandler)}post.go 定义帖子结构 type Post struct {Id int64 json:"id" …

C++ 项目中的多语言字符串管理方案(支持自动提示与动态加载)

&#x1f4ac; C 项目中的多语言字符串管理方案&#xff08;支持自动提示与动态加载&#xff09; 在中大型 C 应用中&#xff0c;我们常常会面临界面提示文本繁多、需要支持多语言切换的问题。为了解决字符串管理混乱、缺乏自动提示、难以维护等问题&#xff0c;本文将提供一种…

数控滑台:将制造业推向智能化的关键装备

随着制造业的不断发展和智能化进程的加速推进&#xff0c;数控滑台作为一种关键的装备&#xff0c;在各种工业生产中发挥着越来越重要的作用。数控滑台不仅提高了生产效率&#xff0c;节约了人力物力资源&#xff0c;还大大降低了生产过程中的错误率&#xff0c;保障了产品的质…

【STM32】定时器输入捕获

STM32 定时器输入捕获功能笔记 一、什么是输入捕获&#xff08;Input Capture&#xff09; 输入捕获是利用定时器的输入通道&#xff0c;在检测到信号电平变化&#xff08;如上升沿或下降沿&#xff09;时&#xff0c;立即将当前计数器的值捕获并保存到捕获寄存器&#xff08…

Qt通过QXlsx库文件写入到excl文件,读取excl文件

第一&#xff1a;下载QXlsx库文件 https://download.csdn.net/download/qq_32663053/90739425 第二&#xff1a;在Qt项目中引入QXlsx库&#xff0c;需要把QXlsx库文件放在项目文件夹下 第三&#xff1a;将tableview中的数据存入到excl文件 代码&#xff1a; void MainWindow…

【KWDB 创作者计划】一款面向 AIoT 的多模数据库实战体验

一、KWDB&#xff1a;AIoT 时代的数据库新选择 KWDB 是由开放原子开源基金会孵化的分布式多模数据库&#xff0c;专为物联网、工业互联网等场景设计。其核心价值在于时序与关系数据融合处理能力&#xff1a; ​多模统一引擎​&#xff1a;单个实例可同时建立时序库&#xff08…

【教学类-102-22】蝴蝶彩色1——通义万相“彩色蝴蝶”透明切边基础图片制作(五款板式、批量下载、修图、透明、切边)

一、下载图片 关键词&#xff1a;卡通简笔画&#xff0c;白色背景&#xff0c;黑白轮廓线&#xff0c;、鲜艳&#xff0c;彩色&#xff0c;一只蝴蝶&#xff0c;简单&#xff0c;可爱&#xff0c;矢量图&#xff0c;大。 简笔画 强度1 4:3(长方形适配A4纸&#xff09; 五…

【JAVA】方法定义与重载:JVM方法调用机制(8)

核心知识点详细解释 Java方法的定义和使用 在Java中&#xff0c;方法是一段具有特定功能的代码块&#xff0c;它可以接受参数并返回一个值。方法的定义包括方法的修饰符、返回类型、方法名、参数列表和方法体。其基本语法如下&#xff1a; 修饰符 返回类型 方法名(参数列表)…

基于STM32的带恒温系统智能外卖柜设计

标题:基于STM32的带恒温系统智能外卖柜设计 内容:1.摘要 随着外卖行业的迅速发展&#xff0c;对外卖存放设备的智能化和功能性要求日益提高。本设计的目的是开发一种基于STM32的带恒温系统智能外卖柜。方法上&#xff0c;以STM32微控制器为核心&#xff0c;结合温度传感器、加…

【综述】相位解包裹算法对比分析

引言 相位解包裹是基于干涉的位相测量技术中的重要环节&#xff0c;如合成孔径雷达干涉、光学干涉测量技术、医学成像技术、数字全息三维成像、相干衍射成像等技术中都涉及位相解包裹。位相解包裹也称为位相展开、位相解截断、位相解缠绕等。与之相反的过程谓之包裹位相、截断…

Rust 学习笔记:关于枚举与模式匹配的练习题

Rust 学习笔记&#xff1a;关于枚举与模式匹配的练习题 Rust 学习笔记&#xff1a;关于枚举与模式匹配的练习题以下程序能否通过编译&#xff1f;若能&#xff0c;输出是什么&#xff1f;考虑这两种表示结果类型的方式&#xff0c;若计算成功&#xff0c;则包含值 T&#xff1b…

C++负载均衡远程调用学习之QPS性能测试

目录 1.昨日回顾 2.QPS_TEST_PROTOBUF协议的集成 3.QPS_TEST_SERVER端实现 4.QPS_TEST_QPS简单介绍 5.QPS_TEST_QPS客户端工具编写和性能测试 1.昨日回顾 2.QPS_TEST_PROTOBUF协议的集成 ## 14) Reactor框架QPS性能测试 ​ 接下来我们写一个测试用例来测一下我们…

【MySQL数据库】视图

1&#xff0c;视图的基本介绍 视图是一个虚拟表&#xff0c;其内容由查询定义。与真实表一样的是&#xff0c;视图包含带有名称的列和行数据&#xff1b;与真实表不一样的是&#xff0c;视图本身并不在数据库中存储数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化…

Linux系统安装方式+适合初学者的发行版本

Linux系统安装方式适合初学者发行版—目录 一、Linux系统的安装方式1. 物理机直接安装2. 虚拟机安装3. 双系统安装4. Live USB试用5. 云服务器安装 二、适合初学者的Linux发行版1. Ubuntu2. Linux Mint3. Zorin OS4. Pop!_OS5. Elementary OS6. Fedora7. Manjaro 三、选择建议场…

Linux C++ JNI封装、打包成jar包供Java调用详细介绍

在前面 Android专栏 中详细介绍了如何在Android Studio中调用通过jni封装的c库。 在Android使用 opencv c代码&#xff0c;需要准备opencv4android&#xff0c;也就是c的任何代码&#xff0c;是使用Android NDK编译的&#xff0c;相当于在windows/mac上使用Android stdido交叉…