Linux系統之Tomcat服務

目錄

一、Tomcat概述

1、Tomcat介紹

2、Tomcat歷史

二、Tomcat原理分析

1、Http工作原理

2、Tomcat整體架構

3、Coyote連接器架構

4、Catalina容器架構

5、Jasper處理流程

6、JSP編譯過程

7、Tomcat啟動流程

8、Tomcat請求處理流程

三、Tomcat安裝與配置

1、單實例安裝

環境準備

防火墻與SELinux

JAVA環境

Tomcat下載

Tomcat解壓

Tomcat安裝

Tomcat啟動與關閉

Tomcat啟動驗證

Tomcat訪問

2、多實例環境配置

四、Tomcat配置文件詳解

1、配置文件目錄

2、server.xml 詳解

Server

Listener

GlobalNamingResources

Service

Executor

Connector

Engine

Host

Context

3、tomcat-users.xml 詳解

host-manager應用配置

manager應用配置

4、web.xml 詳解

ServletContext初始化參數

會話配置

Servlet配置

Listener配置

Filter配置

歡迎頁面配置

錯誤頁面配置

五、Tomcat高可用項目

1、項目概述

2、設計構架圖

3、實施流程

配置Tomcat

配置Nginx反向代理

訪問測試

如何解決session共享問題


一、Tomcat概述

1、Tomcat介紹

Tomcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發而成。由于有了Sun 的參與和支持,最新的Servlet 和JSP 規范總是能在Tomcat 中得到體現,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 規范。因為Tomcat 技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發商的認可,成為目前比較流行的Web 應用服務器。

Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。對于一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 服務器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的。

2、Tomcat歷史

  • Tomcat 最初由Sun公司的軟件架構師 James Duncan Davidson 開發,名稱為“JavaWebServer”。

  • 1999年,在 Davidson 的幫助下,該項目于1999年于apache軟件基金會旗下的JServ項目合并,并發布第一個版本(3.x),即是現在的Tomcat,該版本實現了Servlet2.2和JSP 1.1規范 。

  • 2001年,Tomcat 發布了4.0版本, 作為里程碑式的版本,Tomcat 完全重新設計了其架構,并實現了Servlet 2.3和JSP 1.2規范。

  • 目前 Tomcat 已經更新到 10.0.x版本,但是目前企業中的Tomcat服務器,主流版本還是7.x 和 8.x,所以本課程是基于 8.5 版本進行講解。

二、Tomcat原理分析

1、Http工作原理

HTTP協議(超文本傳輸協議)是瀏覽器與服務器之間的數據傳送協議。作為應用層協議,HTTP是基于TCP/IP協議來傳遞數據的(HTML文件、圖片、查詢結果等),HTTP協議不涉及數據包(Packet)傳輸,主要規定了客戶端和服務器之間的通信格式。它的整個過程如下圖所示:

  1. 用戶通過瀏覽器進行了一個操作,比如輸入網址并回車,或者是點擊鏈接,接著瀏覽器獲取了這個事件。

  2. 瀏覽器向服務端發出TCP連接請求。

  3. 服務程序接受瀏覽器的連接請求并經過TCP三次握手建立連接。

  4. 瀏覽器將請求數據打包成一個HTTP協議格式的數據包。

  5. 瀏覽器將該數據包推入網絡,數據包經過網絡傳輸,最終達到端服務程序。

  6. 服務端程序拿到這個數據包后,同樣以HTTP協議格式解包,獲取到客戶端的意圖。

  7. 得知客戶端意圖后進行處理,比如提供靜態文件或者調用服務端程序獲得動態結果。

  8. 服務器將響應結果(可能是HTML或者圖片等)按照HTTP協議格式打包。

  9. 服務器將響應數據包推入網絡,數據包經過網絡傳輸最終達到到瀏覽器。

  10. 瀏覽器拿到數據包后,以HTTP協議的格式解包,然后解析數據,假設這里的數據是 HTML。

  11. 瀏覽器將HTML文件展示在頁面上。

2、Tomcat整體架構

(了解)

Tomcat要實現兩個核心功能:

  1. 處理Socket連接,負責網絡字節流與Request和Response對象的轉化。

  2. 加載和管理Servlet,以及具體處理Request請求。

因此Tomcat設計了兩個核心組件連接器(Connector)和容器(Container)來分別做這 兩件事情。連接器負責對外交流,容器負責內部處理。

3、Coyote連接器架構

Coyote是Tomcat的連接器框架的名稱 , 是Tomcat服務器提供的供客戶端訪問的外部接口。客戶端通過Coyote與服務器建立連接、發送請求并接受響應 。

Coyote封裝了底層的網絡通信(Socket請求及響應處理),為Catalina容器提供了統一的接口,使Catalina容器與具體的請求協議及IO操作方式完全解耦。Coyote 將Socket輸入轉換封裝為Request對象,交由Catalina容器進行處理,處理請求完成后,Catalina通過Coyote提供的Response對象將結果寫入輸出流 。

Coyote作為獨立的模塊,只負責具體協議和IO的相關操作,與Servlet規范實現沒有直接關系,因此即便是Request和Response對象也并未實現Servlet規范對應的接口, 而是在Catalina中將他們進一步封裝為ServletRequest和ServletResponse。

在Coyote中,Tomcat支持的IO模型

IO模型描述
NIO非阻塞I/O,采用Java NIO類庫實現。
NIO2異步I/O,采用JDK 7最新的NIO2類庫實現。
APR采用Apache可移植運行庫實現,是C/C++編寫的本地庫。如果選擇該方案,需要單獨安裝APR庫。

在Coyote中,Tomcat支持的應用層協議

應用層協議描述
HTTP/1.1這是大部分Web應用采用的訪問協議。
AJP/1.3用于和Web服務器集成(如Apache),以實現對靜態資源的優化以及集群部署。
HTTP/2HTTP 2.0大幅度的提升了Web性能。下一代HTTP協議 , 自8.5以及9.0版本之后支持。

協議分層

在8.0之前,Tomcat 默認采用的I/O方式為 BIO,之后改為 NIO。 無論 NIO、NIO2還是 APR,在性能方面均優于以往的BIO。 如果采用APR,甚至可以達到 Apache HTTP Server的影響性能。

