Linux下Apache Httpd和tomcat整合

时间:2021-02-11 16:55:37

最近学习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 复制

 

可以进行测试了~