1、Tomcat概述
前端
1.tomcat簡介java
tomcat是基於JDK的web服務器,其能運行Servlet和JSP規範總。Tomcat 5支持最新的Servlet 2.4 和JSP 2.0規範。實際上Tomcat 部分是Apache服務器的擴展,但它是獨立運行的。運行tomcat時,它實際上做爲一個與Apache 獨立的進程單獨運行的。Apache 爲HTML頁面服務,而Tomcat實際上運行JSP頁面和Servlet。tomcat具備處理HTML頁面的功能,另外它仍是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態HTML的能力不如Apache服務器。mysql
官網:tomcat.apache.orglinux
附錄:其餘的java web服務器實現nginx
商業版本:WebSphere、WebLogic、Oc4j… …web
開源實現:Tomcat、jetty、Resin正則表達式
2.Tomcat配置文件sql
(1)配置文件種類shell
server.xml:主配置文件數據庫
context.xml:每一個webapp有專用的配置文件,一般位於webapp應用程序目錄下的WEB-INF目錄中用於定義會話管理器、JDBC等;conf/context.xml是爲各webapp提供默認配置;
web.xml:用於爲全部的webapp提供默認部署相關的配置;
tomcat-users.xml:用戶認證的帳號和密碼配置文件;
catalina.policy:當使用-security選項啓動tomcat實例時會讀取此配置文件來實現其安全運行策略;
catalina.properties:Java屬性的定義文件,用於設定類加載器路徑等,以及一些JVM性能相關的調優參數;
logging.properties:日誌相關的配置信息;
(2)主配置文件結構實例:
<?xmlversion='1.0' encoding='utf-8'?>
<Serverport="8005" shutdown="SHUTDOWN">
<ListenerclassName="org.apache.catalina.startup.VersionLoggerListener" />
<ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on" />
<ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<ListenerclassName="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<GlobalNamingResources>
<Resource name="UserDatabase"auth="Container"
type="org.apache.catalina.UserDatabase"
description="User databasethat 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"/>
<Connectorexecutor="tomcatThreadPool"
port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina"defaultHost="localhost">
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina"defaultHost="localhost">
<RealmclassName="org.apache.catalina.realm.LockOutRealm">
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true"autoDeploy="true">
<ValveclassName="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>
3.Java Web服務組織結構
javaweb服務有特定的組織形式、層次型的目錄結構;主要包含了servlet代碼文件、JSP頁面文件、類文件、部署描述符文件等;
/ |
web服務的根目錄;相對的根路徑 |
WEB-IN |
私有資源目錄,一般存放當前web服務器自用的web.xml; |
META-I |
私有資源目錄,一般存放當前web服務器自用的context.xml; |
classes/ |
此web服務的私有類; |
lib/ |
此web服務的私有類,被打包爲jar格式類; |
index.jsp |
web服務的主頁 |
webapp歸檔格式:.war:webapp;.jar:EJB的類庫文件;.rar:資源適配器;.ear:企業級應用程序;
2、安裝啓動Tomcat
1.基於系統源安裝RPM格式程序:openjdk + Tomcat
(1)安裝jdk(java developmentkit,java開發工具箱)
jdk有兩個版本:openjdk(開源版本)、Oracle JDK(商業版本)。此處用openjdk系列組件,須要安裝三個程序包:java-1.7.0-openjdk、java-1.7.0-openjdk-devel、java-1.7.0-openjdk-devel
[root@localhost~]# yum install java-1.7.0-openjdk java-1.7.0-openjdk-develjava-1.7.0-openjdk-devel
(2)配置jdk環境變量
/usr/bin/java ->/etc/alternatives/java ->/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64/jre/bin/java,此三個位置是其軟鏈接路徑,目的是爲了能夠方便指向多個版本的JDK文件。
[root@localhost ~]# vim/etc/profile.d/java.sh # 添加java環境變量
export JAVA_HOME=/user/bin/java
[root@localhost ~]# exec bash # 重啓shell進程以達到重讀環境變量目的
[root@localhost ~]# java -version # 查看java版本肯定jdk可用
注意:
Tomcat調用JDK是強依賴於環境變量JAVA_HOME,而不是/usr/bin/java
(3)部署Tomcat
[root@localhost ~]# yum install tomcattomcat-lib # tomcat-lib在yum源碼安裝時會依賴安裝,不要指明
[root@localhost ~]# yum innstall tomcat-webapps tomcat-admin-webapps # tomcat自帶網頁管理組件
(4)啓動服務
[root@localhost~]# systemctl start tomcat.service
注意:
1) 監聽端口:8080 8009,8005。8005端口能夠鏈接此端口發送關閉命令;8080是http監控端口;8009是ajp協議監控端口。
2) 不能將默認端口8080改成80,可是在httpd反代的模式下能夠監聽在其餘大於1024端口,僅有root用戶才能使用1024內端口
3) java運行無需root權限,tomcat是以普通用戶身份運行。
2.使用Oracle JDK+ Tomcat主站編譯完成的安裝包
(1)下載平臺版本適合程序包至本地,安裝jdk
[root@localhost~]# rpm -ivh jdk-8u25-linux-x64.rpm
(2)配置java環境變量
[root@localhost ~]# vim /etc/profile.d/java.sh
JAVA_HOME=/usr/java/latest
PATH=$JAVA_HOME/bin:$PATH
exportJAVA_HOME PATH
[root@localhost~]# exec bash
[root@localhost~]# java -version
(3) 安裝官網下載Tomcat
[root@localhost~]# tar xf apache-tomcat-8.0.23.tar.gz -C /usr/local
[root@localhost~]# cd /usr/local
[root@localhostlocal]# ln -sv apache-tomcat-8.0.23/ tomcat
[root@localhostlocal]# cd tomcat/
註釋:Tomcat的目錄結構
bin:腳本及啓動時用到的類
lib: 提供的j類庫
man: 幫助手冊
conf:配置文件
logs:日誌文件
webapps:應用程序默認部署目錄
work:工做目錄,jsp代碼編譯成class文件裝入JVM運行,臨時放置編譯文件位置
temp:臨時文件目錄
(4)啓動環境變量
[root@localhost ~]# vim/etc/profile.d/tomcat.sh # 須要配置一個環境變量:CATALINA_BASE
CATALINA_BASE=/usr/local/tomcat
PATH=$CATALINA_BASE/bin:$PATH
export CATALINA_BASE PATH
[root@localhostbin]# exec bash
[root@localhost~]# catalina.sh start
此時能夠調用/usr/local/tomcat/bin下的catalina.sh腳本運行,可是此時啓動的tomcat進程是以root身份運行,不安全
(5)查看Tomcat和其調用的JDK版本信息
[root@localhost~]# catalina.sh version
3、tomcat配置組件
1.server:服務器組件
這是一個頂級組件,其是一個tomcat實例,即運行一個jvm進程。每一個server監聽的端口不能相同,一個物理主機上啓動多個server實例應該使用不一樣的端口。
屬性定義:port、shutdown、className,8005端口爲關閉所使用
<Serverport="8005" shutdown="SHUTDOWN">
<ListenerclassName="org.apache.catalina.startup.VersionLoggerListener" />
2.service:服務組件
一個服務組件一般包含一個引擎和與此引擎相關聯的一個或多個鏈接器。屬性:name
<Service name="Catalina">
3.connector:鏈接器組件
負責鏈接客戶端(能夠是瀏覽器或Web服務器)請求至Servlet容器內的Web應用程序,一般指的是接收客戶發來請求的位置及服務器端分配的端口。默認端口一般是HTTP協議的8080,管理員也能夠根據本身的須要改變此端口。一個引擎能夠配置多個鏈接器,但這些鏈接器必須使用不一樣的端口。
(1) tomcat做爲獨立的應用程序服務器,直接接受來自於瀏覽器的請求,此時僅能支持http、https協議傳輸
(2) tomcat實現反代模式,其請求未來自於前面的反代主機
當前端主機爲httpd服務器可接受:http,https,ajp
當前端主機爲nginx服務器:http,ajp
屬性定義:
address |
鏈接器監聽的IP地址,不給出 |
maxThreads |
最大併發線程數,默認爲150 |
port |
監聽的TCP端口 |
protocol |
鏈接器使用的協議,通常爲HTTP/1.1或AJP/1.3 |
redirectPort |
重定向端口 |
connectionTimeout |
鏈接超時時長,單位爲毫秒,默認爲60000,一分鐘 |
enableLookups |
是否經過DNS服務實現查詢 |
acceptCount |
定義等待隊列的長度 |
scheme |
客戶端請求對應映射的協議 |
debug |
鏈接器是否啓用調試功能 |
secure |
工做在安全模式下 |
clientAuth |
是否要驗證客戶端證書 |
sslProcotol |
ssl協議版本 |
實例:
<Connectorport="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connectorport="8443"protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"SSLEnabled="true" scheme="https" secure="true"
clientAuth="false"sslProtocol="TLS" />
<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />
注意:
1) 採用前端代理的方式且在httpd時候禁用tomcat的http功能能極大的提升安全性;且客戶端訪問http端口爲80,而tomcat定義端口只能爲任意大於1024的端口
2) 實際生產中通常tomcat都是接受前端代理髮來的請求,前端服務器和Tomcat之間通訊不會是https加密,因此端口重定向不會使用。在鏈接器中定義redirectPort重定向規則,若端口未定義被Tomcatcat監聽,定義也是無效的
3) AJP: apachejserv protocol, 二進制協議
ajp方式的鏈接器只有在前端主機時httpd服務時候才能啓用。ajp傳輸比http文本類型協議傳輸效率更高。ajp方式和http方式不能同時使用。
4.Engine:引擎(容器)組件
Servive的一個實例,即servlet引擎,默認引擎是catalina。其內部能夠有一個或多個Host組件來定義站點;一般須要經過defaultHost的屬性定義默認虛擬主機,defaultHost後定義選項須要在Host中對應定義
<Enginename="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true"autoDeploy="true">
</Engine>
經常使用屬性:name、default、JvmRoute(定義路由用戶請求的方式是否附加一些條件)
5.Host:虛擬主機組件
位於Engine容器中用於接收請求並進行相應處理的主機或虛擬主機,如前面示例中的定義:
<Host name="localhost"appBase="webapps"
unpackWARs="true"autoDeploy="true"
xmlValidation="false"xmlNamespaceAware="false">
</Host>
經常使用屬性:
name |
虛擬主機名稱 |
appBase |
存放非歸檔的web應用程序的目錄或歸檔後的WAR文件的目錄路徑;能夠爲相對路徑或絕對路徑 |
autoDeploy |
Tomcat處於運行狀態時放置於appBase目錄中的應用程序文件是否自動部署;默認爲true; |
unpackWars |
在啓用此webapps時是否對WAR格式的歸檔文件先進行展開;默認爲true; |
xmlValidation |
是否驗證xml語法合格性 |
xmlNamespaceAware |
關注xml名稱空間 |
實例:
<Enginename="Catalina" defaultHost="localhost">
<Host name="localhost"appBase="webapps">
<Context path=""docBase="ROOT"/>
<Context path="/bbs"docBase="/web/bss"
reloadable="true"crossContext="true"/>
</Host>
<Hostname="mail.magedu.com" appBase="/web/mail">
<Context path="/"docBase="ROOT"/>
</Host>
</Engine>
注意:
主機別名定義:若是一個主機有兩個或兩個以上的主機名,額外的名稱都可以以別名的形式進行定義<Alias></Alias>
6.context:上下文組件
相似於apache中的路徑別名,一個Context定義用於標識tomcat實例中的一個Web應用程序;以下面的定義:
<!-- Tomcat Root Context -->
<Context path=""docBase="/web/webapps"/>
<!-- buzzin webapp -->
<Context path="/bbs"
docBase="/web/threads/bbs"
reloadable="true">
</Context>
<!-- chat server -->
<Context path="/chat"docBase="/web/chat"/>
<!-- darian web -->
<Context path="/darian"docBase="darian"/>
經常使用的屬性定義:
1)docBase:相應的Web應用程序的存放位置;也可使用相對路徑,起始路徑爲此Context所屬Host中appBase定義的路徑;docBase的路徑名不能與相應的Host中appBase中定義的路徑名有包含關係
2)path:相對於Web服務器根路徑而言的URI;若是爲空「」,則表示爲此webapp的根路徑;
若是context定義在一個單獨的xml文件中,此屬性不須要定義;
3)reloadable:是否容許從新加載此context相關的Web應用程序的類;默認爲false;
注意:
1) 在Tomcat6中,每個context定義也可使用一個單獨的XML文件進行,其文件的目錄爲$CATALINA_HOME/conf/<enginename>/<hostname>。能夠用於Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。
2) path給定的路徑不能以「/」結尾;
7.Realm組件:
一個Realm表示一個安全上下文,它是一個受權訪問某個給定Context的用戶列表和某用戶所容許切換的角色相關定義的列表。所以,Realm就像是一個用戶和組相關的數據庫。定義Realm時唯一必需要提供的屬性是classname,它是Realm的多個不一樣實現,用於表示此Realm認證的用戶及角色等認證信息的存放位置。
JAASRealm:基於JavaAuthintication and Authorization Service實現用戶認證;
JDBCRealm:經過JDBC訪問某關係型數據庫表實現用戶認證;
JNDIRealm:基於JNDI使用目錄服務實現認證信息的獲取;
MemoryRealm:查找tomcat-user.xml文件實現用戶信息的獲取;
UserDatabaseRealm:基於UserDatabase文件(一般是tomcat-user.xml)實現用戶認證,它實現是一個徹底可更新和持久有效的MemoryRealm,所以可以跟標準的MemoryRealm兼容;它經過JNDI實現;
配置實例:
UserDatabase的配置:
<RealmclassName=」org.apache.catalina.realm.UserDatabaseRealm」
resourceName=」UserDatabase」/>
JDBC方式獲取用戶認證信息的配置:
<RealmclassName="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority"
connectionName="test"connectionPassword="test"
userTable="users"userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"roleNameCol="role_name" />
8.Valve:閥門組件
Valve相似於過濾器,它能夠工做於Engine和Host/Context之間、Host和Context之間以及Context和Web應用程序的某資源之間。一個容器內能夠創建多個Valve,並且Valve定義的次序也決定了它們生效的次序。
Tomcat6中實現了多種不一樣的Valve:
AccessLogValve:訪問日誌Valve
ExtendedAccessValve:擴展功能的訪問日誌Valve
JDBCAccessLogValve:經過JDBC將訪問日誌信息發送到數據庫中;
RequestDumperValve:請求轉儲Valve;
RemoteAddrValve:基於遠程地址的訪問控制;
RemoteHostValve:基於遠程主機名稱的訪問控制;
SemaphoreValve:用於控制Tomcat主機上任何容器上的併發訪問數量;
JvmRouteBinderValve:在配置多個Tomcat爲以Apache經過mod_proxy或mod_jk做爲前端的集羣架構中,當指望中止某節點時,能夠經過此Valve將用記請求定向至備用節點;使用此Valve,必須使用JvmRouteSessionIDBinderListener;
ReplicationValve:專用於Tomcat集羣架構中,能夠在某個請求的session信息發生更改時觸發session數據在各節點間進行復制;
SingleSignOn:將兩個或多個須要對用戶進行認證webapp在認證用戶時鏈接在一塊兒,即一次認證便可訪問全部鏈接在一塊兒的webapp;
ClusterSingleSingOn:對SingleSignOn的擴展,專用於Tomcat集羣當中,須要結合ClusterSingleSignOnListener進行工做;
相關屬性定義:
1)className:相關的java實現的類名,相應於分別應該爲org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
2)allow:以逗號分開的容許訪問的IP地址列表,支持正則表達式,所以,點號「.」用於IP地址時須要轉義;僅定義allow項時,非明確allow的地址均被deny;
3) deny:以逗號分開的禁止訪問的IP地址列表,支持正則表達式;使用方式同allow;
注意:
RemoteHostValve和RemoteAddrValve能夠分別用來實現基於主機名稱和基於IP地址的訪問控制,控制自己能夠經過allow或deny來進行定義,這有點相似於Apache的訪問控制功能;以下面的Valve則實現了僅容許本機訪問/probe:
<Context path="/probe"docBase="probe">
<ValveclassName="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
</Context>
實例:
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
className |
類名稱,經常使用公司域名反寫的方式。 |
directory |
默認相對路徑,也可改成絕對路徑 |
prefix |
日誌文件的前綴 |
suffix |
日誌文件的後綴 |
pattern |
記錄的值日信息包含的內容 |
9.Listener
Listener用於建立和配置LifecycleListener對象,而LifecycleListener一般被開發人員用來建立和刪除容器。
10.Loader
Java的動態裝載功能是其語言功能強大表現之一,Servlet容器使用此功能在運行時動態裝載servlet和它們所依賴類。Loader能夠用於Context中控制java類的加載。
4、Tomcat的Web CUI控制接口配置
tomcat自帶的應用程序實現管理功能:manager app: webapp管理工具、host manager:虛擬主機管理工具
1.manager app: webapp管理工具
(1)配置
[root@localhost tomcat]# vim./conf/tomcat-users.xml 添加以下:
<rolerolename="manager-gui"/>
<userusername="tomcat" password="s3cret"roles="manager-gui"/>
[root@localhosttomcat]# catalina.sh stop
[root@localhosttomcat]# catalina.sh start
說明:
1) 支持角色:
manager-gui |
容許訪問HTMl圖形化界面和狀態頁,最大權限 |
manager-script |
容許訪問文本接口和狀態頁 |
manager-jmx |
JMX代理實現對狀態管理 |
manager-status |
僅受權你用戶訪問狀態頁面 |
2) 配置後服務必須重啓,應爲java程序須要加載到內存
(2)展現
2.host manager:虛擬主機管理工具
(1)配置
[root@localhost tomcat]# vim./conf/tomcat-users.xml 添加以下:
<rolerolename="admin-gui"/>
<userusername="tomcat" password="s3cret"roles="admin-gui"/>
[root@localhosttomcat]# catalina.sh stop
[root@localhosttomcat]# catalina.sh start
支持角色:
admin-gui- allows access to the HTML GUI
admin-script- allows access to the text interface
(2)展現
注意:
當定義相同的用戶同時可以使用這兩個工具須要按照以下定義
<rolerolename="manager-gui" />
<rolerolename="admin-gui"/>
<userusername="tomcat" password="tomcat"roles="manager-gui,admin-gui"/>
配置完任意一個後均可查看狀態頁: