linux之Tomcat服務(wù)器部署和項目部署全過程
Tomcat
Tomcat是Apache軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun和其他一些公司及個人共同開發(fā)而成。
Tomcat服務(wù)器是一個免費(fèi)的開放源代碼的Web應(yīng)用服務(wù)器,屬于輕量級應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP程序的首選
Tomcat官網(wǎng): http://tomcat.apache.org
Tomcat安裝

Tomcat是java語言編寫程序,首先在虛擬機(jī)中安裝jdk
注意:.rpm包如果依賴一些組件,需要我們手動解決安裝依賴
安裝jdk的rpm包
[root@localhost tmp]# cd /tmp
[root@localhost tmp]# rpm -ivh jdk-8u251-linux-x64.rpm
警告:jdk-8u251-linux-x64.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID ec551f03: NOKEY
準(zhǔn)備中... ################################# [100%]
正在升級/安裝...
1:jdk1.8-2000:1.8.0_251-fcs ################################# [100%]Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...此時:JDK已經(jīng)被安裝在了 /usr/java/jdk1.80_xxx 目錄下。
配置環(huán)境變量
[root@localhost java]# vi /etc/profile ? 在profile中尾部追加一下3行配置 export JAVA_HOME=/usr/java/default export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=. ? //刷新環(huán)境變量 [root@localhost java]# source /etc/profile ? 如果刷新環(huán)境變量時,有異常信息,大多是配置環(huán)境變量的關(guān)鍵字有錯
安裝Tomcat
#獲取Tomcat壓縮包 ? #解壓 [root@localhost opt]# tar -xzvf apache-tomcat-8.5.78.tar.gz
Tomcat為java語言編寫,不需要編譯安裝,解壓即用
啟停命令
注意:Tomcat兼容linux和windows系統(tǒng),其中.bat文件為windows系統(tǒng)可用.sh文件為linux系統(tǒng)可用
啟動Tomcat
[root@localhost bin]# /opt/apache-tomcat-8.5.78/bin/startup.sh
訪問Tomcat
#查看Tomcat程序占用端口 [root@localhost bin]# netstat -tunlp
?#瀏覽器輸入訪問地址 http://主機(jī)ip:8080
關(guān)閉Tomat
#方法一,運(yùn)行shutdown.sh腳本 [root@localhost bin]# /opt/apache-tomcat-8.5.78/bin/shutdown.sh #方法二,通過8005端口關(guān)閉,此端口只能本機(jī)訪問 [root@localhost bin]# telnet 127.0.0.1 8005 #通過telnet連接8005端口 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. SHUTDOWN #輸入SHUTDOWN ?
簡單的Tomcat項目部署演示
將項目放入tomcat的webapps文件夾中

開啟tomcat
[root@localhost webapps]# /opt/apache-tomcat-8.5.78/bin/startup.sh
訪問項目
訪問路徑為 http://主機(jī)ip:8080/項目名/資源名