Tomcat為了實現支持多種I/O模型和應用層協議,一個容器可能對接多個連接器,就好比一個房間有多個門。但是單獨的連接器或者容器都不能對外提供服務,需要把它們組裝起來才能工作,組裝后這個整體叫作Service組件。這里請你注意,Service本身沒有做什么重要的事情,只是在連接器和容器外面多包了一層,把它們組裝在一起。Tomcat內可能有多個Service,這樣的設計也是出于靈活性的考慮。通過在Tomcat中配置多個Service,可以實現通過不同的端口號來訪問同一臺機器上部署的不同應用。

Coyote的主要組件結構:

Coyote的各個組件的作用:

  • EndPoint:Coyote 通信端點,即通信監聽的接口,是具體Socket接收和發送處理器,是對傳輸層的抽象,因此EndPoint用來實現TCP/IP協議的。Tomcat 并沒有EndPoint接口,而是提供了一個抽象類AbstractEndpoint,里面定義了兩個內部類:Acceptor和SocketProcessor。Acceptor用于監聽Socket連接請求。SocketProcessor用于處理接收到的Socket請求,它實現Runnable接口,在Run方法里調用協議處理組件Processor進行處理。為了提高處理力,SocketProcessor被提交到線程池來執行,而這個線程池叫作執行器(Executor)。

  • Processor:Coyote 協議處理接口,如果說EndPoint是用來實現TCP/IP協議的,那么Processor用來實現HTTP協議,Processor接收來自EndPoint的Socket,讀取字節流解析成Tomcat Request和Response對象,并通過Adapter將其提交到容器處理,Processor是對應用層協議的抽象。

  • ProtocolHandler:Coyote 協議接口,通過Endpoint和Processor,實現針對具體協議的處理能力。Tomcat按照協議和I/O 提供了6個實現類 : AjpNioProtocol、AjpNio2Protocol、AjpAprProtocol、Http11NioProtocol、Http11Nio2Protocol、Http11AprProtocol。我們在配置tomcat / conf / server.xml時,至少要指定具體的ProtocolHandler , 當然也可以指定協議名稱,如:HTTP/1.1,如果安裝了APR,那么將使用Http11AprProtocol,否則使用 Http11NioProtocol 。

  • Adapter:由于協議不同,客戶端發過來的請求信息也不盡相同,Tomcat定義了自己的Request類 來“存放”這些請求信息。ProtocolHandler接口負責解析請求并生成Tomcat Request類。 但是這個Request對象不是標準的ServletRequest,也就意味著,不能用Tomcat Request作為參數來調用容器。Tomcat設計者的解決方案是引入CoyoteAdapter,這是 適配器模式的經典運用,連接器調用CoyoteAdapter的Sevice方法,傳入的是Tomcat Request對象,CoyoteAdapter負責將Tomcat Request轉成ServletRequest,再調用容器的Service方法。

4、Catalina容器架構

Tomcat的模塊分層結構

Tomcat本質上就是一款 Servlet 容器,因此Catalina 才是 Tomcat 的核心,其他模塊都是為Catalina提供支撐的。比如:通過Coyote模塊提供連接通信,Jasper 模塊提供JSP引擎,Naming 提供JNDI 服務,Juli提供日志服務。

Catalina的主要組件結構(背會)

Catalina的各個組件的作用

  • Catalina

負責解析Tomcat的配置文件 , 以此來創建服務器Server組件,并根據 命令來對其進行管理。

  • Server

服務器表示整個Catalina Servlet容器以及其它組件,負責組裝并啟動Servlet引擎、Tomcat連接器。Server通過實現Lifecycle接口,提供了 一種優雅的啟動和關閉整個系統的方式。

  • Service

服務是Server內部的組件,一個Server包含多個Service。它將若干個Connector組件綁定到一個Container(Engine)上。

  • Connector

連接器主要是處理與客戶端的通信,它負責接收客戶請求,然后轉給相關的容器處理,最后向客戶返回響應結果。

  • Container

容器負責處理用戶的Servlet請求,并返回對象給web用戶的模塊。

Container的主要組件結構

Tomcat設計了4種容器,分別是Engine、Host、Context和Wrapper。這4種容器不是平行關系,而是父子關系。Tomcat通過一種分層的架構,使得Servlet容器具有很好的靈活性。

Container的各個組件的作用:

  • Engine

表示整個Catalina的Servlet引擎,用來管理多個虛擬站點,一個Service最多只能有一個Engine,但是一個引擎可包含多個Host。

  • Host

代表一個虛擬主機或者說一個站點,可以給Tomcat配置多個虛擬主機地址,而一個虛擬主機下可包含多個Context。

  • Context

表示一個Web應用程序, 一個Web應用可包含多個Wrapper。

  • Wrapper

表示一個Servlet,Wrapper 作為容器中的最底層,不能包含子容器。

我們也可以再通過Tomcat的server.xml配置文件來加深對Tomcat容器的理解。Tomcat采用了組件化的設計,它的構成組件都是可配置的,其中最外層的是Server,其他組件按照一定的格式要求配置在這個頂層容器中。

那么,Tomcat是怎么管理這些容器的呢?你會發現這些容器具有父子關系,形成一個樹形結構,你可能馬上就想到了設計模式中的組合模式。沒錯,Tomcat就是用組合模式來管理這些容器的。具體實現方法是,所有容器組件都實現了Container接口,因此組合模式可以使得用戶對單容器對象和組合容器對象的使用具有一致性。這里單容器對象指的是最底層的Wrapper,組合容器對象指的是上面的Context、Host或者Engine。

5、Jasper處理流程

Tomcat在默認的web.xml中配置了一個org.apache.jasper.servlet.JspServlet,用于處理所有的.jsp或 .jspx結尾的請求,該Servlet 實現即是運行時編譯的入口。

JspServlet 處理流程圖

如果在 tomcat/conf/web.xml 中配置了參數scratchdir,則jsp編譯后的結果,就會存儲在該目錄下 。 如果沒有配置該選項,則會將編譯后的結果,存儲在Tomcat安裝目錄下的 work/Catalina(Engine名稱)/localhost(Host名稱)/Context名稱 。

除了運行時編譯,我們還可以直接在Web應用啟動時, 一次性將Web應用中的所有的JSP頁面一次性編譯完成。在這種情況下,Web應用運行過程中,便可以不必再進行實時編譯,而是直接調用JSP頁面對應的Servlet完成請求處理, 從而提升系統性能。

Tomcat 提供了一個Shell程序JspC,用于支持JSP預編譯,而且在Tomcat的安裝目錄下提供了一個 catalina-tasks.xml 文件聲明了Tomcat 支持的Ant任務, 因此,我們很容易使用 Ant 來執行JSP 預編譯。(要想使用這種方式,必須得確保在此之前已經下載并安裝了Apache Ant)。

