1 概述
tomcat使用java語言編寫,本身自帶webser,是一個簡裝的http server,安裝後生産的檔案一般放在webapp下對應目錄,manager是應用程式管理,tomcat 的站點路徑映射到ROOT,如定義主站點為/data/web/html/ 為要定義為/data/web/html/ROOT。tomcat一般不會監聽在低于1024的端口号,因為tomcat是java程式設計,不監聽系統的端口 。tomcat一般不會直接直接處理請求,由代理排程動态請求過來處理,一般代理伺服器也用來處理靜态資源,實作動靜結合,同時靜态的資源可以用緩存伺服器來實作,減去後端伺服器的壓力。
Tomcat是Java 2 EE技術體系的不完整實作; JBoss是在tomcat的基礎上添加很多功能
tomcat的運作執行個體,一個執行個體就是一個java程序,監聽在某個套接字
連接配接器負責接收請求,将請求發給引擎(運作代碼環境),一個server可以有多個請求。
服務是用來包含連接配接器和引擎的,一個服務内部隻能有一個引擎,但是一個服務可以有多個連接配接器。一般而言,一個執行個體隻提供一個服務(雖然可以多個服務)
這種形式實作了一個實體主機上多個主機,這個相當于通過虛拟伺服器的方式來實作,根據不同的url來實作,但是這裡每一個元件是有context來定義,相當于是web裡的alias,jsp程式還是比較重的,因為運作前要加載類,如部署環境,把虛拟機依賴的庫都加載上來。加載過程可以自己運作也可以使用者手動指定tomcat的元件,java的jvm不能有效的使用大于32G的記憶體空間,如果實體機記憶體大于32G,可以配置設定為多個執行個體,背後監聽在不同的套接字上。
2 安裝Tomcat
tomcat可以通過官方下載下傳包進行安裝和yum源安裝
2.1 官方包安裝
官方連結:tomcat.apache.org,建議使用7或8的版本,下載下傳源碼安裝,需要maven環境,比較麻煩,建議下載下傳編譯好的包。到官網上找到字尾為.gz的包,服務包.gz結尾的。一般是綠色伺服器,解壓到對應目錄就可以用了。先部署jdk環境,然後在執行如下的安裝
下載下傳路徑:https://tomcat.apache.org/download-80.cgi
tar xf apache-tomcat-8.0.47.tar.gz -C /usr/local
cd /usr/local/
ln -sv apache-tomcat-8.0.47/ tomcat
添加賬号tomcat,注意權限,一般需要用tomcat賬号來啟動,而不直接用root,是以相關檔案要設定權限,使得tomcat賬号具有讀取或者寫入權限
groupadd -g 91 tomcat
useradd -u 91 -g 91 -s /sbin/nologin tomcat
chown -R root.tomcat /usr/local/tomcat/*
chown -R tomcat /usr/local/tomcat/{logs,temp,work,webapps}
chmod g+r /usr/local/tomcat/conf/*
vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
儲存後執行. /etc/profile.d/tomcat.sh導出環境變量
然後執行 catalina.sh start 啟動tomcat,注意,通過tar包安裝的tomcat,由腳本catalina.sh來管理
預設8005,8009,8080端口都打開為啟動完成,tomcat沒有權限監聽80端口
測試,浏覽器輸入如下,可以打開,則表示正常
http://172.18.50.72:8080/
2.2 yum安裝
會自動安裝servlet和 jsp
先部署jdk
yum install java-1.8.0-openjdk-devel
再部署tomcat
yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps
預設配置可以直接啟動,指令如下
systemctl restart tomcat
服務啟動有點慢,要等8005,8009,8080端口都打開為啟動完成
tomcat需要依賴jvm執行,沒有主程式。/usr/sbin/tomcat是shell腳本,調用jvm實作
java運作預設監聽三個端口:8009 ajp協定, 8080 http協定 ,8005管理接口
jps檢視java程序
3 tomcat程式環境
3.1 tomcat的目錄結構
bin:腳本,及啟動時用到的類;
conf:配置檔案目錄;
lib:庫檔案,Java類庫,jar;
logs:日志檔案目錄;
temp:臨時檔案目錄;
webapps:webapp的預設目錄;
work:工作目錄,存放編譯後的位元組碼檔案;
# catalina.sh --help
debug 在調試器中啟動Catalina
debug -security 用安全管理器調試Catalina
jpda start 在JPDA調試器下啟動Catalina
run 在目前視窗中啟動Catalina
run -security 從安全管理器的目前視窗開始
start 在另一個視窗啟動Catalina
start -security 從安全管理器的另一個視窗開始
stop 停止Catalina,等待5秒鐘後程序 結束
stop n 停止Catalina,等待n秒鐘後程序 結束
stop -force 停止Catalina,等待5秒鐘後程序結束,如果程序還在運作,就強制終止程序。
stop n -force 停止Catalina,等待n秒鐘後程序結束,如果程序還在運作,就強制終止程序。
configtest 在server.xml上運作基本文法檢查 - 檢查退出代碼最為判斷的結果
version 檢查tomcat版本用的。
3.2 rpm包安裝的程式環境
配置檔案目錄:/etc/tomcat
主配置檔案:server.xml
webapps存放位置:/var/lib/tomcat/webapps/
examples
manager
host-manager
docs
Unit File:tomcat.service
環境配置檔案:/etc/sysconfig/tomcat
4 tomcat的配置檔案構成
server.xml:主配置檔案;定義執行個體的初始化,為java虛拟機提供配置
web.xml:每個webapp隻有“部署”後才能被通路,它的部署方式通常由web.xml進行定義,其存放位置為WEB-INF/目錄中;此檔案為所有的webapps提供預設部署相關的配置;一般不需要修改,預設即可
context.xml:每個webapp都可以使用的配置檔案,它通常由專用的配置檔案context.xml來定義,其存放位置為WEB-INF/目錄中;此檔案為所有的webapps提供預設配置;一般不需要修改,預設即可
tomcat-users.xml:使用者認證的賬号和密碼檔案;角色(role),使用者(User);此檔案在tomcat啟動時被裝入記憶體;
例子,授權使用者檢視server status,Manager APP,Host Manager的界面
vim /usr/share/tomcat/conf/tomcat-users.xml
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="Pass123456" roles="manager-gui,admin-gui"/>
catalina.policy:當使用-security選項啟動tomcat時,用于為tomcat設定安全政策;
catalina.properties:Java屬性的定義檔案,用于設定類加載器路徑,以及一些與JVM調優相關參數;一般不需要修改,預設即可
logging.properties:日志系統相關的配置;
通常要修改的是server.xml和tomcat-users.xml兩個檔案
5 Tomcat的核心元件介紹
<Server>
<Service>
<connector/>
<connector/>
...
<Engine>
<Host>#這裡的host需要是基于url的主機,因為ip和端口在連接配接器上
<Context/>
<Context/>
...
</Host>
<Host>
...
</Host>
...
</Engine>
</Service>
</Server>
每一個元件都由一個Java“類”實作,這些元件大體可分為以下幾個類型:
頂級元件:Server,代表一個instance
服務類元件:Service
連接配接器元件:http, https, ajp(apache jserv protocol)
容器類:Engine, Host, Context,面向内部部署應用的
被嵌套類:valve, logger, realm, loader, manager, ...
叢集類元件:listener, cluster(會話叢集),...
JSP WebAPP的組織結構:部署應用程式,所依賴的類需要被裝載後才能被運作,是以是重量級的。
/: webapps的根目錄
index.jsp:首頁;用引擎執行的代碼,要以.jsp結尾,如果不需要引擎處理的檔案,用.html結尾
WEB-INF/:目前webapp的私有資源路徑;通常用于存儲目前webapp的web.xml和context.xml配置檔案;描述目前路徑的私有資訊,不能讓使用者通過url直接通路。
較大的應用程式會有以下三個檔案
META-INF/:類似于WEB-INF/;
classes/:類檔案,目前webapp所提供的類;
lib/:類檔案,目前webapp所提供的類,被打包為jar格式;jar為tomcat的打封包件。JVM通路這類檔案,無需展開,直接通路
webapp歸檔格式:先打包,重新開機服務會自動把打包的檔案展開為目錄,隻需要将連結指向新版本即可,可以用腳本實作。這叫腳本化釋出。
有以下類型的打封包件
.war:webapp;
.jar:EJB的類打封包件(類庫);
.rar:資源擴充卡類打封包件;
.ear:企業級webapp;
部署(deploy)webapp的相關操作:可以通過代碼實作
deploy:将webapp的源檔案放置于目标目錄(網頁程式檔案存放目錄),配置tomcat伺服器能夠基于web.xml和context.xml檔案中定義的路徑來通路此webapp;将其特有的類和依賴的類通過class loader裝載至JVM;
部署有兩種方式:
自動部署:auto deploy
手動部署:
冷部署:把webapp複制到指定的位置,而後才啟動tomcat;冷部署是最安全的部署方法
熱部署:在不停止tomcat的前提下進行部署;
部署工具:manager、ant腳本、tcd(tomcat client deployer)等;
undeploy:拆除(反部署),停止webapp,并從tomcat執行個體上解除安裝webapp;
start:啟動處于停止狀态的webapp;
stop:停止webapp,不再向使用者提供服務;其類依然在jvm上;
redeploy:重新部署;
手動提供一測試類應用,并冷部署:
本例子将部署主機
mkdir -pv /usr/share/tomcat/webapps/test/{classes,lib,WEB-INF}
建立首頁檔案
vim /usr/share/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("hello world");
%>
</body>
</html>
測試,不需要重新開機服務,在浏覽器輸入如下url:http://172.18.50.73:8080/test/
tomcat的兩個管理應用:
manager:管理應用程式
host-manager:管理虛拟主機
tomcat的常用元件配置:配置檔案/usr/share/tomcat/conf/server.xml
Server:代表tomcat instance,即表現出的一個java程序;監聽在8005端口,隻接收“SHUTDOWN”。各server監聽的端口不能相同,是以,在同一實體主機啟動多個執行個體時,需要修改其監聽端口為不同的端口; port="-1",表示不監聽,或者把shutdown的指令設定為複雜,最好使用随機數。
Service:用于實作将一個或多個connector元件關聯至一個engine元件;
Connector元件:
負責接收請求,常見的有三類http/https/ajp;
進入tomcat的請求可分為兩類:
(1) standalone : 請求來自于用戶端浏覽器;用于實驗環境
(2) 由其它的web server反代:來自前端的反代伺服器;一般用http反向代理(AT)或者是nginx反向代理(NT),以下四類反代模型,關鍵是看反代用什麼協定排程過來的。
nginx --> http connector --> tomcat
httpd(proxy_http_module) --> http connector --> tomcat
httpd(proxy_ajp_module) --> ajp connector --> tomcat (這種方法,使用者無法繞過代理直接通路)
httpd(mod_jk,已經過時,需要編譯安裝,不推薦使用) --> ajp connector --> tomcat
端口号和協定沒有直接關系,因為端口号可以使用者直接定義,maxthreads是接收請求的并發數量,一般不會再tomcat上部署https,一般是在反代上部署https。tomcat一般隻監聽本地和反代
屬性:
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
address:監聽的IP位址;預設為本機所有可用位址;
maxThreads:最大并發連接配接數,預設為200;rpm安裝預設為150
enableLookups:是否啟用DNS查詢功能;建議關閉,加快速度
acceptCount:等待隊列的最大長度;
secure:
sslProtocol:TLS 1.1或TLS 1.2
Engine元件:
Servlet執行個體,即servlet引擎,其内部可以一個或多個host元件來定義站點; 通常需要通過defaultHost來定義預設的虛拟主機;
name=
defaultHost="localhost"
jvmRoute= #做叢集的時候,基于cookie的會話粘性才需要啟用jvmRoute
Host元件:位于engine内部用于接收請求并進行相應處理的主機或虛拟主機,示例:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
常用屬性說明:
(1) appBase:此Host的webapps的預設存放目錄,指存放非歸檔的web應用程式的目錄或歸檔的WAR檔案目錄路徑;可以使用基于$CATALINA_BASE變量所定義的路徑的相對路徑;
(2) autoDeploy:在Tomcat處于運作狀态時,将某webapp放置于appBase所定義的目錄中時,是否自動将其部署至tomcat;
(3) unpackWARs是自動展開打包的服務包
示例:
<Host name="tc1.magedu.com" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true">
</Host>
# mkdir -pv /appdata/webapps
# mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}
提供一個測試頁即可;
例子,把以下配置放到Engine段裡,獨立的host段
<Host name="www.sunnytc.com" appBase="/sunny/webapps"
unpackWARs="true" autoDeploy="true" />
#其中,斜線表示閉合,為配置段結束
mkdir -pv /sunny /webapps/ROOT/{lib,classes,WEB-INF}
vim /sunny /webapps/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>sunnytc Test Page</title>
</head>
<body>
<% out.println("hello sunnytc world");
%>
</body>
</html>
systemctl restart tomcat
測試,在hosts裡做好www.sunnytc.com的解析,用elinks測試如下
elinks -dump http://www.sunnytc.com:8080/
Context元件:監聽的位址和端口使用監聽器來設定
<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>
Valve元件:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
Valve存在多種類型:
定義通路日志:org.apache.catalina.valves.AccessLogValve
定義通路控制:org.apache.catalina.valves.RemoteAddrValve
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>
例子
valve定義過濾器,相對路徑是相對catalina.sh定義而言,pattern定義日志格式。
<Host name="node1.magedu.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1_access" suffix=".log" #prefix日志檔案名的字首,suffix日志字尾
pattern="%h %l %u %t "%r" %s %b" /> #pattern定義日志格式,可以檢視官方文檔裡logging valve定義
<Context path="/test" docBase="test" reloadable="">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1_test_access_" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
</Host>