Tomcat主配置文件解析
?Tomcat配置文件被存放在conf中,其中最主要的配置文件為server.xml
#配置文件示例
<?xml version="1.0" encoding="UTF-8"?>
?
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<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 name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>Server
?是整個配置文件的根元素。表示整個Catalina容器。
#參數(shù)信息
className:實(shí)現(xiàn)了org.apache.catalina.Server接口的類名,默認(rèn)實(shí)現(xiàn)了 org.apache.catalina.core.StandardServer類;
Port:Tomcat服務(wù)器監(jiān)聽用于關(guān)閉Tomcat服務(wù)器的命令(必須);
Shutdown:發(fā)送到端口上用于關(guān)閉Tomcat服務(wù)器的命令;Connector
?連接器,負(fù)責(zé)接收客戶的請求,以及向客戶端回送響應(yīng)的消息
#參數(shù)解析
allowTrace:是否允許HTTP的TRACE方法,默認(rèn)為false;
emptySessionPath:如果設(shè)置為true,用戶的所有路徑都將設(shè)置為/,默認(rèn)為false;
enableLookups:調(diào)用request、getRemoteHost()執(zhí)行DNS查詢,以返回遠(yuǎn)程主機(jī)的主機(jī)名,如果設(shè)置為false,則直接返回IP地址;
maxPostSize:指定POST方式請求的最大量,沒有指定默認(rèn)為2097152;
protocol:值必須為HTTP1.1,如果使用AJP處理器,該值必須為AJP/1.3;
proxyName:如這個連接器正在一個代理配置中被使用,指定這個屬性,在request.getServerName()時返回;
redirectPort:如連接器不支持SSL請求,如收到SSL請求,Catalina容器將會自動重定向指定的端口號,讓其進(jìn)行處理;
scheme:設(shè)置協(xié)議的名字,在request.getScheme()時返回,SSL連接器設(shè)為”https”,默認(rèn)為”http”;
secure:在SSL連接器可將其設(shè)置為true,默認(rèn)為false;
URIEncoding:用于解碼URL的字符編碼,沒有指定默認(rèn)值為ISO-8859-1;
useBodyEncodingForURI:主要用于Tomcat4.1.x中,指示是否使用在contentType中指定的編碼來取代URIEncoding,用于解碼URI查詢參數(shù),默認(rèn)為false;
xpoweredBy:為true時,Tomcat使用規(guī)范建議的報頭表明支持Servlet的規(guī)范版本,默認(rèn)為false;
acceptCount:當(dāng)所有的可能處理的線程都正在使用時,在隊列中排隊請求的最大數(shù)目。當(dāng)隊列已滿,任何接收到的請求都會被拒絕,默認(rèn)值為10;
bufferSize:設(shè)由連接器創(chuàng)建輸入流緩沖區(qū)的大小,以字節(jié)為單位。默認(rèn)情況下,緩存區(qū)大的大小為2048字節(jié);
compressableMimeType:MIME的列表,默認(rèn)以逗號分隔。默認(rèn)值是text/html,text/xml,text/plain;
compression:指定是否對響應(yīng)的數(shù)據(jù)進(jìn)行壓縮。off:表示禁止壓縮、on:表示允許壓縮(文本將被壓縮)、force:表示所有情況下都進(jìn)行壓縮,默認(rèn)值為off;
connectionTimeout:設(shè)置連接的超時值,以毫秒為單位。默認(rèn)值為60000=60秒;
disableUploadTimeOut:允許Servlet容器,正在執(zhí)行使用一個較長的連接超時值,以使Servlet有較長的時間來完成它的執(zhí)行,默認(rèn)值為false;
maxHttpHeaderSize:HTTP請求和響應(yīng)頭的最大量,以字節(jié)為單位,默認(rèn)值為4096字節(jié);
maxKeepAliveRequest:服務(wù)器關(guān)閉之前,客戶端發(fā)送的流水線最大數(shù)目。默認(rèn)值為100;
maxSpareThreads:允許存在空閑線程的最大數(shù)目,默認(rèn)值為50;
minSpareThreads:設(shè)當(dāng)連接器第一次啟協(xié)創(chuàng)建線程的數(shù)目,確保至少有這么多的空閑線程可用。默認(rèn)值為4;
port:服務(wù)端套接字監(jiān)聽的TCP端口號,默認(rèn)值為8080(必須);
socketBuffer:設(shè)Socket輸出緩沖區(qū)的大?。ㄒ宰止?jié)為單位),-1表示禁止緩沖,默認(rèn)值為9000字節(jié);
toNoDelay:為true時,可以提高性能。默認(rèn)值為true;
threadPriority:設(shè)JVM中請求處理線程優(yōu)先級。默認(rèn)值為NORMAL-PRIORITY;Engine
?為特定的Service處理所有的請示。每個Service只能包含一個Engine元素,它負(fù)責(zé)接收和處理此Service所有的連接器收到的請求,向連接發(fā)回響應(yīng),并最終顯示在客戶端。<Engine>至少有一個<Host>元素,必須至少有一個<Host>屬性的名字與defaultHost指定的名字相匹配。
#參數(shù)解析 className:實(shí)現(xiàn)org.apache.catalina.Engine接口,默認(rèn)實(shí)現(xiàn)類為org.apache.catalina.core.StandardEngine類; defaultHost:默認(rèn)主機(jī)名,值必須與<Service>的name值相匹配; name:指定Engine的邏輯名字(必須); jvmRoute:在負(fù)載勻衡中使用的標(biāo)識符,必須唯一;
Host
?表示一個虛擬主機(jī),為特定的虛擬主機(jī)處理所有請求
appBase:設(shè)定應(yīng)用程序的基目錄,絕對路徑或相對于%CATALINA_HOME%的路徑名;autoDeploy:指示Tomcat運(yùn)行時,如有新的WEB程序加開appBase指定的目錄下,是否為自動布署,默認(rèn)值為true;className:實(shí)現(xiàn)了org.apache.catalina.Host接口的類,標(biāo)準(zhǔn)實(shí)現(xiàn)類為org.apache.catalina.core.StandardHost類;deployOnStartup:Tomcat啟動時,是否自動部署appBase屬性指定目錄下所有的WEB應(yīng)用程序,默認(rèn)值為true;name:虛擬主機(jī)的網(wǎng)絡(luò)名(必須);
context
?一個WEB應(yīng)用程序,處理當(dāng)前WEB應(yīng)用程序的所有請求,每一個<Context>必須使用唯一的上下文路徑
className:實(shí)現(xiàn)了org.apache.catalina.Context接口的類,標(biāo)準(zhǔn)實(shí)現(xiàn)類org.apache.catalina.core.StandardContext類;cookies:是否將Cookie應(yīng)用于Session,默認(rèn)值為true;crossContext:是否允許跨域訪問,為true時,在程序內(nèi)調(diào)用ServletContext.getContext()方法將返回一個虛擬主機(jī)上其它web程序的請求調(diào)度器;默認(rèn)值為false,調(diào) 徑用getContext()返回為null;docBase:絕對路徑或相對于Host的appBase 屬性的相對路徑;privileged:為true,允許Web應(yīng)用程序使用容器的Servlet;path:指定上下文路徑。一個虛擬主機(jī)中,上下文路徑必須唯一;reloadable:為true,Tomcat運(yùn)行時,如果WEB-INF/classes和WEB-INF/lib目錄中有改變,Tomcat會自動重新加載該WEB應(yīng)用程序。雖方便,但開銷也大,默認(rèn)值為false,我們在調(diào)用可以打開,發(fā)布后再關(guān)閉;cacheMaxSize:靜態(tài)資源緩存最大值,以KB為單位,默認(rèn)值為10240KB;cachingAllowed:是否允許靜態(tài)資源緩存,默認(rèn)為true;caseSensitive:默認(rèn)為true,資源文件名大小寫敏感,如果為false大小寫不敏感;unpackWAR:默認(rèn)為true;workDir:為WEB應(yīng)用程序內(nèi)部的Servlet指定臨時讀寫的目錄路徑名。如沒有設(shè)置,則Tomcat會在%CATALINA_HOME%/work目錄下提供一個合適的目錄;
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.security.SecurityListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<!-- 全局命名資源,來定義一些外部訪問資源,其作用是為所有引擎應(yīng)用程序所引用的外部資源的定義 -->
<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>
<!-- 定義的一個名叫“UserDatabase”的認(rèn)證資源,將conf/tomcat-users.xml加載至內(nèi)存中,在需要認(rèn)證的時候到內(nèi)存中進(jìn)行認(rèn)證 -->
<Service name="Catalina">
<!-- # 定義Service組件,同來關(guān)聯(lián)Connector和Engine,一個Engine可以對應(yīng)多個Connector,每個Service中只能一個Engine -->
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<!-- 修改HTTP/1.1的Connector監(jiān)聽端口為80.客戶端通過瀏覽器訪問的請求,只能通過HTTP傳遞給tomcat。還可以設(shè)置server與URIEncoding參數(shù) -->
<Engine name="Catalina" defaultHost="test.com">
<!--修改當(dāng)前Engine,默認(rèn)主機(jī)是:www.test.com,此處寫主機(jī)域名或ip -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- Realm組件,定義對當(dāng)前容器內(nèi)的應(yīng)用程序訪問的認(rèn)證,通過外部資源UserDatabase進(jìn)行認(rèn)證 -->
<Host name="test.com" appBase="/web" unpackWARs="true" autoDeploy="true">
<!-- 定義一個主機(jī),域名為:test.com,應(yīng)用程序的目錄是/web,設(shè)置自動部署,自動解壓 -->
<Alias>www.test.com</Alias>
<!-- 定義一個別名www.test.com,此處寫主機(jī)域名或ip-->
<Context path="" docBase="www/" reloadable="true" />
<!-- 定義該應(yīng)用程序,訪問路徑"",即訪問www.test.com即可訪問,網(wǎng)頁目錄為:相對于appBase下的www/,即/web/www,并且當(dāng)該應(yīng)用程序下web.xml或者類等有相關(guān)變化時,自動重載當(dāng)前配置,即不用重啟tomcat使部署的新應(yīng)用程序生效 -->
<Context path="/bbs" docBase="/web/bbs" reloadable="true" />
<!-- 定義另外一個獨(dú)立的應(yīng)用程序(虛擬主機(jī)),訪問路徑為:www.test.com/bbs,該應(yīng)用程序網(wǎng)頁目錄為/web/bbs -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/www/logs"
prefix="www_access." suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 定義一個Valve組件,用來記錄tomcat的訪問日志,日志存放目錄為:/web/www/logs如果定義為相對路徑則是相當(dāng)于$CATALINA_HOME,并非相對于appBase,這個要注意。定義日志文件前綴為www_access.并以.log結(jié)尾,pattern定義日志內(nèi)容格式,具體字段表示可以查看tomcat官方文檔 -->
</Host>
<Host name="manager.test.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- 定義一個主機(jī)名為man.test.com,應(yīng)用程序目錄是$CATALINA_HOME/webapps,自動解壓,自動部署 -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="172.16.100.*" />
<!-- 定義遠(yuǎn)程地址訪問策略,僅允許172.16.100.*網(wǎng)段訪問該主機(jī),其他的將被拒絕訪問 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/bbs/logs"
prefix="bbs_access." suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 定義該主機(jī)的訪問日志 -->
</Host>
</Engine>
</Service>
</Server
log相關(guān)的日志
- catalina.2024-08-14.log 運(yùn)行時的錯誤信息日志
- host-manager.2024-08-14.log 記錄網(wǎng)上對Tomcat做的配置
- localhost_access_log.2024-08-14.txt 訪問日志,直到誰訪問了我
- catalina.out 運(yùn)行的報錯信息日志總和
- localhost.2024-08-14.log Tomcat啟動請求信息
- manager.2024-08-14.log 和host-manager.2024-08-14.log一樣,一般都是空的,不是空的時那就是被入侵了
Tomcat部署項目
?tomcat除了可以部署文件夾之外,還可以部署編程人員打包好的.war和.jar文件
部署jpress---war
配置數(shù)據(jù)庫環(huán)境
#創(chuàng)建ipress分庫,并設(shè)置編碼為utf8 mysql> create database jpress default character set utf8; #創(chuàng)建用戶 mysql> grant all on jpress.* to jpress@'%' identified by '111111';
部署項目
將war包放入tomcat的項目目錄

