【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.pswp.cn/pingmian/79168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79168.shtml
英文地址,請注明出處:http://en.pswp.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交叉…