天天看點

Tomcat 之 tomcat安裝群組件介紹

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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %s %b" />
</Context>
</Host>