Linux下Apache Httpd和tomcat整合
最近學習apache+tomcat將網路上、書上和API上看到進行了一下整理,做了個小測試,算做入門學習總結吧,具體內容如下:
1、準備
下載需要的檔案。這裡假定你已經正確安裝配置好了JDK。
例如:chmod 777 jdk-6u37-linux-i586.bin
./jdk-6u37-linux-i586.bin 安裝jdk
mv 命令移動到指定路徑下
配置環境變數
root使用者,編輯 etc/profile檔案,修改JAVA_HOME路徑如下
#Java environment
export JAVA_HOME=/usr/local/jdk1.6.0_37
export CLASSPATH=./:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jre
並使之生效,執行
source /etc/profile
到Apache官方網站下載所需要的檔案:
httpd-2.4.3.tar.gz
apache-tomcat-6.0.36.tar.gz
tomcat-connectors-1.2.37-src.tar.gz
其中httpd和jakarta-tomcat-connectors為原始碼包,apache-tomcat為二進位制包。
2、安裝apache
程式碼:
# tar zxvf httpd-2.4.3.tar.gz
# cd httpd-2.4.3
# ./configure --prefix=/usr/local/apache2
# make
# make install
# ln -s /usr/local/apache2/ apache
備註1:安裝過程中提示需要gcc支援,解決方法如下
yum -y install gcc
yum -y install gcc-c++
備註2:安裝過程中提示提示APR not found 解決方法如下
下載apr安裝包:
http://apache.etoak.com//apr/apr-1.4.6.tar.gz
tar zxvf apr-1.4.6.tar.gz
cd apr-1.4.6
./configure --prefix=/usr/local/apr
make && make install
下載apr-util安裝包:
http://mirror.bjtu.edu.cn/apache//apr/apr-util-1.5.1.tar.gz
tar zxvf apr-util-1.5.1.tar.gz
cd apr-util-1.5.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-config
make && make install
下載pcre安裝包:
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.32.zip
unzip pcre-8.32.zip
cd pcre-8.32
./configure --prefix=/usr/local/pcre
make && make install
安裝httpd包:
tar zxvf httpd-2.4.3.tar.gz
cd httpd-2.4.3
./configure --prefix=/usr/local/apache2 --enable-so --enable-rewrite --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre/bin/pcre-config
make && make install
3、安裝Tomcat
程式碼:
# tar -zxvf apache-tomcat-6.0.36.tar.gz
# mv apache-tomcat-6.0.36 /usr/local/tomcat6
# ln -s /usr/local/tomcat6/ tomcat (建立連線這一步可以不需要)
4、ajp_proxy方式整合配置
配置兩個tomcat做負載均衡,tomcat1、tomcat2:
首先注意修改兩個tomcat的埠配置,修改server.xml:
<Server port="8005" shutdown="SHUTDOWN">
<Server port="9005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<Connector port="9080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
然後在server.xml中去掉<Engine>標籤的註釋,修改jvmRoute別名,如下:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
在host標籤下新增Context標籤,例如:(兩個tomcat配置一樣)
<Context path="" docBase="/home/smile/webapps/abc" debug="0" reloadable="true"
crossContext="true"/>
在每個tomcat目錄下的conf\Catalina\localhost目錄下建立一個ROOT.xml,如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/apps/cluster/gsp" privileged="true" antiResourceLocking="false"
antiJARLocking="false" distributable="true">
</Context>
修改web.xml檔案新增元素<distributable/>
編輯apache配置檔案 httpd.conf:
開啟如下模組的註釋:
LoadModule proxy_module modules/mod_proxy.so #引入ajp模組
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so #引入ajp模組
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #用於監控介面
在最後新增以下內容:
#用於監控介面
ProxyRequests Off
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://mycluster/ stickysession=JSESSIONID
<Proxy balancer://mycluster>
BalancerMember ajp://10.25.1.151:8009/ route=tomcat1 loadfactor=1
BalancerMember ajp://10.25.1.151:9009/ route=tomcat2 loadfactor=1
</Proxy>
#用於監控介面
SetHandler balancer-manager
注意如下幾個地方:
Listen 80 #不要新增IP或者localhost
ServerName localhost:80 #如果使用域名,需要配置本機的windows中host檔案
編輯一個jsp檔案用於測試
注意,針對 session處理,tomcat叢集有兩種方式:
sticky模式(黏性會話模式):同一個使用者的訪問請求都被派送到同一個tomcat例項上。
好處:無須在多臺伺服器之間實現session共享了
缺點:不能實現 failureover了,一但使用者訪問的機器掛掉,那麼其session就會丟失。
session複製模式:同一使用者的SESSION會被拷貝到各TOMCAT例項上。
好處:解決failureover的問題,即使某一臺web伺服器掛掉了,使用者請求會被負載到其他web伺服器上,且session也被複制了,對使用者而言就像是在同一臺機器上操作一樣。
缺點:session複製需要系統資源和網路的開銷,尤其是當web伺服器多的時候或session裡儲存的資料量大的時候,這點將會比較的明顯(未做極限測試)。
針對這兩種方式的優缺點,可以將兩種模式結合的方式來達到更好的效果,那就是sticky+session複製模式。使用者的請求按照 sticky方式被分發到同一個web伺服器上,同時tomcat在後臺做非同步複製(非同步)session到其他web伺服器,這樣我們使用 sticky的簡便性,同時又有了一定的容錯能力。
5、mod_jk.so方式整合配置
編譯生成mod_jk檔案
程式碼:
# tar -zxvf tomcat-connectors-1.2.37-src.tar.gz
# cd tomcat-connectors-1.2.37-src/native/
# ./configure --with-apxs=/usr/local/apache2/bin/apxs
--with-java-home=/usr/local/jdk1.6.0_37/
# make
# cp ./apache-2.0/mod_jk.so /usr/local/apache2/modules/
//如果直接下載的是.so的tomcat連線檔案的話,只需將名稱改為mod_jk.so,然後放在modules目錄下就可。
注意:編譯工程出現該情況是由於c++編譯器相關package沒有安裝,用超級使用者登陸,在終端上執行:
#yum install glibc-headers
#yum install gcc-c++
注意:如果需要重新生成so檔案儘量把../native/apache-2.0中多餘的檔案刪除掉,我的做法是重新解壓縮了一次tomcat-connectors-1.2.37-src.tar.gz
配置/usr/local/apache2/conf/httpd.conf 檔案,新增如下程式碼:
LoadModule jk_module modules/mod_jk.so
<IfModule jk_module>
JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn
</IfModule>
注意如下幾個地方:
Listen 80 #不要新增IP或者localhost
ServerName localhost:80 #如果使用域名,需要配置本機的windows中host檔案
建立並配置/usr/local/apache2/conf/workers.properties檔案,內容如下:
worker.list=wlb,jkstatus
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
# Define preferred failover node for tomcat1
#worker.tomcat1.redirect=tomcat2
worker.tomcat2.port=9009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
# Disable tomcat2 for all requests except failover
#worker.tomcat2.activation=disabled
worker.wlb.type=lb
worker.wlb.balance_workers=tomcat1,tomcat2
worker.jkstatus.type=status
#以上註釋掉的兩行如果開啟,則worker2成為worker1的備用,在worker1不可用的情況下才會向worker2請求
建立並配置/usr/local/apache2/conf/uriworkermap.properties,內容如下:
/admin/*=wlb
/manager/*=wlb
/jsp-examples/*=wlb
/servlets-examples/*=wlb
/examples/*=wlb
/*.jsp=wlb
/*=wlb
!/servlets-examples/*.jpeg=wlb
/jkmanager=jkstatus
!/*.gif=wlb
!/*.jpg=wlb
!/*.png=wlb
!/*.css=wlb
!/*.js=wlb
!/*.htm=wlb
!/*.html=wlb
配置兩個tomcat做叢集負載均衡,tomcat1、tomcat2:
<Server port="8005" shutdown="SHUTDOWN">
<Server port="9005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<Connector port="9080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" />
<Connector executor="tomcatThreadPool" port="9080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute=" tomcat2">
Context標籤兩個tomcat配置是一樣的
<Context path="" docBase="/home/smile/webapps/abc" debug="0" reloadable="true"
crossContext="true"/>
Cluster標籤兩個tomcat的配置是一樣的:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="127.0.0.1"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
修改應用程式的web.xml檔案:
在</web-app> 之前加上<distributable/> 用於session 複製
可以進行測試了~