6、JSP編譯過程

Compiler 編譯工作主要包含代碼生成和編譯兩部分:

  • 代碼生成

  1. Compiler 通過一個 PageInfo 對象保存JSP 頁面編譯過程中的各種配置,這些配置可能來源于 Web 應用初始化參數, 也可能來源于JSP頁面的指令配置(如 page , include)。

  2. 調用ParserController 解析指令節點, 驗證其是否合法,同時將配置信息保存到 PageInfo 中, 用于控制代碼生成。

  3. 調用ParserController 解析整個頁面, 由于 JSP 是逐行解析, 所以對于每一行會創建一個具體的Node 對象。如靜態文本(TemplateText)、Java代碼(Scriptlet)、定制標簽(CustomTag)、Include指令(IncludeDirective)。

  4. 驗證除指令外其他所有節點的合法性, 如腳本、定制標簽、EL表達式等。

  5. 收集除指令外其他節點的頁面配置信息。

  6. 編譯并加載當前 JSP 頁面依賴的標簽。

  7. 對于JSP頁面的EL表達式,生成對應的映射函數。

  8. 生成JSP頁面對應的Servlet類源代碼 編譯 代碼生成完成后,Compiler還會生成 SMAP信息。 如果配置生成 SMAP信息,Compiler則會在編譯階段將SMAP信息寫到class文件中 。

  • 編譯階段

  1. Compiler的兩個實現 AntCompiler 和 JDTCompiler 分別調用先關框架的 API 進行源代碼編譯。

  2. 對于 AntCompiler 來說, 構造一個 Ant 的javac 的任務完成編譯。

  3. 對于 JDTCompiler 來說, 調用 org.eclipse.jdt.internal.compiler.Compiler 完成編譯。

7、Tomcat啟動流程

8、Tomcat請求處理流程

三、Tomcat安裝與配置

1、單實例安裝

環境準備

