Apache和Tomcat整合(一个Apache 不同域名处理多个不同业务) tomcat-connectors-1.2.41-src.tar.gz

一、简介

在项目中,几乎任何一个项目都包括静态资源和动态请求两大部分。特别对于门户网站这样的项目,静态内容资源会更多,我们使用一般的 Tomcat 部署时,Tomcat 对静态资源的处理能力比较慢,至少比 Apache 要慢很多。

为了提高项目的访问速度,降低服务器负载提高性能,我们使用Apache来处理静态资源,把动态资源和请求交给 Tomcat 处理。

当然,在单纯处理并发和静态资源指标方面,Nginx要比Apache好,至于Nginx和Apache的具体区别,以及什么项目使用Nginx、什么项目适合用Apache,异或是使用Nginx加Apache一起使用…… 这个不是本文要探讨的范围,这两个开源项目各有优缺点,大家可以针对自己项目选择合适的方案。

本文就简单的对Apache和Tomcat如何集成,进行实际配置进行说明:

apache与tomcat负载集群集成方法有3种jk、jk_proxy、http_proxy

二、mod_proxy 和 mod_jk 的比较

那么什么时候使用哪一个呢?这依赖于你的架构。如果你已经有了或者需要apache 2.2的功能,那么你可以再mod_proxy和mod_jk直接选择。mod_jk在apache2.2上允许得很好。关键看你需要什么样的功能:

mod_proxy
————–
优势:
不需要编译和维护一个对立的模块。mod_proxy,mod_proxy_http,mod_proxy_ajp,mod_proxy_balancer已经是apache 2.2+的标准集成部分;
可以使用http、https和AJP协议,即便是在同一个balancer中。
劣势:
mod_proxy_ajp不支持大于8k的数据包;
只有最基本的负载均衡器;
不支持域模型集群(domain model clustering)

mod_jk
————–
优势:
先进的负载均衡器;
先进的节点失败侦察功能;
支持大型AJP 数据包
劣势:
需要单独维护一个独立的模块;

我个人建议是如果有能力维护mod_jk模块的二进制版本,尽量使用mod_jk。mod_proxy一直在更新但还缺少一些mod_jk的功能。但是,如果你需要https和一个简单的负载均衡就是用mod_proxy.


三、实践

以 mod_jk 为例,使用1个apache 同时支持2个tomcat 不同业务的处理(web和wap)。

1、下载安装 Apache (本文忽略) 

2、下载安装 Tomcat (本文忽略)

3、下载 mod_jk 安装包

     下载连接Apache和Tomcat(mod_jk) 的包 tomcat-connectors-1.2.41-src.tar.gz

     官网下载地址:http://tomcat.apache.org/download-connectors.cgi

4、安装 mod_jk     

  1. <span style=”font-size:12px;”># cd tomcat-connectors-1.2.41-src/native/  
  2. # ./configure –with-apxs=/usr/local/apache2/bin/apxs  
  3. # make  
  4. # cp ./apache-2.0/mod_jk.so /usr/local/apache2/modules/ #拷贝至Apache指定模块目录  
  5. </span>  
# cd tomcat-connectors-1.2.41-src/native/




# ./configure --with-apxs=/usr/local/apache2/bin/apxs # make # cp ./apache-2.0/mod_jk.so /usr/local/apache2/modules/ #拷贝至Apache指定模块目录

5、配置Apache相关参数文件

1) 配置 mod_jk 模块
刚刚安装了mod_jk 模块,也已经拷贝到Apache的模块目录中,下面就是让Apache来支持它。
需要在Apache的conf目录下新建配置文件:

workers.properties #定义Tomcat工作的的配置文件
mod_jk.conf #定义mod_jk 的配置文件

# cd /usr/local/apache2/conf/

