如今,基於Web的應用越來越多,傳統的Html已經滿足不了如今的需求。我們需要一個交互式的Web,於是便誕生了各種Web語言。如Asp,Jsp,Php等。當然,這些語言與傳統的語言有着密切的聯繫,如Php基於C和C 語言,Jsp基於Java語言。Tomcat即是一個Jsp和Servlet的運行平臺。
Tomcat是一個免費的開源的Serlvet容器,它是Apache基金會的Jakarta項目中的一個核心項目,由Apache,Sun和其它一些公司及個人共同開發而成。由於有了Sun的參與和支持,最新的Servlet和Jsp規範總能在Tomcat中得到體現。Tomcat被JavaWorld雜誌的編輯選爲2001年度最具創新的java產品,可見其在業界的地位。
Tomcat最新版本是4.0x.4.0x與3.x的架構不同,而是重新設計的。Tomcat4.0x中採用了新的Servlet容器:Catalina,完整的實現了Servlet2.3和Jsp1.2規範。Tomcat提供了各種平臺的版本供下載,可以從http://jakarta.apache.org上下載其源代碼版或者二進制版。由於Java的跨平臺特性,基於Java的Tomcat也具有跨平臺性。與傳統的桌面應用程序不同,Tomcat中的應用程序是一個WAR(WebArchive)文件。WAR是Sun提出的一種Web應用程序格式,與JAR類似,也是許多文件的一個壓縮包。這個包中的文件按一定目錄結構來組織:通常其根目錄下包含有Html和Jsp文件或者包含這兩種文件的目錄,另外還會有一個WEB-INF目錄,這個目錄很重要。通常在WEB-INF目錄下有一個web.xml文件和一個classes目錄,web.xml是這個應用的配置文件,而classes目錄下則包含編譯好的Servlet類和Jsp或Servlet所依賴的其它類(如JavaBean)。通常這些所依賴的類也可以打包成JAR放到WEB-INF下的lib目錄下,當然也可以放到系統的CLASSPATH中,但那樣移植和管理起來不方便。
在Tomcat中,應用程序的部署很簡單,你只需將你的WAR放到Tomcat的webapp目錄下,Tomcat會自動檢測到這個文件,並將其解壓。你在瀏覽器中訪問這個應用的Jsp時,通常第一次會很慢,因爲Tomcat要將Jsp轉化爲Servlet文件,然後編譯。編譯以後,訪問將會很快。另外Tomcat也提供了一個應用:manager,訪問這個應用需要用戶名和密碼,用戶名和密碼存儲在一個xml文件中。通過這個應用,輔助於Ftp,你可以在遠程通過Web部署和撤銷應用。當然本地也可以。
Tomcat不僅僅是一個Servlet容器,它也具有傳統的Web服務器的功能:處理Html頁面。但是與Apache相比,它的處理靜態Html的能力就不如Apache.我們可以將Tomcat和Apache集成到一塊,讓Apache處理靜態Html,而Tomcat處理Jsp和Servlet.這種集成只需要修改一下Apache和Tomcat的配置文件即可。
另外,Tomcat提供Realm支持。Realm類似於Unix裏面的group.在Unix中,一個group對應着系統的一定資源,某個group不能訪問不屬於它的資源。Tomcat用Realm來對不同的應用(類似系統資源)賦給不同的用戶(類似group)。沒有權限的用戶則不能訪問這個應用。
Tomcat提供三種Realm,1:JDBCRealm,這個Realm將用戶信息存在數據庫裏,通過JDBC獲得用戶信息來進行驗證。2:JNDIRealm,用戶信息存在基於LDAP的服務器裏,通過JNDI獲取用戶信息。3:MemoryRealm,用戶信息存在一個xml文件裏面,上面講的manager應用驗證用戶時即使用此種Realm.通過Realm我們可以方便地對訪問某個應用的客戶進行驗證。
在Tomcat4中,你還可以利用Servlet2.3提供的事件監聽器功能,來對你的應用或者Session實行監聽。Tomcat也提供其它的一些特徵,如與SSL集成到一塊,實現安全傳輸。還有Tomcat也提供JNDI支持,這與那些J2EE應用服務器提供的是一致的。說到這裏我們要介紹一下通常所說的應用服務器(如WebLogic)與Tomcat有何區別。應用服務器提供更多的J2EE特徵,如EJB,JMS,JAAS等,同時也支持Jsp和Servlet.而Tomcat則功能沒有那麼強大,它不提供EJB等支持。
基於Tomcat的開發其實主要是Jsp和Servlet的開發,開發Jsp和Servlet非常簡單,你可以用普通的文本編輯器或者IDE,然後將其打包成WAR即可。我們這裏要提到另外一個工具Ant,Ant也是Jakarta中的一個子項目,它所實現的功能類似於Unix中的make.你需要寫一個build.xml文件,然後運行Ant就可以完成xml文件中定義的工作,這個工具對於一個大的應用來說非常好,我們只需在xml中寫很少的東西就可以將其編譯並打包成WAR.事實上,在很多應用服務器的發佈中都包含了Ant.另外,在Jsp1.2中,可以利用標籤庫實現Java代碼與Html文件的分離,使Jsp的維護更方便。
Tomcat也可以與其它一些軟件集成起來實現更多的功能。如與上面提到的JBoss集成起來開發EJB,Cocoon(Apache的另外一個項目)集成起來開發基於Xml的應用,與OpenJMS集成起來開發JMS應用,除了我們提到的這幾種,可以與Tomcat集成的軟件還有很多。Tomcat確實是一個很好的工具,不僅僅因爲其免費,功能強大,更因爲其開放性。如今,開源軟件越來越收到人們的重視,Linux就是一個成功的典型。人們不再限於只使用軟件,而且已經關心起軟件的具體實現。我們有理由相信Tomcat會走得更遠。
一、安裝配置tomcat:
1)安裝tomcat必須先安裝jdk:
lftp 172.16.0.1:~> cd pub/Sources/6.x86_64/jdk/
jdk-7u9-linux-x64.rpm
tomcat> get apache-tomcat-7.0.42.tar.gz
[root@node1 ~]# rpm -ivh jdk-7u9-linux-x64.rpm
Preparing... ########################################### [100%]
1:jdk ########################################### [100%]
2)編輯配置文件讓java工作起來
[root@node1 ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/lates
export PATH=$JAVA_HOME/bin:$PATH
[root@node1 ~]# . /etc/profile.d/java.sh
3)安裝tomcat:
[root@node1 ~]# tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local
[root@node1 ~]# cd /usr/local
[root@node1 local]# ln -sv apache-tomcat-7.0.42 tomcat
`tomcat' -> `apache-tomcat-7.0.42'
[root@node1 local]# cd tomcat
4)導出文件路徑
[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
5)爲tomcat提供啓動服務腳本
[root@node1 latest]# vim /etc/init.d/tomcat
!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
# JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
case $1 in
start)
exec $CATALINA_HOME/bin/catalina.sh start ;;
stop)
exec $CATALINA_HOME/bin/catalina.sh stop;;
restart)
$CATALINA_HOME/bin/catalina.sh stop
sleep 2
exec $CATALINA_HOME/bin/catalina.sh start ;;
configtest)
exec $CATALINA_HOME/bin/catalina.sh configtest ;;
*)
exec $CATALINA_HOME/bin/catalina.sh * ;;
esac
6)修改文件權限
[root@node1 latest]# chmod +x /etc/init.d/tomcat
[root@node1 latest]# service tomcat start
7)爲tomcat提供一個jsp頁面:
root@node1 webapps]# mkdir testapp
[root@node1 webapps]# cd testapp/
[root@node1 testapp]# mkdir -pv WEB-INF/{classes,lib}
mkdir: created directory `WEB-INF'
mkdir: created directory `WEB-INF/classes'
mkdir: created directory `WEB-INF/lib'
[root@node1 testapp]# vim index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JSP test Page</title>
</head>
<body>
<%
out.println("Hello world!");
out.println("Hello MageEdu!");
%>
</body>
</html>
這樣tomcat就可以工作了
二、以nginx反向代理tomcat
主機 ip 安裝服務
主機1 172.16.24.11 192.168.24.1 nginx
主機2 192.168.24.11 tomcat
主機3 192.168.24.12 tomcat
1)主機1編輯配置nginx
[root@slave3 ~]# vim /etc/nginx/nginx.conf
location / {
# root html;
# index index.html index.htm;
proxy_pass http://192.168.24.11:8080;
}
2)啓動nginx
[root@slave3 ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Reloading nginx: [ OK ]
3)nginx實現動靜分離
location / {
root /web/htdocs;
index index.html index.htm;
}
location ~* \.(jsp|do)$ {
proxy_pass http://192.168.24.11:8080;
}
location ~* \.(jpg|jpeg|png|pdf|doc|rar|) {
proxy_pass http://192.168.24.12:8080;
}
三、 配置apache通過mod_proxy模塊與Tomcat連接
要使用mod_proxy與Tomcat實例連接,需要apache已經裝載mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(實現Tomcat集羣時用到)等模塊:
# /usr/local/apache/bin/httpd -D DUMP_MODULES | grep proxy
proxy_module (shared)
proxy_connect_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_fcgi_module (shared)
proxy_scgi_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_express_module (shared)
2、在httpd.conf的全局配置段或虛擬主機中添加如下內容:
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://172.16.100.1:8009/
ProxyPa***everse / ajp://172.16.100.1:8009/
<Location / >
Require all granted
</Location>
或讓apache跟Tomcat的http連接器進行整合:
ProxyVia Off
ProxyRequests Off
ProxyPass / http://172.16.100.1:8080/
ProxyPa***everse / http://172.16.100.1:8080/
<Proxy *>
Require all granted
</Proxy>
<Location / >
Require all granted
</Location>
關於如上apache指令的說明:
ProxyPreserveHost {On|Off}:如果啓用此功能,代理會將用戶請求報文中的Host:行發送給後端的服務器,而不再使用ProxyPass指定的服務器地址。如果想在反向代理中支持虛擬主機,則需要開啓此項,否則就無需打開此功能。
ProxyVia {On|Off|Full|Block}:用於控制在http首部是否使用Via:,主要用於在多級代理中控制代理請求的流向。默認爲Off,即不啓用此功能;On表示每個請求和響應報文均添加Via:;Full表示每個Via:行都會添加當前apache服務器的版本號信息;Block表示每個代理請求報文中的Via:都會被移除。
ProxyRequests {On|Off}:是否開啓apache正向代理的功能;啓用此項時爲了代理http協議必須啓用mod_proxy_http模塊。同時,如果爲apache設置了ProxyPass,則必須將ProxyRequests設置爲Off。
ProxyPass [path] !|url [key=value key=value ...]]:將後端服務器某URL與當前服務器的某虛擬路徑關聯起來作爲提供服務的路徑,path爲當前服務器上的某虛擬路徑,url爲後端服務器上某URL路徑。使用此指令時必須將ProxyRequests的值設置爲Off。需要注意的是,如果path以“/”結尾,則對應的url也必須以“/”結尾,反之亦然。
另外,mod_proxy模塊在httpd 2.1的版本之後支持與後端服務器的連接池功能,連接在按需創建在可以保存至連接池中以備進一步使用。連接池大小或其它設定可以通過在ProxyPass中使用key=value的方式定義。
1)apache基於http代理tomcat
[root@slave3 ~]# cd /etc/httpd/
[root@slave3 httpd]# ls
conf conf.d logs modules run
[root@slave3 httpd]# cd conf.d
[root@slave3 conf.d]# ls
mod_dnssd.conf README welcome.conf
[root@slave3 conf.d]# vim tomcat.conf
ProxyVia on
ProxyRequests off
proxyPreserveHost on
ProxyPass / http://192.168.24.11:8080/
ProxyPa***everse / httpd://192.168.24.11:8080/
<Location />
Order Allow,Deny
Allow from all
</Location>
2)apache基於jsp代理tomcat
[root@slave3 conf.d]# vim tomcat.conf
ProxyVia on
ProxyRequests off
proxyPreserveHost on
ProxyPass / ajp://192.168.24.11:8009/
ProxyPa***everse / ajp://192.168.24.11:8009/
<Location />
Order Allow,Deny
Allow from all
</Location>