防火墻與SELinux
[root@tomcat ~]# systemctl disable --now firewalld 
[root@tomcat ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 
JAVA環境
#tomcat8可以使用系統中默認的java環境

Tomcat下載

[root@tomcat ~]# tar xf apache-tomcat-8.5.40.tar.gz

Tomcat解壓

https://tomcat.apache.org/download-80.cgi

Tomcat安裝

[root@tomcat ~]# mv apache-tomcat-8.5.40 /usr/local/tomcat8

Tomcat啟動與關閉

##優化啟動命令
[root@tomcat ~]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/local/bin/tomcat_start
##優化停止命令
[root@tomcat ~]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/local/bin/tomcat_stop

Tomcat啟動驗證

[root@tomcat ~]# netstat -anptu | grep java
tcp6 ? ? ? 0 ? ? ?0 127.0.0.1:8005 ? ? ? ?  :::* ? ? ? ? ? ? ? ? ?  LISTEN ? ? ?58186/java ? ? ? ? ?
tcp6 ? ? ? 0 ? ? ?0 :::8009 ? ? ? ? ? ? ? ? :::* ? ? ? ? ? ? ? ? ?  LISTEN ? ? ?58186/java ? ? ? ? ?
tcp6 ? ? ? 0 ? ? ?0 :::8080 ? ? ? ? ? ? ? ? :::* ? ? ? ? ? ? ? ? ?  LISTEN ? ? ?58186/java
##8005:關閉端口
##8009:AJP協議端口
##8080:HTTP協議端口

Tomcat訪問

#默認訪問目錄,APP存儲目錄
[root@tomcat webapps]# ls
docs  examples  host-manager  manager  ROOT

2、多實例環境配置

##復制多個tomcat應用程序
##修改對應的端口號

四、Tomcat配置文件詳解

1、配置文件目錄

[root@tomcat conf]# ls
Catalina ? ? ? ? catalina.properties  jaspic-providers.xml  logging.properties  tomcat-users.xml  web.xml
catalina.policy  context.xml ? ? ? ?  jaspic-providers.xsd  server.xml ? ? ? ?  tomcat-users.xsd

2、server.xml 詳解

<?xml version="1.0" encoding="UTF-8"?>
<!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements.  See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License.  You may obtain a copy of the License at
?http://www.apache.org/licenses/LICENSE-2.0
?Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may notdefine subcomponents such as "Valves" at this level.Documentation at /docs/config/server.html-->
<Server port="8005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><!-- Security listener. Documentation at /docs/config/listeners.html<Listener className="org.apache.catalina.security.SecurityListener" />--><!--APR library loader. Documentation at /docs/apr.html --><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /><!-- Prevent memory leaks due to use of particular java/javax APIs--><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
?<!-- Global JNDI resourcesDocumentation at /docs/jndi-resources-howto.html--><GlobalNamingResources><!-- Editable user database that can also be used byUserDatabaseRealm to authenticate users--><Resource name="UserDatabase" auth="Container"type="org.apache.catalina.UserDatabase"description="User database that can be updated and saved"factory="org.apache.catalina.users.MemoryUserDatabaseFactory"pathname="conf/tomcat-users.xml" /></GlobalNamingResources>
?<!-- A "Service" is a collection of one or more "Connectors" that sharea single "Container" Note:  A "Service" is not itself a "Container",so you may not define subcomponents such as "Valves" at this level.Documentation at /docs/config/service.html--><Service name="Catalina">
?<!--The connectors can use a shared executor, you can define one or more named thread pools--><!--<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="150" minSpareThreads="4"/>-->
?
?<!-- A "Connector" represents an endpoint by which requests are receivedand responses are returned. Documentation at :Java HTTP Connector: /docs/config/http.htmlJava AJP  Connector: /docs/config/ajp.htmlAPR (HTTP/AJP) Connector: /docs/apr.htmlDefine a non-SSL/TLS HTTP/1.1 Connector on port 8080--><Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" /><!-- A "Connector" using the shared thread pool--><!--<Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />--><!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443This connector uses the NIO implementation. The defaultSSLImplementation will depend on the presence of the APR/nativelibrary and the useOpenSSL attribute of theAprLifecycleListener.Either JSSE or OpenSSL style configuration may be used regardless ofthe SSLImplementation selected. JSSE style configuration is used below.--><!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="conf/localhost-rsa.jks"type="RSA" /></SSLHostConfig></Connector>--><!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2This connector uses the APR/native implementation which always usesOpenSSL for TLS.Either JSSE or OpenSSL style configuration may be used. OpenSSL styleconfiguration is used below.--><!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"maxThreads="150" SSLEnabled="true" ><UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /><SSLHostConfig><Certificate certificateKeyFile="conf/localhost-rsa-key.pem"certificateFile="conf/localhost-rsa-cert.pem"certificateChainFile="conf/localhost-rsa-chain.pem"type="RSA" /></SSLHostConfig></Connector>-->
?<!-- Define an AJP 1.3 Connector on port 8009 --><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
?
?<!-- An Engine represents the entry point (within Catalina) that processesevery request.  The Engine implementation for Tomcat stand aloneanalyzes the HTTP headers included with the request, and passes themon to the appropriate Host (virtual host).Documentation at /docs/config/engine.html -->
?<!-- You should set jvmRoute to support load-balancing via AJP ie :<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">--><Engine name="Catalina" defaultHost="localhost">
?<!--For clustering, please take a look at documentation at:/docs/cluster-howto.html  (simple how to)/docs/config/cluster.html (reference documentation) --><!--<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>-->
?<!-- Use the LockOutRealm to prevent attempts to guess user passwordsvia a brute-force attack --><Realm className="org.apache.catalina.realm.LockOutRealm"><!-- This Realm uses the UserDatabase configured in the global JNDIresources under the key "UserDatabase".  Any editsthat are performed against this UserDatabase are immediatelyavailable for use by the Realm.  --><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm>
?<Host name="www.jx1.com" ?appBase="webapps/jx1"unpackWARs="true" autoDeploy="true">
?<!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />-->
?<!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="jx1_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" />
?</Host>
?<Host name="www.jx2.com" ?appBase="webapps/jx2"unpackWARs="true" autoDeploy="true">
?<!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />-->
?<!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="jx2_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" />
?</Host>
?</Engine></Service><Service name="Catalina1">
?<!--The connectors can use a shared executor, you can define one or more named thread pools--><!--<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="150" minSpareThreads="4"/>-->
?
?<!-- A "Connector" represents an endpoint by which requests are receivedand responses are returned. Documentation at :Java HTTP Connector: /docs/config/http.htmlJava AJP  Connector: /docs/config/ajp.htmlAPR (HTTP/AJP) Connector: /docs/apr.htmlDefine a non-SSL/TLS HTTP/1.1 Connector on port 8080--><Connector port="8081" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8444" /><!-- A "Connector" using the shared thread pool--><!--<Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />--><!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443This connector uses the NIO implementation. The defaultSSLImplementation will depend on the presence of the APR/nativelibrary and the useOpenSSL attribute of theAprLifecycleListener.Either JSSE or OpenSSL style configuration may be used regardless ofthe SSLImplementation selected. JSSE style configuration is used below.--><!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="conf/localhost-rsa.jks"type="RSA" /></SSLHostConfig></Connector>--><!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2This connector uses the APR/native implementation which always usesOpenSSL for TLS.Either JSSE or OpenSSL style configuration may be used. OpenSSL styleconfiguration is used below.--><!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"maxThreads="150" SSLEnabled="true" ><UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /><SSLHostConfig><Certificate certificateKeyFile="conf/localhost-rsa-key.pem"certificateFile="conf/localhost-rsa-cert.pem"certificateChainFile="conf/localhost-rsa-chain.pem"type="RSA" /></SSLHostConfig></Connector>-->
?<!-- Define an AJP 1.3 Connector on port 8009 --><Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
?
?<!-- An Engine represents the entry point (within Catalina) that processesevery request.  The Engine implementation for Tomcat stand aloneanalyzes the HTTP headers included with the request, and passes themon to the appropriate Host (virtual host).Documentation at /docs/config/engine.html -->
?<!-- You should set jvmRoute to support load-balancing via AJP ie :<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">--><Engine name="Catalina1" defaultHost="localhost">
?<!--For clustering, please take a look at documentation at:/docs/cluster-howto.html  (simple how to)/docs/config/cluster.html (reference documentation) --><!--<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>-->
?<!-- Use the LockOutRealm to prevent attempts to guess user passwordsvia a brute-force attack --><Realm className="org.apache.catalina.realm.LockOutRealm"><!-- This Realm uses the UserDatabase configured in the global JNDIresources under the key "UserDatabase".  Any editsthat are performed against this UserDatabase are immediatelyavailable for use by the Realm.  --><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm>
?<Host name="www.jx3.com" ?appBase="webapps/jx3"unpackWARs="true" autoDeploy="true">
?<!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />-->
?<!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="jx3_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" />
?</Host>
?<Host name="www.jx4.com" ?appBase="webapps/jx4"unpackWARs="true" autoDeploy="true">
?<!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />-->
?<!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="jx4_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" />
?</Host>
?</Engine></Service>
</Server>

Server

Server是server.xml的根元素,用于創建一個Server實例,默認使用的實現類是 org.apache.catalina.core.StandardServer。

<Server port="8005" shutdown="SHUTDOWN">
...
</Server>

標簽屬性和子元素:

  • port:Tomcat 監聽的關閉服務器的端口。

  • shutdown:關閉服務器的指令字符串。

  • Server內嵌的子元素為 Listener、GlobalNamingResources、Service。

Listener

默認配置的5個Listener的含義:

<!‐‐ 用于以日志形式輸出服務器 、操作系統、JVM的版本信息 ‐‐>
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
?
<!‐‐ 用于加載(服務器啟動) 和 銷毀 (服務器停止) APR。 如果找不到APR庫, 則會輸出日志, 并不影響Tomcat啟動 ‐‐>
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
?
<!‐‐ 用于避免JRE內存泄漏問題 ‐‐>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
?
<!‐‐ 用戶加載(服務器啟動) 和 銷毀(服務器停止) 全局命名服務 ‐‐>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
?
<!‐‐ 用于在Context停止時重建Executor 池中的線程, 以避免ThreadLocal 相關的內存泄漏 ‐‐>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

GlobalNamingResources

GlobalNamingResources中定義了全局命名服務:

<GlobalNamingResources><!‐‐ 可編輯的用戶數據庫,UserDatabaseRealm也可以使用該數據庫對用戶進行身份驗證 ‐‐><Resource   name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat‐users.xml" />
</GlobalNamingResources>

Service

該元素用于創建 Service 實例,默認使用 org.apache.catalina.core.StandardService。默認情況下,Tomcat 僅指定了Service 的名稱, 值為 “Catalina”。Service 可以內嵌的元素為 : Listener、Executor、Connector、Engine,其中 : Listener 用于為Service添加生命周期監聽器, Executor 用于配置Service 共享線程池,Connector 用于配置Service 包含的鏈接器, Engine 用于配置Service中鏈接器對應的Servlet 容器引擎。一個Server服務器,可以包含多個Service服務。

<Service name="Catalina">
...
</Service>
Executor

默認情況下,Service 并未添加共享線程池配置。 如果我們想添加一個線程池, 可以在 下添加如下配置:

<Executor ? name="tomcatThreadPool" namePrefix="catalina‐exec‐" maxThreads="200" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5"className="org.apache.catalina.core.StandardThreadExecutor" />

標簽屬性和子元素:

  • name:線程池名稱,用于Connector中指定。

  • namePrefix:所創建的每個線程的名稱前綴,一個單獨的線程名稱為 namePrefix+threadNumber。

  • maxThreads:池中最大線程數。

  • minSpareThreads:活躍線程數,也就是核心池線程數,這些線程不會被銷毀,會一直存在。

  • maxIdleTime:線程空閑時間,超過該時間后,空閑線程會被銷毀,默認值為6000(1分鐘),單位毫秒。

  • maxQueueSize:在被執行前最大線程排隊數目,默認為Int的最大值,也就是廣義的無限。除非特殊情況,這個值不需要更改, 否則會有請求不會被處理的情況發生。

  • prestartminSpareThreads:啟動線程池時是否啟動 minSpareThreads部分線程。 默認值為false,即不啟動。

  • threadPriority:線程池中線程優先級,默認值為5,值從1到10。

  • className:線程池實現類,未指定情況下,默認實現類為 org.apache.catalina.core.StandardThreadExecutor。 如果想使用自定義線程池首先需要實現 org.apache.catalina.Executor接口。

Connector

Connector 用于創建鏈接器實例。默認情況下,server.xml 配置了兩個鏈接器,一個支持HTTP協議,一個支持AJP協議。因此大多數情況下,我們并不需要新增鏈接器配置, 只是根據需要對已有鏈接器進行優化。

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

標簽屬性和子元素:

  • port:端口號,Connector 用于創建服務端Socket 并進行監聽, 以等待客戶端請求鏈接。如果該屬性設置為0,Tomcat將會隨機選擇一個可用的端口號給當前Connector使用。

  • protocol:當前Connector 支持的訪問協議。 默認為 HTTP/1.1,并采用自動切換機制選擇一個基于 JAVA NIO 的鏈接器或者基于本地APR的鏈接器(根據本地是否含有Tomcat的本地庫判定)。如果不希望采用上述自動切換的機制, 而是明確指定協議, 可以使用以下值。

Http協議:

org.apache.coyote.http11.Http11NioProtocol  ,非阻塞式 Java NIO 鏈接器
org.apache.coyote.http11.Http11Nio2Protocol ,非阻塞式 JAVA NIO2 鏈接器
org.apache.coyote.http11.Http11AprProtocol  ,APR 鏈接器

AJP協議:

org.apache.coyote.ajp.AjpNioProtocol  ,非阻塞式 Java NIO 鏈接器
org.apache.coyote.ajp.AjpNio2Protocol ,非阻塞式 JAVA NIO2 鏈接器
org.apache.coyote.ajp.AjpAprProtocol  ,APR 鏈接器
  • connectionTimeout:Connector接收連接后的等待超時時間, 單位為毫秒。 -1 表示不超時。

  • redirectPort:當前Connector 不支持SSL請求, 接收到了一個請求, 并且也符合 security-constraint 約束, 需要SSL傳輸,Catalina自動將請求重定向到指定的端口。

  • executor:指定共享線程池的名稱, 也可以通過maxThreads、minSpareThreads 等屬性配置內部線程池。

  • URIEncoding:用于指定編碼URI的字符編碼, Tomcat8.x版本默認的編碼為UTF-8 , Tomcat7.x版本默認為ISO-8859-1。

  • maxThreads:池中最大線程數。

  • minSpareThreads:活躍線程數,也就是核心池線程數,這些線程不會被銷毀,會一直存在。

  • acceptCount:接收的連接數。

  • maxConnections:接收的最大連接數。

  • compression:是否壓縮。

  • compressionMinSize:壓縮的大小。

  • disableUploadTimeout:禁用上傳超時。

完整的配置如下:

<Connector ?port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool" URIEncoding="UTF‐8"maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="1000" compression="on" compressionMinSize="2048"disableUploadTimeout="true" />

Engine

Engine 作為Servlet 引擎的頂級元素,內部可以嵌入: Cluster、Listener、Realm、 Valve和Host。

<Engine name="Catalina" defaultHost="localhost">
...
</Engine>

標簽屬性和子元素:

  • name: 用于指定Engine的名稱, 默認為Catalina 。該名稱會影響一部分Tomcat的存儲路徑(如臨時文件)。

  • defaultHost : 默認使用的虛擬主機名稱, 當客戶端請求指向的主機無效時, 將交由默認的虛擬主機處理, 默認為localhost。

Host

Host 元素用于配置一個虛擬主機, 它支持以下嵌入元素:Alias、Cluster、Listener、Valve、Realm、Context。

如果在Engine下配置Realm, 那么此配置將在當前Engine下的所有Host中共享。 同樣,如果在Host中配置Realm , 則在當前Host下的所有Context中共享。

Context中的Realm優先級 > Host 的Realm優先級 > Engine中的Realm優先級。

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">...
</Host>

標簽屬性和子元素:

  • name:當前Host通用的網絡名稱,必須與DNS服務器上的注冊信息一致。 Engine中包含的Host必須存在一個名稱與Engine的defaultHost設置一致。

  • appBase:當前Host的應用基礎目錄,當前Host上部署的Web應用均在該目錄下(可以是絕對目錄,相對路徑),默認為webapps。

  • unpackWARs:設置為true,Host在啟動時會將appBase目錄下war包解壓為目錄。設置為false, Host將直接從war文件啟動。

  • autoDeploy:控制tomcat是否在運行時定期檢測并自動部署新增或變更的web應用。

通過給Host添加別名,我們可以實現同一個Host擁有多個網絡名稱,配置如下:

<Host name="www.web1.com" appBase="webapps" unpackWARs="true" autoDeploy="true"><Alias>www.web2.com</Alias>
</Host>

這個時候,我們就可以通過兩個域名訪問當前Host下的應用(需要確保DNS或hosts中添加了域名的映射配置)。

Context

Context 用于配置一個Web應用,默認的配置如下:

<Context docBase="myApp" path="/myApp">....
</Context>

標簽屬性和子元素:

  • docBase:Web應用目錄或者War包的部署路徑。可以是絕對路徑,也可以是相對于Host appBase的相對路徑。

  • path:Web應用的Context 路徑。如果我們Host名為localhost, 則該web應用訪問的根路徑為: http://localhost:8080/myApp。

  • 它支持的內嵌元素為:CookieProcessor, Loader, Manager,Realm,Resources,WatchedResource,JarScanner,Valve。

簡單的舉例:

<Host name="www.tomcat.com" appBase="webapps" unpackWARs="true" autoDeploy="true"><Context docBase="myApp" path="/myApp"></Context><Valve ?className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

3、tomcat-users.xml 詳解

host-manager應用配置

Tomcat啟動之后,可以通過 http://localhost:8080/host-manager/html 訪問該Web應用。 host-manager 默認添加了訪問權限控制,當打開網址時,需要輸入用戶名和密碼(conf/tomcat-users.xml中配置) 。所以要想訪問該頁面,需要在conf/tomcat-users.xml 中配置,并分配對應的角色:

<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="admin" password="123456" roles="admin-gui,admin-script"/>

標簽屬性和子元素:

  • admin-gui:用于控制頁面訪問權限。

  • admin-script:用于控制以簡單文本的形式進行訪問。

啟動Tomcat,然后點擊host-manager。

manager應用配置

manager的訪問地址為 http://localhost:8080/manager,同樣,manager也添加了頁面訪問控制,所以要想訪問該頁面,需要在conf/tomcat-users.xml 中配置,并分配對應的角色:

<role rolename="admin‐gui" />
<role rolename="admin‐script" />
<role rolename="manager‐gui" />
<role rolename="manager‐script" />
<user username="admin" password="123456" roles="admin-script,admin-gui,manager-gui,manager-script" />

啟動Tomcat,然后點擊manager。

4、web.xml 詳解

(了解)

web.xml 是web應用的描述文件, 它支持的元素及屬性來自于Servlet 規范定義 。 在Tomcat 中, Web 應用的描述信息包括 tomcat/conf/web.xml 中默認配置以及 Web應用 WEB-INF/web.xml 下的定制配置。

ServletContext初始化參數

我們可以通過 添加ServletContext 初始化參數,它配置了一個鍵值對,這樣我們可以在應用程序中使用 javax.servlet.ServletContext.getInitParameter()方法獲取參數。舉例如下:

<context‐param><param‐name>contextConfigLocation</param‐name><param‐value>classpath:applicationContext‐*.xml</param‐value><description>Spring Config File Location</description>
</context‐param>

標簽屬性和子元素:

  • param‐name:初始化參數名稱。

  • param‐value:初始化參數的值。

  • description:這個參數的描述信息。

會話配置

(了解)

用于配置Web應用會話,包括超時時間、Cookie配置以及會話追蹤模式。它將覆蓋server.xml 和 context.xml 中的配置。舉例如下:

<session-config><session-timeout>30</session‐timeout><cookie-config><name>JESSIONID</name><domain>www.baidu.cn</domain><path>/</path><comment>Session Cookie</comment><http-only>true</http‐only><secure>false</secure><max-age>3600</max‐age></cookie‐config><tracking-mode>COOKIE</tracking‐mode>
</session‐config>

標簽屬性和子元素:

  • session-timeout: 會話超時時間,單位:分鐘。

  • cookie-config:用于配置會話追蹤Cookie。

    • name:Cookie的名稱。

    • domain:Cookie的域名。

    • path:Cookie的路徑。

    • comment:Cookie的注釋。

    • http-only:Cookie只能通過HTTP方式進行訪問,JS無法讀取或修改,此項可以增 加網站訪問的安全性。

    • secure:此Cookie只能通過HTTPS連接傳遞到服務器,而HTTP連接則不會傳遞該信息。注意是從瀏覽器傳遞到服務器,服務器端的Cookie對象不受此項影響。

    • max-age:以秒為單位表示cookie的生存期,默認為‐1表示是會話Cookie,瀏覽器 關閉時就會消失。

  • tracking-mode:用于配置會話追蹤模式,Servlet3.0版本中支持的追蹤模式: COOKIE、URL、SSL。

Servlet配置

(了解)

Servlet 的配置主要是兩部分, servlet 和 servlet-mapping :

<servlet><servlet-name>myServlet</servlet‐name><servlet-class>com.caochenlei.MyServlet</servlet‐class><init-param><param-name>fileName</param‐name><param-value>init.conf</param‐value></init‐param><load-on-startup>1</load‐on‐startup><enabled>true</enabled>
</servlet>
<servlet-mapping><servlet-name>myServlet</servlet‐name><url-pattern>*.do</url‐pattern><url-pattern>/myservet/*</url‐pattern>
</servlet‐mapping>

標簽屬性和子元素:

servlet:

  • servlet-name:指定servlet的名稱, 該屬性在web.xml中唯一。

  • servlet-class:用于指定servlet類名。

  • init-param:用于指定servlet的初始化參數, 在應用中可以通過 HttpServlet.getInitParameter 獲取。

    • param-name:初始化參數名稱。

    • param-value:初始化參數的值。

  • load-on-startup:用于控制在Web應用啟動時,Servlet的加載順序, 值小于0,web應用啟動時,不加載該servlet,第一次訪問時加載。

  • enabled:若為false,表示Servlet不處理任何請求。

servlet-mapping:

  • servlet-name:你想要讓哪個servlet處理,這里就寫哪個servlet名稱。

  • url-pattern:用于指定URL表達式,一個 servlet‐mapping可以同時配置多個 url‐ pattern。

servlet 中文件上傳配置:

<servlet><servlet-name>uploadServlet</servlet‐name><servlet-class>com.caochenlei.UploadServlet</servlet‐class><multipart-config><location>C://path</location><max-file-size>10485760</max‐file‐size><max-request-size>10485760</max‐request‐size><file-size-threshold>0</file‐size‐threshold></multipart‐config>
</servlet>

標簽屬性和子元素:

  • multipart-config:上傳的配置

    • location:存放生成的文件地址。

    • max-file-size:允許上傳的文件最大值。 默認值為‐1, 表示沒有限制。

    • max-request-size:針對該 multi/form‐data 請求的最大數量,默認值為‐1, 表示無限制。

    • file-size-threshold:當數量量大于該值時, 內容會被寫入文件。

Listener配置

Listener用于監聽servlet中的事件,例如context、request、session對象的創建、修改、刪除,并觸發響應事件。Listener是觀察者模式的實現,在servlet中主要用于對context、request、session對象的生命周期進行監控。在servlet2.5規范中共定義了8中Listener。在啟動時,ServletContextListener 的執行順序與web.xml 中的配置順序一致, 停止時執行順序相反。

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener‐class>
</listener>

標簽屬性和子元素:

  • listener-class:用于指定監聽的類,該類必須實現Listener接口

Filter配置

filter 用于配置web應用過濾器, 用來過濾資源請求及響應。 經常用于認證、日志、加密、數據轉換等操作, 配置如下:

<filter><filter-name>myFilter</filter‐name><filter-class>com.caochenlei.MyFilter</filter‐class><async-supported>true</async‐supported><init-param><param-name>language</param‐name><param-value>CN</param‐value></init‐param>
</filter>
<filter-mapping><filter-name>myFilter</filter‐name><url-pattern>/*</url‐pattern>
</filter‐mapping>

標簽屬性和子元素:

filter:

  • filter-name:用于指定過濾器名稱,在web.xml中,過濾器名稱必須唯一。

  • filter-class:過濾器的全限定類名,該類必須實現Filter接口。

  • async-supported:該過濾器是否支持異步。

  • init-param:用于配置Filter的初始化參數, 可以配置多個, 可以通過FilterConfig.getInitParameter獲取。

    • param-name:初始化參數名稱。

    • param-value:初始化參數的值。

filter-mapping:

  • filter-name:這里指的是你想使用哪個過濾器進行過濾就寫哪個過濾器的名稱。

  • url-pattern:指定該過濾器需要攔截的URL。

歡迎頁面配置

welcome-file-list 用于指定web應用的歡迎文件列表。嘗試請求的順序,從上到下。

<welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file>
</welcome-file-list>

錯誤頁面配置

error-page 用于配置Web應用訪問異常時定向到的頁面,支持HTTP響應碼和異常類兩種形式。

<error-page><error-code>404</error‐code><location>/404.html</location>
</error‐page>
<error-page><error-code>500</error‐code><location>/500.html</location>
</error‐page>
<error-page><exception-type>java.lang.Exception</exception‐type><location>/error.jsp</location>
</error‐page>

五、Tomcat高可用項目

1、項目概述

由于單臺Tomcat的承載能力是有限的,當我們的業務系統用戶量比較大,請求壓力比較大時,單臺Tomcat是扛不住的,這個時候,就需要搭建Tomcat的集群,而目前比較流程的做法就是通過Nginx來實現Tomcat集群的負載均衡。

2、設計構架圖

3、實施流程

配置Tomcat

##參照多實例配置

配置Nginx反向代理

http {log_format  main ?'$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
?access_log  /var/log/nginx/access.log  main;
?sendfile ? ? ? ? ?  on;tcp_nopush ? ? ? ?  on;tcp_nodelay ? ? ? ? on;keepalive_timeout ? 65;types_hash_max_size 4096;
?include ? ? ? ? ? ? /etc/nginx/mime.types;default_type ? ? ?  application/octet-stream;
?# Load modular configuration files from the /etc/nginx/conf.d directory.# See http://nginx.org/en/docs/ngx_core_module.html#include# for more information.include /etc/nginx/conf.d/*.conf;upstream tomcats {server 192.168.115.111:8080;server 192.168.115.111:8081;}
?server {listen ? ? ? 80;listen ? ? ? [::]:80;server_name  _;#root ? ? ? ? /usr/share/nginx/html;location / {proxy_pass http://tomcats;proxy_set_header  Host $host;}# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;
?error_page 404 /404.html;location = /404.html {}
?error_page 500 502 503 504 /50x.html;location = /50x.html {}}

訪問測試

###

如何解決session共享問題

方案一:ip_hash 策略

通過修改Nginx配置文件,讓每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。 例如:

方案二:session 復制

在每臺Tomcat的 conf/server.xml 配置如下:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

在每臺Tomcat部署的應用程序中,例如:servlet_demo 的 web.xml 中加入如下配置 :

<distributable/>

注意:上述方案,適用于較小的集群環境(節點數不超過4個),如果集群的節點數比較多的話,通過這種廣播的形式來完成Session的復制,會消耗大量的網絡帶寬,影響服務的性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912555.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912555.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FPGA芯片的供電

FPGA芯片的供電 文章目錄 FPGA芯片的供電1. 外部端口供電機制2. 內部邏輯供電機制3. 專有電路供電機制4. 電源穩定性討論總結 1. 外部端口供電機制 FPGA是專門用于數字系統設計的芯片&#xff0c;能夠正確、可靠、高效地和外界其他數字電路進行通信是FPGA芯片必備的一個功能。…

構建可無限擴展的系統:基于 FreeMarker + 存儲過程 + Spring Boot 的元數據驅動架構設計

在構建面向多行業、多客戶的大型業務系統時&#xff0c;系統的靈活性與擴展能力成為架構設計的核心目標。傳統硬編碼的開發方式在面對高頻變化、復雜組合查詢、多租戶自定義字段時&#xff0c;往往難以適應。 為了解決上述問題&#xff0c;我們提出一種 以 FreeMarker 腳本托管…

2-深度學習挖短線股-3-訓練數據計算

2-3 合并輸入特征 首先定義了數據預處理函數&#xff0c;將連續 n 天的 K 線數據&#xff08;如開盤價、收盤價、成交量等&#xff09;合并為一行特征&#xff0c;同時保留對應的目標標簽&#xff08;buy 列&#xff0c;表示是否應該買入&#xff09;&#xff1b;然后讀取股票代…

SpringMVC系列(四)(請求處理的十個實驗(下))

0 引言 作者正在學習SpringMVC相關內容&#xff0c;學到了一些知識&#xff0c;希望分享給需要短時間想要了解SpringMVC的讀者朋友們&#xff0c;想用通俗的語言講述其中的知識&#xff0c;希望與諸位共勉&#xff0c;共同進步&#xff01; 本系列會持續更新&#xff01;&…

產線通信“變形記”:PROFIBUS-DP與ETHERNET/IP的食品飲料跨界融合

在食品飲料加工行業&#xff0c;為實現不同設備間高效通信&#xff0c;JH-PB-EIP疆鴻智能PROFIBUS DP轉ETHERNET/IP網關發揮著關鍵作用。西門子PLC常采用PROFIBUS DP協議&#xff0c;而碼垛機器人等設備多使用ETHERNET/IP協議&#xff0c;網關成為連接二者的橋梁。 將DP作為從站…

設計模式-觀察者模式(發布訂閱模式)

一、需要的類 一個發布類&#xff1a;里面一個是別人需要訂閱的屬性&#xff0c;以及用于存儲訂閱者的list&#xff0c;attach方法是往list集合里面添加元素&#xff0c;notifyObservers通知方法&#xff0c;也就是循環調用訂閱者里面的一個方法&#xff0c;這個notifyObserve…

Linux測試是否能聯網

ping百度看是否有返回包&#xff1a; ping www.baidu.com ping -c可以通過參數提前設置發送的包數量&#xff1a; ping -c 4 www.baidu.com 終止ping快捷鍵&#xff1a; 按下 Ctrl C&#xff1a;立即終止ping進程&#xff0c;并顯示統計信息。按下 Ctrl Z&#xff1a;將進…

TOGAF? 架構分區:優秀架構的秘密

TOGAF &#xff08;The Open Group架構框架&#xff09;已成為企業架構事實上的全球標準, 是世界上使用最廣泛的企業架構框架。 它為企業 IT 架構的設計、規劃、實施和管理提供了一套全面的方法和工具。但是&#xff0c;即使是經驗豐富的架構師也經常會忽略 TOGAF 中隱藏的寶…

如何讓視頻在特定的網站上播放/禁止播放?(常見的視頻防盜鏈技術之一)

一、需求背景 在各行各業中,不論是教育、貿易還是醫療領域,視頻內容都存在被盜用的風險。為加強視頻安全性,我們可以采取特殊設置措施,例如限制視頻僅在高安全性網站播放,或屏蔽高風險網站。那么,具體有哪些方法可以有效保護視頻安全呢? 二、需求解決 通過OVP防盜鏈技…

如何調鼠標的靈敏度 快速調節超簡單

鼠標靈敏度是指鼠標在移動時&#xff0c;指針在屏幕上移動的速度。適當的鼠標靈敏度不僅能夠提高工作效率&#xff0c;還能減少手部疲勞&#xff0c;優化游戲體驗。那么不同的使用場景&#xff0c;鼠標靈敏度怎么調呢&#xff1f;本文將詳細探討如何調整鼠標靈敏度&#xff0c;…

基于單次常規腦MRI的深度學習檢測多發性硬化癥急性和亞急性病變活動性|文獻速遞-最新論文分享

Title 題目 Deep learning detection of acute and sub-acute lesion activity from single-timepoint conventional brain MRI in multiple sclerosis 基于單次常規腦MRI的深度學習檢測多發性硬化癥急性和亞急性病變活動性 01 文獻速遞介紹 多發性硬化癥&#xff08;MS&am…

CloudFormation 實現 GitHub Actions OIDC 與 AWS ECR 的安全集成

引言:現代 CI/CD 的安全挑戰 在容器化應用部署流程中,傳統長期憑證管理已成為主要安全痛點。本文將詳細介紹如何通過 AWS CloudFormation 實現 GitHub Actions 與 Amazon ECR 的安全集成,利用 OIDC(OpenID Connect)技術消除長期憑證風險,構建符合企業級安全標準的 CI/CD…

JMeter常用斷言方式

簡介 接口斷言是接口測試中用于驗證響應結果是否符合預期的關鍵機制&#xff0c;根據業務需求編寫腳本添加斷言&#xff0c;可驗證接口的正確性。以下內容僅記錄常用的斷言方式&#xff0c;多個接口都有斷言時可以使用事務控制器來隔離不同的斷言。 斷言方式 1、響應斷言 1.…

web服務器搭建nginx

1 配置主機ip 1.1獲取主機ip ip a rootpc:/home/ruxin# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft foreve…

ubuntu ollama 遇到的若干問題

服務器原先有ollama&#xff0c;想要重裝&#xff0c;遇到一系列問題 安裝下載連接&#xff1a;https://github.com/ollama/ollama/blob/main/docs/linux.md模型下載鏈接&#xff1a;https://ollama.com/library/deepseek-r1:1.5b 一、安裝新的ollama 在root用戶下操作 1.卸…

Linux: errno: EMSGSIZE 5

最近看到一個envoy在發送UDP包時返回的錯誤:sendmsg failed with error code 5 這里的error code 5其實是,envoy自己定義的error code: case SOCKET_ERROR_MSG_SIZE:return IoErrorCode::MessageTooBig;class IoError {public:enum class

深度剖析 LNK 參數隱藏攻擊 (ZDI-CAN-25373)

1、漏洞描述 ZDI-CAN-25373 是一個 Windows 快捷方式文件(.LNK)漏洞,它允許攻擊者通過精心制作的惡意快捷方式文件來執行隱藏的惡意命令。攻擊者通過在 .LNK 文件的 COMMAND_LINE_ARGUMENTS 結構中填充大量空白字符(如空格、水平制表符、換行符等)來隱藏惡意命令。這些填…

Linux操作系統筆記3

接口管理命令&#xff1a; ip命令 字符終端 nmcli命令 字符終端 nmtui命令 可視化終端 ip命令&#xff1a; 使用 ip 命令可以配置臨時網絡的連接信息&#xff0c;相關命令如下&#xff1a; ip link&#xff1a;顯示網絡設備運行狀態 ip -s link&#xff1a;顯示更詳細的設備信…

Vue3 根據路由配置實現動態菜單

前言 最近在學習Vue3的相關語法&#xff0c;在閱讀官方文檔的時候覺得官方文檔的菜單欄比較簡潔美觀&#xff0c;于是想著能不能自己實現一個類似的多級菜單。代碼大部分由AI所做&#xff08;感謝活在這個人工智能時代&#xff09;。 設計 主要就是路由設計以及菜單設計 路…

C#中 Winform如何實現跨頁面調用

設計頁面 如下 其中Form2為啟動項 當點擊訂閱消息的時候 會創建Form1頁面 當 Form1頁面的點擊發送的時候 自動將發送的消息同步到label1中 Form2的代碼如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using S…