1. 程式人生 > >Linux下Apache Httpd和tomcat整合

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

其中httpdjakarta-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 (建立連線這一步可以不需要)

4ajp_proxy方式整合配置

配置兩個tomcat做負載均衡,tomcat1tomcat2

首先注意修改兩個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 #如果使用域名,需要配置本機的windowshost檔案

編輯一個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的簡便性,同時又有了一定的容錯能力。

5mod_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/  

//如果直接下載的是.sotomcat連線檔案的話,只需將名稱改為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 #如果使用域名,需要配置本機的windowshost檔案

建立並配置/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做叢集負載均衡,tomcat1tomcat2

<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 複製

可以進行測試了~