啟動tomcat
[root@localhost webapps]# /opt/apache-tomcat-8.5.78/bin/startup.sh

訪問項目

配置數(shù)據(jù)庫信息

配置網(wǎng)站信息
訪問網(wǎng)站,登錄
http://主機(jī)ip:8080/jpress-web-newest/admin/login

部署當(dāng)當(dāng)網(wǎng)--文件夾
配置數(shù)據(jù)庫
# 創(chuàng)建分庫 mysql> create database dang; # 創(chuàng)建用戶 mysql> grant all on dang.* to dang@'%' identified by '111111'; # 導(dǎo)入數(shù)據(jù) mysql> use dang mysql> source /opt/dang.sql
修改項目中數(shù)據(jù)庫連接配置
位置:\WEB-INF\classes


部署項目

啟動項目
[root@localhost myweb]# /opt/apache-tomcat-8.5.78/bin/startup.sh
訪問
http://主機(jī)ip:8080/dang/Book/BookFace.do

Tomcat優(yōu)化
常用優(yōu)化手段固定,需要多看多記憶
安全優(yōu)化
telnet管理端口保護(hù)(強(qiáng)制)
| 類別 | 配置內(nèi)容及說明 | 標(biāo)準(zhǔn)配置 | 備注 |
|---|---|---|---|
| telnet管理端口保護(hù) | 1.修改默認(rèn)的8005管理端口為不易猜測的端口(大于1024);2.修改SHUTDOWN指令為其他字符串; | <Server port="**8527**" shutdown="**dangerous**"> | 1.以上配置項的配置內(nèi)容只是建議配置,可以按照服務(wù)實(shí)際情況進(jìn)行合理配置,但要求端口配置在8000~8999之間 |
降權(quán)啟動(強(qiáng)制)
| 類別 | 配置內(nèi)容及說明 | 標(biāo)準(zhǔn)配置 | 備注 |
|---|---|---|---|
| 降權(quán)啟動 | 1.tomcat啟動用戶權(quán)限必須為非root權(quán)限,盡量降低tomcat啟動用戶的目錄訪問權(quán)限;2.如需直接對外使用80端口,可通過普通賬號啟動后,配置iptables規(guī)則進(jìn)行轉(zhuǎn)發(fā); | 避免一旦tomcat 服務(wù)被入侵,黑客直接獲取高級用戶權(quán)限危害整個server的安全; |
文件列表訪問控制(強(qiáng)制)
| 類別 | 配置內(nèi)容及說明 | 標(biāo)準(zhǔn)配置 | 備注 |
|---|---|---|---|
| 文件列表訪問控制 | 1.conf/web.xml文件中default部分listings的配置必須為false; | <init-param><param-name>listings</param-name><param-value>false</param-value></init-param> | false為不列出目錄文件,true為允許列出,默認(rèn)為false; |
起停腳本權(quán)限回收(推薦)
| 類別 | 配置內(nèi)容及說明 | 標(biāo)準(zhǔn)配置或操作 | 備注 |
|---|---|---|---|
| 起停腳本權(quán)限回收 | 去除其他用戶對Tomcat的bin目錄下shutdown.sh、startup.sh、catalina.sh的可執(zhí)行權(quán)限; | chmod -R 744 tomcat/bin/* | 防止其他用戶有起停線上Tomcat的權(quán)限; |
訪問日志格式規(guī)范(推薦)
conf/server.xml
| 類別 | 配置內(nèi)容及說明 | 標(biāo)準(zhǔn)配置或操作 | 備注 |
|---|---|---|---|
| 訪問日志格式規(guī)范 | 開啟Tomcat默認(rèn)訪問日志中的Referer和User-Agent記錄 | <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/> | 開啟Referer和User-Agent是為了一旦出現(xiàn)安全問題能夠更好的根據(jù)日志進(jìn)行問題排查; |
性能優(yōu)化
上策:優(yōu)化代碼
- 該項需要開發(fā)經(jīng)驗足夠豐富,對開發(fā)人員要求較高
中策:jvm**優(yōu)化機(jī)制** 垃圾回收機(jī)制 把不需要的內(nèi)存回收
- 優(yōu)化jvm--優(yōu)化垃圾回收策略
- 優(yōu)化catalina.sh配置文件。在catalina.sh配置文件中添加以下代碼
# tomcat分配1G內(nèi)存模板 JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m" ? # 重啟服務(wù) su -c '/home/tomcat/tomcat8_1/bin/shutdown.sh' tomcat su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
下策:加足夠大的內(nèi)存
- 該項的資金投入較大
下下策:每天0點(diǎn)定時重啟tomcat
- 使用較為廣泛
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
tomcat轉(zhuǎn)東方通的實(shí)現(xiàn)步驟
將Tomcat集成到東方通中間件中,通常是為了實(shí)現(xiàn)更復(fù)雜的業(yè)務(wù)邏輯處理或者為了提高系統(tǒng)在高并發(fā)環(huán)境下的穩(wěn)定性和安全性,本文主要介紹了tomcat轉(zhuǎn)東方通的實(shí)現(xiàn)步驟,感興趣的可以了解一下2025-03-03
IDEA 2020 配置Tomcat服務(wù)器的詳細(xì)步驟
這篇文章主要介紹了IDEA 2020 配置Tomcat服務(wù)器的詳細(xì)教程,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

