1、Tomcat定義
php
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是不少的場合下被廣泛使用,是開發和調試JSP 程序的首選。對於一個初學者來講,能夠這樣認爲,當在一臺機器上配置好Apache 服務器,可利用它響應對HTML頁面的訪問請求。實際上Tomcat 部分是Apache 服務器的擴展,但它是獨立運行的,因此當你運行tomcat 時,它實際上做爲一個與Apache 獨立的進程單獨運行的html
java基礎前端
Java體系結構包括四個獨立但相關的技術:java
java編程語言:是使用其餘語言所開發的一種可以經過自我解釋或者編譯的方式轉換成機器語言的一種開發環境;node
java API:是爲該編程語言中提供各類既定的功能模塊;開發軟件時能夠直接使用這些功能模塊;而不用在寫代碼;python
java class文件格式:全部利用API開發的源代碼都要通過編譯之後轉換成class格式的字節碼;轉換後爲類文件;linux
Java VM的主要任務是裝載class文件而且執行其中的字節碼。Java VM包含一個類裝載器(class loader),它能夠從程序和API裝載class文件;而Java API的類只在程序執行中須要時纔會被裝載。web
Tomcat不是一個完整意義上的Jave EE服務器,它甚至都沒有提供對哪怕是一個主要Java EE API的實現;但因爲遵照apache開源協議,tomcat卻又爲衆多的java應用程序服務器嵌入本身的產品中構建商業的java應用程序服務器,如JBoss和JOnAS.正則表達式
Tomcat大體是由JDK、servlet和jsp組成的。數據庫
因此安裝tomcat須要先安裝jdk。
安裝JDK
下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=otnjp
[root@node1 ~]# ls anaconda-ks.cfg install.log.syslog php-5.4.26.tar.bz2 install.log jdk-7u9-linux-x64.rpm xcache-3.1.0.tar.bz2 [root@node1 ~]# rpm -ivh jdk-7u9-linux-x64.rpm [root@node1 ~]# rpm -ql jdk | less /etc /etc/.java /etc/.java/.systemPrefs /etc/.java/.systemPrefs/.system.lock /etc/.java/.systemPrefs/.systemRootModFile /etc/init.d/jexec /usr /usr/java /usr/java/jdk1.7.0_09 /usr/java/jdk1.7.0_09/COPYRIGHT [root@node1 ~]# ll /usr/java/ total 4 lrwxrwxrwx 1 root root 16 Mar 23 09:18 default -> /usr/java/latest drwxr-xr-x 10 root root 4096 Mar 23 09:18 jdk1.7.0_09 lrwxrwxrwx 1 root root 21 Mar 23 09:18 latest -> /usr/java/jdk1.7.0_09
配置環境變量:
[root@node1 ~]# vim /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH [root@node1 ~]# . /etc/profile.d/java.sh [root@node1 ~]# java -version java version "1.7.0_09" Java(TM) SE Runtime Environment (build 1.7.0_09-b05) Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode) #說明配置成功
安裝配置tomcat
[root@node1 ~]# tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local/ [root@node1 ~]# ln -sv /usr/local/apache-tomcat-7.0.42 /usr/local/tomcat `/usr/local/tomcat' -> `/usr/local/apache-tomcat-7.0.42' [root@node1 tomcat]# vim /etc/profile.d/tomcat.sh export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH [root@node1 tomcat]# . /etc/profile.d/tomcat.sh [root@node1 ~]# catalina.sh version Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Server version: Apache Tomcat/7.0.42 Server built: Jul 2 2013 08:57:41 Server number: 7.0.42.0 OS Name: Linux OS Version: 2.6.32-431.el6.x86_64 Architecture: amd64 JVM Version: 1.7.0_09-b05 JVM Vendor: Oracle Corporation [root@node1 ~]# 測試配置正常 #啓動測試 [root@node1 ~]# catalina.sh start Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar [root@node1 ~]# netstat -tunlp | grep java tcp 0 0 :::8080 :::* LISTEN 2010/java tcp 0 0 :::8009 :::* LISTEN 2010/java [root@node1 ~]#
提供啓動腳本:
[root@node1 ~]# vim /etc/rc.d/init.d/tomcat #!/bin/sh # Tomcat init script for Linux. # # chkconfig: 2345 96 14 # description: The Apache Tomcat servlet/JSP container. JAVA_HOME=/usr/java/latest CATALINA_HOME=/usr/local/tomcat export JAVA_HOME CATALINA_HOME #exec $CATALINA_HOME/bin/catalina.sh $* start() { $CATALINA_HOME/bin/catalina.sh configtest &> /dev/null if [ $? -ne 0 ];then echo "Error in configuration file,check with tomcat configuration file." exit 5 fi if pidof java &> /dev/null;then echo "Tomcat is running...." exit 4 else exec $CATALINA_HOME/bin/catalina.sh start fi } stop() { pidof java &> /dev/null if [ $? -ne 0 ];then echo "Tomcat is stoped..." else $CATALINA_HOME/bin/catalina.sh stop fi } configtest() { pidof java &> /dev/null if [ $? -eq 0 ];then echo "Tomcat is running,please stop the test." exit 3 else exec $CATALINA_HOME/bin/catalina.sh configtest fi } version() { exec $CATALINA_HOME/bin/catalina.sh version } case $1 in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; configtest) configtest ;; version) version ;; *) echo "Usage: `basename $0` {start|stop|restart|configtest|version}" exit 1 ;; esac [root@node1 ~]# chmod +x /etc/rc.d/init.d/tomcat [root@node1 ~]# chkconfig --add tomcat [root@node1 ~]# service tomcat restart Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar #測試正常
2、配置文件詳解:
[root@node1 conf]# ls Catalina catalina.properties logging.properties server.xml.bak web.xml catalina.policy context.xml server.xml tomcat-users.xml #server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關配置信息; #web.xml:遵循Servlet規範標準的配置文件,用於配置servlet,併爲全部的Web應用程序提供包括MIME映射等默認配置信息; #tomcat-user.xml:Realm認證時用到的相關角色、用戶和密碼等信息;Tomcat自帶的manager默認狀況下會用到此文件;在Tomcat中添加/刪除用戶,爲用戶指定角色等將經過編輯此文件實現; #catalina.policy:Java相關的安全策略配置文件,在系統資源級別上提供訪問控制的能力; #catalina.properties:Tomcat內部package的定義及訪問相關的控制,也包括對經過類裝載器裝載的內容的控制;Tomcat6在啓動時會事先讀取此文件的相關設置; #logging.properties: Tomcat6經過本身內部實現的JAVA日誌記錄器來記錄操做相關的日誌,此文件即爲日誌記錄器相關的配置信息,能夠用來定義日誌記錄的組件級別以及日誌文件的存在位置等; #context.xml:全部host的默認配置信息;
[root@node1 conf]# vim server.xml <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> #port: 接收shutdown指令的端口,默認僅容許經過本機訪問,默認爲8005; shutdown:發往此Server用於實現關閉tomcat實例的命令字符串,默認爲SHUTDOWN; <Listener className="org.apache.catalina.security.SecurityListener" /> #className用於實現此Server容器的徹底限定類的名稱,默認爲org.apache.catalina.core.StandardServer; <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> #應用於整個服務器的JNDI映射,此能夠避免每一個Web應用程序都須要在各自的web.xml建立,這在web應用程序以WAR的形式存在時尤其有用。 <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"> #name:此服務的名稱,默認爲Catalina; <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> #Tomcat做爲應用程序服務器:請求來自於前端的web服務器,這多是Apache, IIS, Nginx等; #Tomcat做爲獨立服務器:請求來自於web瀏覽器 #鏈接器類型:HTTP/SSL/AJP1.3/proxy <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> #address:指定鏈接器監聽的地址,默認爲全部地址,即0.0.0.0; #maxThreads:支持的最大併發鏈接數,默認爲200; #port:監聽的端口,默認爲0; #protocol:鏈接器使用的協議,默認爲HTTP/1.1,定義AJP協議時一般爲AJP/1.3; #redirectPort:若是某鏈接器支持的協議是HTTP,當接收客戶端發來的HTTPS請求時,則轉發至此屬性定義的端口; #connectionTimeout:等待客戶端發送請求的超時時間,單位爲毫秒,默認爲60000,即1分鐘; #enableLookups:是否經過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;默認爲true; #acceptCount:設置等待隊列的最大長度;一般在tomcat全部處理線程均處於繁忙狀態時,新發來的請求將被放置於等待隊列中; <Engine name="Catalina" defaultHost="localhost"> #defaultHost:Tomcat支持基於FQDN的虛擬主機,這些虛擬主機能夠經過在Engine容器中定義多個不一樣的Host組件來實現;但若是此引擎的鏈接器收到一個發往非非明肯定義虛擬主機的請求時則須要將此請求發往一個默認的虛擬主機進行處理,所以,在Engine中定義的多個虛擬主機的主機名稱中至少要有一個跟defaultHost定義的主機名稱同名; <Realm className="org.apache.catalina.realm.LockOutRealm"> #JAASRealm:基於Java Authintication and Authorization Service實現用戶認證; #JDBCRealm:經過JDBC訪問某關係型數據庫表實現用戶認證; #JNDIRealm:基於JNDI使用目錄服務實現認證信息的獲取; #MemoryRealm:查找tomcat-user.xml文件實現用戶信息的獲取; #UserDatabaseRealm:基於UserDatabase文件(一般是tomcat-user.xml)實現用戶認證,它實現是一個徹底可更新和持久有效的MemoryRealm,所以可以跟標準的MemoryRealm兼容;它經過JNDI實現; <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> #appBase:此Host的webapps目錄,即存放非歸檔的web應用程序的目錄或歸檔後的WAR文件的目錄路徑;可使用基於$CATALINA_HOME的相對路徑; #autoDeploy:在Tomcat處於運行狀態時放置於appBase目錄中的應用程序文件是否自動進行deploy;默認爲true; #unpackWars:在啓用此webapps時是否對WAR格式的歸檔文件先進行展開;默認爲true; <Context path="" docBase="/web/webapps"/> #path:相對於Web服務器根路徑而言的URI;若是爲空「」,則表示爲此webapp的根路徑;若是context定義在一個單獨的xml文件中,此屬性不須要定義; #docBase:相應的Web應用程序的存放位置;也可使用相對路徑,起始路徑爲此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的Host中appBase中定義的路徑名有包含關係,好比,若是appBase爲deploy,而docBase毫不能爲deploy-bbs類的名字; #reloadable:是否容許從新加載此context相關的Web應用程序的類;默認爲false; <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> #className:相關的java實現的類名,相應於分別應該爲org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve; #allow:以逗號分開的容許訪問的IP地址列表,支持正則表達式,所以,點號「.」用於IP地址時須要轉義;僅定義allow項時,非明確allow的地址均被deny; #deny: 以逗號分開的禁止訪問的IP地址列表,支持正則表達式;使用方式同allow; </Host> </Engine> </Service> </Server>
3、Tomcat的架構:
配置層次:
<server> <service> <connection /> <engine> <host> <context> </context> </host> </engine> </service> </server>
頂級組件:位於整個配置的頂層;
服務器(server):Tomcat的一個實例,一般一個JVM只能包含一個Tomcat實例;所以,一臺物理服務器上能夠在啓動多個JVM的狀況下在每個JVM中啓動一個Tomcat實例,每一個實例分屬於一個獨立的管理端口。這是一個頂級組件。
服務(service):一個服務組件一般包含一個引擎和與此引擎相關聯的一個或多個鏈接器。給服務命名能夠方便管理員在日誌文件中識別不一樣服務產生的日誌。一個server能夠包含多個service組件,但一般情下只爲一個service指派一個server。
容器類組件:能夠包含其餘組件的組件;
引擎(Engine):引擎通是指處理請求的Servlet引擎組件,即Catalina Servlet引擎,它檢查每個請求的HTTP首部信息以辨別此請求應該發往哪一個host或context,並將請求處理後的結果返回的相應的客戶端。嚴格意義上來講,容器沒必要非得經過引擎來實現,它也能夠是隻是一個容器。若是Tomcat被配置成爲獨立服務器,默認引擎就是已經定義好的引擎。而若是Tomcat被配置爲Apache Web服務器的提供Servlet功能的後端,默認引擎將被忽略,由於Web服務器自身就能肯定將用戶請求發往何處。一個引擎能夠包含多個host組件。
主機(Host):主機組件相似於Apache中的虛擬主機,但在Tomcat中只支持基於FQDN的「虛擬主機」。一個引擎至少要包含一個主機組件。
上下文(Context):Context組件是最內層次的組件,它表示Web應用程序自己。配置一個Context最主要的是指定Web應用程序的根目錄,以便Servlet容器可以將用戶請求發往正確的位置。Context組件也可包含自定義的錯誤頁,以實如今用戶訪問發生錯誤時提供友好的提示信息。
鏈接器組件:鏈接用戶請求至tomcat;
鏈接器(connectors):負責鏈接客戶端(能夠是瀏覽器或Web服務器)請求至Servlet容器內的Web應用程序,一般指的是接收客戶發來請求的位置及服務器端分配的端口。默認端口一般是HTTP協議的8080,管理員也能夠根據本身的須要改變此端口。一個引擎能夠配置多個鏈接器,但這些鏈接器必須使用不一樣的端口。默認的鏈接器是基於HTTP/1.1的Coyote。同時,Tomcat也支持AJP、JServ和JK2鏈接器。
被嵌套類組件:位於一個容器當中;不能包含其餘組件;
閥門(Valve):用來攔截請求並在將其轉至目標以前進行某種處理操做,相似於Servlet規範中定義的過濾器。Valve能夠定義在任何容器類的組件中。Valve常被用來記錄客戶端請求、客戶端IP地址和服務器等信息,這種處理技術一般被稱做請求轉儲(request dumping)。請求轉儲valve記錄請求客戶端請求數據包中的HTTP首部信息和cookie信息文件中,響應轉儲valve則記錄響應數據包首部信息和cookie信息至文件中。
日誌記錄器(Logger):用於記錄組件內部的狀態信息,可被用於除Context以外的任何容器中。日誌記錄的功能可被繼承,所以,一個引擎級別的Logger將會記錄引擎內部全部組件相關的信息,除非某內部組件定義了本身的Logger組件。
領域(Realm):用於用戶的認證和受權;在配置一個應用程序時,管理員能夠爲每一個資源或資源組定義角色及權限,而這些訪問控制功能的生效須要經過Realm來實現。Realm的認證能夠基於文本文件、數據庫表、LDAP服務等來實現。Realm的效用會遍佈整個引擎或頂級容器,所以,一個容器內的全部應用程序將共享用戶資源。同時,Realm能夠被其所在組件的子組件繼承,也能夠被子組件中定義的Realm所覆蓋。
鏈接器協議:
AJP(Apache JServ Protocol)協議:目前正在使用的AJP協議的版本是經過JK和JK2鏈接器提供支持的AJP13,它基於二進制的格式在Web服務器和Tomcat之間傳輸數據,而此前的版本AJP10和AJP11則使用文本格式傳輸數據。
HTTP協議:誠如其名稱所表示,其是使用HTTP或HTTPS協議在Web服務器和Tomcat之間創建通訊,此時,Tomcat就是一個徹底功能的HTTP服務器,它須要監聽在某端口上以接收來自於商前服務器的請求。
HTTP鏈接器:
基於java的HTTP/1.1鏈接器,這也是Tomcat6默認使用的鏈接器,即Coyote;它是Tomcat做爲standalone模式工做時所用到的鏈接器,可直接響應來自用戶瀏覽器的關於JSP、servlet和HTML的請求;此鏈接器是一個Java類,定義在server.xml當中,默認使用8080端口;
HTTP/1.1鏈接器,它支持非阻塞式IO和Comnet,在基於庫向tomcat發起請求時,此鏈接器表現不俗;但其實現不太成熟;
HTTP/1.1鏈接器;在負載較大的場景中,此鏈接器能夠提供很是好的性能;APR即Apache Portable Runtime,它是一個能讓開發者採用與平臺無關的風格的方式來開發C/C++代碼本地庫,它可以很好的跨Windows;
4、配置具體實例和管理頁面:
[root@node1 conf]# vim server.xml #在配置文件中添加Host虛擬主機 <Host name="www.soul.com" appBase="/www/webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="ROOT" reloadable="true" /> <Context path="/test" docBase="test" reloadable="true" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="soul.com_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> #這裏添加兩個context #建立對應的目錄 [root@node1 conf]# tree /www/ /www/ `-- webapps |-- ROOT | `-- index.jsp `-- test `-- index.jsp #對應的提供頁面文件 [root@node1 conf]# vim /www/webapps/ROOT/index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>JSP test page.</title> </head> <body> <% out.println("This is HomePage!"); %> </body> </html> ------------------------------------------------------------------- [root@node1 conf]# vim /www/webapps/test/index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>JSP test page.</title> </head> <body> <% out.println("This is test page!"); %> </body> </html>
測試都是正常的
開啓管理界面:
上述管理接口是須要認證的;開啓認證功能:
[root@node1 conf]# vim tomcat-users.xml #在<tomcat-users>下方添加以下行便可 <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="tomcat,manager-gui,admin-gui"/>
登錄後便可在線管理部署。
若有錯誤;懇請更正。