# vi mod_jk.conf

  1. <span style=“font-size:12px;”>#指定workers.properties的位置   
  2. JkWorkersFile conf/workers.properties  
  3. #指定jk的日志输出文件          
  4. JkLogFile logs/mod_jk.log  
  5. #JkShmFile配置  
  6. JkShmFile logs/jk-runtime-status  
  7. #指定日志级别       
  8. JkLogLevel info  
  9. #指定日志输出的时间戳格式         
  10. JkLogStampFormat ”[%a %b %d %H:%M:%S %Y]”  
  11. #JkOptions指示发送给SSL密钥大小  
  12. JkOptions  +ForwardKeySize +ForwardURICompat -ForwardDirectories  
  13. #指定日志中时间戳后面的内容:%w:工作的tomcat实例 %V:目标ip %T:耗时  
  14. JkRequestLogFormat ”%w %V %T”</span>  
#指定workers.properties的位置 
JkWorkersFile conf/workers.properties




#指定jk的日志输出文件 JkLogFile logs/mod_jk.log #JkShmFile配置 JkShmFile logs/jk-runtime-status #指定日志级别 JkLogLevel info #指定日志输出的时间戳格式 JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" #JkOptions指示发送给SSL密钥大小 JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories #指定日志中时间戳后面的内容:%w:工作的tomcat实例 %V:目标ip %T:耗时 JkRequestLogFormat "%w %V %T"

# vi workers.properties

  1. <span style=“font-size:12px;”>#指定需要工作的tomcat节点,如多个用“,”分割  
  2. worker.list=worker_web,worker_wap  
  3. ####################################################################  
  4. worker.worker_web.type=ajp13    #指定worker_web使用ajp13协议与Tomcat进程通讯  
  5. worker.worker_web.host=localhost    #指定worker_web的位置,如果不是本机,就配置IP地址  
  6. worker.worker_web.port=8009 #指定worker_web的工作端口  
  7. worker.worker_web.socket_keepalive=1    #此配置项为当Apache和Tomcat之间有防火墙时,让os每隔多久想未激活的连接发送KEEP_ALIVE信息,防止防火墙切断未激活的网络连接  
  8. worker.worker_web.socket_timeout=300    #指定worker_web上的连接在未激活的状况下持续多久,Apache将主动切断  
  9.   
  10. ####################################################################  
  11. worker.worker_wap.type=ajp13  
  12. worker.worker_wap.host=localhost  
  13. worker.worker_wap.port=8109  
  14. worker.worker_wap.socket_keepalive=1  
  15. worker.worker_wap.socket_timeout=300</span>  
#指定需要工作的tomcat节点,如多个用“,”分割
worker.list=worker_web,worker_wap




#################################################################### worker.worker_web.type=ajp13 #指定worker_web使用ajp13协议与Tomcat进程通讯 worker.worker_web.host=localhost #指定worker_web的位置,如果不是本机,就配置IP地址 worker.worker_web.port=8009 #指定worker_web的工作端口 worker.worker_web.socket_keepalive=1 #此配置项为当Apache和Tomcat之间有防火墙时,让os每隔多久想未激活的连接发送KEEP_ALIVE信息,防止防火墙切断未激活的网络连接 worker.worker_web.socket_timeout=300 #指定worker_web上的连接在未激活的状况下持续多久,Apache将主动切断 #################################################################### worker.worker_wap.type=ajp13 worker.worker_wap.host=localhost worker.worker_wap.port=8109 worker.worker_wap.socket_keepalive=1 worker.worker_wap.socket_timeout=300

2) 修改 Apache 的主配置文件 httpd.conf 配置多个虚拟主机

a) 找到 Include conf/extra/httpd-vhosts.conf 去掉前面的 “#”

b) vi conf/extra/httpd-vhosts.conf

  1. <span style=“font-size:12px;”>########################################################  
  2. LoadModule jk_module modules/mod_jk.so  
  3. Include conf/mod_jk.conf  
  4. ########################################################  
  5. <VirtualHost *:80>  
  6.     #ServerAdmin webmaster@dummy-host.example.com  
  7.     DocumentRoot ”/svcroot/runtime/webstatic/shanhyweb”  
  8.     ServerName shanhyweb.example.com  
  9.     #ServerAlias www.shanhyweb.example.com  
  10.     ErrorLog “logs/shanhyweb-error_log”  
  11.     CustomLog “logs/shanhyweb-access_log” common  
  12.         <IfModule mod_jk.c>  
  13.                 #日志输出文件(其他配置也可以重写mod_jk.conf里面的配置)  
  14.                 JkLogFile logs/mod_jk_shanhyweb.log  
  15.                 #指URL指向如果有servlet,则让worker_web去处理  
  16.                 JkMount /servlet/* worker_web  
  17.                 #指URL为/*.jsp的页面,让worker_web去处理  
  18.                 JkMount /*.jsp worker_web  
  19.                 #指URL为/*.do的页面,让worker_web去处理  
  20.                 JkMount /*.do worker_web  
  21.                 #指URL为/*.json的页面,让worker_web去处理  
  22.                 JkMount /*.json worker_web  
  23.         </IfModule>  
  24.         <Directory ”/svcroot/runtime/webstatic/shanhyweb”>  
  25.                 Options FollowSymLinks  
  26.                 AllowOverride None  
  27.                 Require all granted  
  28.         </Directory>  
  29. </VirtualHost>  
  30.   
  31. <VirtualHost *:80>  
  32.     #ServerAdmin webmaster@dummy-host.example.com  
  33.     DocumentRoot ”/svcroot/runtime/webstatic/shanhywap”  
  34.     ServerName shanhywap.example.com  
  35.     #ServerAlias www.shanhywap.example.com  
  36.     ErrorLog “logs/shanhywap-error_log”  
  37.     CustomLog “logs/shanhywap-access_log” common  
  38.         <IfModule mod_jk.c>  
  39.                 #日志输出文件(其他配置也可以重写mod_jk.conf里面的配置)  
  40.                 JkLogFile logs/mod_jk_shanhywap.log  
  41.                 #指URL指向如果有servlet,则让worker_wap去处理  
  42.                 JkMount /servlet/* worker_wap  
  43.                 #指URL为/*.jsp的页面,让worker_wap去处理  
  44.                 JkMount /*.jsp worker_wap  
  45.                 #指URL为/*.do的页面,让worker_wap去处理  
  46.                 JkMount /*.do worker_wap  
  47.                 #指URL为/*.json的页面,让worker_wap去处理  
  48.                 JkMount /*.json worker_wap  
  49.         </IfModule>  
  50.         <Directory ”/svcroot/runtime/webstatic/shanhywap”>  
  51.                 Options FollowSymLinks  
  52.                 AllowOverride None  
  53.                 Require all granted  
  54.         </Directory>  
  55. </VirtualHost></span>  
########################################################
LoadModule jk_module modules/mod_jk.so
Include conf/mod_jk.conf




######################################################## <VirtualHost *:80> #ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/svcroot/runtime/webstatic/shanhyweb" ServerName shanhyweb.example.com #ServerAlias www.shanhyweb.example.com ErrorLog "logs/shanhyweb-error_log" CustomLog "logs/shanhyweb-access_log" common <IfModule mod_jk.c> #日志输出文件(其他配置也可以重写mod_jk.conf里面的配置) JkLogFile logs/mod_jk_shanhyweb.log #指URL指向如果有servlet,则让worker_web去处理 JkMount /servlet/* worker_web #指URL为/*.jsp的页面,让worker_web去处理 JkMount /*.jsp worker_web #指URL为/*.do的页面,让worker_web去处理 JkMount /*.do worker_web #指URL为/*.json的页面,让worker_web去处理 JkMount /*.json worker_web </IfModule> <Directory "/svcroot/runtime/webstatic/shanhyweb"> Options FollowSymLinks AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost *:80> #ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/svcroot/runtime/webstatic/shanhywap" ServerName shanhywap.example.com #ServerAlias www.shanhywap.example.com ErrorLog "logs/shanhywap-error_log" CustomLog "logs/shanhywap-access_log" common <IfModule mod_jk.c> #日志输出文件(其他配置也可以重写mod_jk.conf里面的配置) JkLogFile logs/mod_jk_shanhywap.log #指URL指向如果有servlet,则让worker_wap去处理 JkMount /servlet/* worker_wap #指URL为/*.jsp的页面,让worker_wap去处理 JkMount /*.jsp worker_wap #指URL为/*.do的页面,让worker_wap去处理 JkMount /*.do worker_wap #指URL为/*.json的页面,让worker_wap去处理 JkMount /*.json worker_wap </IfModule> <Directory "/svcroot/runtime/webstatic/shanhywap"> Options FollowSymLinks AllowOverride None Require all granted </Directory> </VirtualHost>
配置文件中 /svcroot/runtime/webstatic/shanhyweb 和 /svcroot/runtime/webstatic/shanhywap 分别为web和wap的静态资源目录

配置文件中 worker_web 和 worker_wap 为我们2个处理不同业务的 Tomcat


6、 配置web的Tomcat 和wap 的Tomcat

我在/app/webserver 目录下放了2个tomcat,分别是 apache-tomcat-7.0.63-wap 和 apache-tomcat-7.0.63-web

修改 apache-tomcat-7.0.63-wap/conf/server.xml 中的ajp 端口为8109,http端口为 8180,server 端口为8105

在  apache-tomcat-7.0.63-wap/conf/server.xml 的最下面的 </Host> 上面一行添加:

<Context path=”” docBase=”/svcroot/runtime/webinterface/shanhywap” reloadable=”true” distributable=”true”/>

在  apache-tomcat-7.0.63-web/conf/server.xml 的最下面的 </Host> 上面一行添加:

<Context path=”” docBase=”/svcroot/runtime/webinterface/shanhyweb” reloadable=”true” distributable=”true”/>


7、重启相关服务

重启Apache 服务,并启动web和wap的tomcat 服务。


8、测试

修改本机 C:\Windows\System32\drivers\etc 目录下的 hosts 文件,在最后添加:

192.168.19.130 shanhyweb.example.com
192.168.19.130 shanhywap.example.com

其中 192.168.19.130 为我们上面配置的Linux 服务的IP地址。

服务器上静态资源文件:

/svcroot/runtime/webstatic/shanhywap/index.html 内容为 This is my page. ShanhyWap-Static.

/svcroot/runtime/webstatic/shanhyweb/index.html 内容为 This is my page. ShanhyWeb-Static.

服务器上2个Tomcat 配置的项目中的 jsp 测试文件:

/svcroot/runtime/webinterface/shanhywap/test.jsp 内容为 ShanhyWap Content.

/svcroot/runtime/webinterface/shanhyweb/test.jsp 内容为 ShanhyWeb Content.

访问地址测试:

访问:http://shanhywap.example.com 后网页显示 This is my page. ShanhyWap-Static.

访问:http://shanhyweb.example.com 后网页显示 This is my page. ShanhyWeb-Static.

访问:http://shanhywap.example.com/test.jsp 后网页显示 ShanhyWap Content.

访问:http://shanhywap.example.com/test.jsp 后网页显示 ShanhyWeb Content.


9、相关文件

最后列出本问整合涉及到的相关文件目录位置:

apache 安装目录 /usr/local/apache2

apache 相关配置文件:

/usr/local/apache2/conf/httpd.conf

/usr/local/apache2/conf/mod_jk.conf

/usr/local/apache2/conf/workers.properties

/usr/local/apache2/conf/extra/httpd-vhosts.conf

webserver 的2个Tomcat 目录:

/app/webserver/apache-tomcat-7.0.63-wap

/app/webserver/apache-tomcat-7.0.63-web

webinterface 程序目录(2个Tomcat分别对应的项目工程) :

/svcroot/runtime/webinterface/shanhyweb

– test.jsp

/svcroot/runtime/webinterface/shanhywap

– test.jsp

webstatic 静态资源目录

/svcroot/runtime/webstatic/shanhyweb

– index.html

/svcroot/runtime/webstatic/shanhywap

– index.html


************************************************************************

题外话说一下我的目录归类,我的 /svcroot 目录目录结构如下:

/svcroot

– runtime

   – standalone(存放java程序)

   – webinterface(存放Tomcat对应的项目工程)

   – webstatic(存放项目工程的静态资源)

– workspace

   – build(hudson custom 目录,SVN 代码)

       – shanhyweb-source

       – shanhywap-source

       – shanhyAndroid-source

   – dist(build编译后的文件目录,待发布)

– logs(项目相关logs)



————————–

(完)









访问:http://shanhywap.example.com 后网页显示 This is my page. ShanhyWap-Static.

访问:http://shanhyweb.example.com 后网页显示 This is my page. ShanhyWeb-Static.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值