Apache和Tomcat整合

转自:http://blog.csdn.net/yunlong34574/article/details/19282175

手上的需求是要通过80端口进来apache,然后分发到不同的服务器程序,本身有php的程序在apache上跑着,而是用的橙云主机又不提供其他web接口,所以需要整合apache和tomcat


AJP基本介绍:

AJP是Apache提供的完成与其它服务器通讯的一种协议。

使用这种协议,具有更高的性能,因为它采用的是二进制传输。比HTTP的文本传输要有更高的效率。

在Apache中要使用mod_proxy和mod_proxy_ajp,在Tomcat中则要开启ajp服务。

http://www.cnblogs.com/zjstar12/archive/2012/08/11/2633623.html


Apache和Tomcat整合 

我这次使用的是AJP方式进行的整合

整合过程中发现几个问题:

1 linux下的apache2的目录组织形式和windows下有很大差别 http://blog.csdn.net/jibcy/article/details/8060651

比如加载module的代码实现方式是通过apache2.conf中include mods-enabled目录下所有软连接文件,而这个目录下的软连接文件分别指向mods-available目录下的各个文件

我们这里需要打开对proxy_ajp的支持,所以在mods-enabled下面创建了指向proxy_ajp的软链接,重启apache   apachectl -k graceful

root@S699922:/etc# apachectl -k graceful
apache2: Syntax error on line 210 of /etc/apache2/apache2.conf: Syntax error on line 2 of /etc/apache2/mods-enabled/proxy_ajp.load: Cannot load /usr/lib/apache2/modules/mod_proxy_ajp.so into server: /usr/lib/apache2/modules/mod_proxy_ajp.so: undefined symbol: proxy_module
Action '-k graceful' failed.

这里打开.../mods-available/proxy_ajp.load 文件会发现上面说这个模块依赖于proxy模块,所以proxy模块也需要加载进来才能正常工作。

2 虚拟主机配置

由于我这里servername是和另外一个php的servername重复的,区别是路径区别/ajp会访问到我的tomcat服务器,所以需要把到/ajp的访问设置放到前面才行,否则会被php的服务程序拦截。

另外这里使用的是8009端口,在tomcat的server.xml中本身有8009 AJP端口设置,我一开始尝试8080,没有访问成功。

下面是httpd.conf文件的内容

#ServerName localhost:80
NameVirtualHost localhost:80
<VirtualHost *:80>
ProxyPass /ajp ajp://127.0.0.1:8009/
ProxyPassReverse /ajp ajp://127.0.0.1:8009/
ServerName yiwa.890523.com
</VirtualHost>
<VirtualHost *:80>
        DocumentRoot "/var/www/"
        ServerName www.91yiwa.com
        ErrorDocument 404 /404.html
        <Directory / >
        Options FollowSymLinks
        AllowOverride all
        Order Allow,Deny
        Allow from all
        </Directory>
        DirectoryIndex index.html index.php
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/var/www/Yiwa/"
ServerName yiwa.890523.com
ErrorDocument 404 /404.html  
    <Directory / >
        Options FollowSymLinks
        AllowOverride all
        Order Allow,Deny
        Allow from all
    </Directory> 
    DirectoryIndex index.html index.php   
</VirtualHost>


http://blog.sina.com.cn/s/blog_5535e28201008hlx.html

http://hi.baidu.com/tedzhangzhe/item/dd3edd14d6c55df9746a84cb

Apache 2.2.4整合Tomcat 6.0.16三种方式的详细配置过程

通常都是通过JK_MOD来整合Apache和Tomcat,但是Apache2.2版本以上整合Tomcat可以直接通过AJP_PROXY来完成,很方便。下面把几种方式都简单讲讲。

假设一个Apache,两个Tomcat容器,访问 a.hackang.cn 和 b.hackang.cn 分别对应 tomcata 和 tomcatb 的应用

第一种方式:JK_PROXY

安装好Apache和Tomcat,下载mod_jk-1.2.26-httpd-2.2.4.so (2.2.4对应着Apache版本)

将mod_jk-1.2.26-httpd-2.2.4.so 放到Apache安装目录的modules文件夹下。

在Apache安装目录的conf文件夹创建workers.properties配置文件,内容如下:

#下面是Tomcat实例列表
worker.list=tomcata,tomcatb

#tomcata实例配置
worker.tomcata.host=127.0.0.1
worker.tomcata.port=8009
worker.tomcata.type=ajp13

#tomcatb实例配置
worker.tomcatb.host=127.0.0.1
worker.tomcatb.port=9009
worker.tomcatb.type=ajp13

编辑apache配置文件httpd.conf,在文件末尾加上以下内容:

#以下为tomcat集成配置部分
LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
#如果机器有多个IP地址请务必使用*号
NameVirtualHost *:80

 

#a.hackang.cn虚拟站点
<VirtualHost *:80>
ServerName a.hackang.cn
JkMount /*.* tomcata
JkMount /* tomcata
DirectoryIndex index.jsp
</VirtualHost>

#b.hackang.cn虚拟站点
<VirtualHost *:80>
ServerName b.hackang.cn
JkMount /*.* tomcatb
DirectoryIndex index.jsp
</VirtualHost>

下面是Tomcat的配置,很重要。

tomcata可以使用默认配置,如果想访问 a.hackang.cn直接显示某应用的首页,可在tomcata的配置文件server.xml里面的host节点间加上

<Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" 
charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" displayName="a.hackang.cn"docBase="E:\myweb\a"
       mapperClass="org.apache.catalina.core.StandardContextMapper" path=""  privileged="false" reloadable="false" swallowOutput="false" useNaming="true" 
       wrapperClass="org.apache.catalina.core.StandardWrapper">
</Context>

docBase指向的你应用所在的文件夹,不能将此应用部署到tomcata的webapps文件夹中。否则就有两个应用了,一个是根访问路径,一个是根访问路径+应用名了。

tomcatb的配置要稍加修改,修改 conf/server.xml文件

<Server port="8005" shutdown="SHUTDOWN">将此处的端口号改掉,不能与tomcata的相同,比如可以改成 9005

修改默认的8080端口为9090,修改后如下:

<Connector port="9090" maxHttpHeaderSize="8192"
             maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
             enableLookups="false" redirectPort="8443" acceptCount="100"
             connectionTimeout="20000" disableUploadTimeout="true" />

 

修改端口号为8009的Connector
修改前为:
<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
修改后:
<Connector port="9009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

此处的9009跟workers.properties文件中tomcatb的端口号是一致的。

如果也想访问 b.hackang.cn时直接显示应用b,配置方法同a,以上已经提及,只需将docBase="E:\myweb\a" 改成 docBase="E:\myweb\b"即可

最后编辑C:\WINDOWS\system32\drivers\etc\hosts文件,在最后加上两个映射

  127.0.0.1  a.hackang.cn 
  127.0.0.1  b.hackang.cn

 

至此,配置就结束了,可以用Apache的Test Configuration命令测试一下配置文件,如果没有问题,启动Apache,再分别启动两个Tomcat就ok了

第二种方式配置: ajp

apache2.2以上版本,无需使用jk_mod来集成tomcat,直接使用ajp,很方便。

修改apache配置文件httpd.conf

启用mod_proxy_ajp

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

把这两行前面的#去掉即可

然后在末尾加上

<VirtualHost *:80>
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/
ServerName a.hackang.cn
</VirtualHost>
<VirtualHost *:80>
ProxyPass / ajp://127.0.0.1:9009/
ProxyPassReverse / ajp://127.0.0.1:9009/
ServerName b.hackang.cn
</VirtualHost>

搞定!!!方便吧,我现在用的就是这种。

第三种方式

第三种方式其实跟第二种差不多,只不过用的是http端口

<VirtualHost *:80>
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
ServerName a.hackang.cn
</VirtualHost>
<VirtualHost *:80>
ProxyPass / http://127.0.0.1:9090/
ProxyPassReverse / http://127.0.0.1:9090/
ServerName b.hackang.cn
</VirtualHost>

此处的9090跟tomcatb中配置的http端口一致 

到此Apache整合Tomcat全部结束,若要加强tomcat处理静态资源的能力,可以启用APR服务。


关于mod引用

 查看apache支持的模块:

        httpd -l

    查看apache载入的模块:

        httpd -t -D DUMP_MODULES

 

    使用apache扩展工具apxs可以为apache编译和安装扩展模块。新安装的模块将作为动态共享对象提供给apache,因此,apache运行的平台必须支持DSO特性,并且httpd必须内建mod_so模块。这样才能使用mod_so提供的LoadModule指令在运行时将模块加载到apache服务器中。

 

    要为已运行的apache添加mod_proxy模块,先定位到apache源码中modules/proxy目录。然后使用apxs进行编译安装:

         /usr/local/apache2/bin/apxs -i -c -a  mod_proxy.c proxy_util.c

-c表示进行编译,-i表示将生成的模块安装到apache的modules目录下,-a选项在httpd.conf中增加一条LoadModule指令以载入刚安装的模块,或者如果此指令已存在,则启用之。

    apxs会根据源码判断模块的名称,或者(在失败的情况下)根据文件名推测模块名称,可以用-n选项显式地指定模块名称。

    安装成功以后将在apache的modules目录下生成mod_proxy.so文件,并且在httpd.conf中加入了一行

        LoadModule proxy_module modules/mod_proxy.so

 

    proxy只是核心模块,具体使用时还需要其它模块的支持,安装方法类似。

        /usr/local/apache2/bin/apxs -i -c -a mod_proxy_http.c

        /usr/local/apache2/bin/apxs -i -c -a mod_proxy_ftp.c

        /usr/local/apache2/bin/apxs -i -c -a mod_proxy_connect.c

    同样,安装后在apache的modules目录中生成了mod_proxy_http.so, mod_proxy_ftp.so, mod_proxy_connect.so文件。并且在httpd.conf中添加了如下行:

        LoadModule proxy_http_module  modules/mod_proxy_http.so
        LoadModule proxy_ftp_module   modules/mod_proxy_ftp.so
        LoadModule proxy_connect_module modules/mod_proxy_connect.so

 

    这样,mod_proxy模块就安装好了,进行具体的应用配置,重启apache就可以了。



# 安装proxy_ajp模块
[i5a6]# /usr/local/apache/bin/apxs -c -i -a mod_proxy_ajp.c ajp_header.c ajp_utils.c ajp_msg.c ajp_link.c



目标:同时支持解析PHP,JSP

方案:整合 Apache/PHP与Tomcat。考虑到速度,决定让Apache处理普通HTML文档和PHP请求,Tomcat处理JSP请求。

软件环境:阿里云CentOS 6.3 64位 linux,Apache 2.2.15,Tomcat 6

步骤:

(1)yum安装Apache、mysql、php,tomcat直接下载绿色版。

(2)httpd.conf虚拟主机配置

[plain]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <VirtualHost *:80>  
  2.     ServerName www.jsp1.com  
  3.     ProxyPass / ajp://localhost:8009/  
  4.     ProxyPassReverse / ajp://localhost:8009/  
  5. </VirtualHost>  
  6.   
  7. <VirtualHost *:80>  
  8.     ServerName www.<span style="font-family: Arial, Helvetica, sans-serif;">jsp2</span>.com  
  9.     ProxyPass / ajp://localhost:8009/  
  10.     ProxyPassReverse / ajp://localhost:8009/  
  11. </VirtualHost>  
  12.   
  13. <VirtualHost *:80>  
  14.     ServerName www.php1.com  
  15.     DocumentRoot /var/www/php1  
  16.     ErrorLog /etc/httpd/logs/php1<span style="font-family: Arial, Helvetica, sans-serif;">-error_log</span>  
  17.     CustomLog /etc/httpd/logs/php1-access_log common  
  18. </VirtualHost>  
前两个是通过ajp将访问的域名转发给tomcat处理,后一个是由php处理。

注意事项,由于本人配置了N次,弄了好长时间,总是只有配置的第一个虚拟主机生效,下面两个总是无效。最后终于找到了问题的所在,要特别加上这面一句。

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. NameVirtualHost *:80  

然后将Apache的端口设置为80

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. Listen 80  

(2)配置tomcat,端口8080

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version='1.0' encoding='utf-8'?>  
  2. <Server port="8005" shutdown="SHUTDOWN">  
  3.       
  4.     <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  
  5.     <Listener className="org.apache.catalina.core.JasperListener" />  
  6.     <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
  7.     <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />  
  8.     <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
  9.       
  10.     <GlobalNamingResources>  
  11.         <Resource name="UserDatabase" auth="Container"  
  12.               type="org.apache.catalina.UserDatabase"  
  13.               description="User database that can be updated and saved"  
  14.               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"  
  15.               pathname="conf/tomcat-users.xml" />  
  16.     </GlobalNamingResources>  
  17.       
  18.     <Service name="Catalina">  
  19.         <Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"   
  20.             connectionTimeout="20000"   
  21.             redirectPort="8443" compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="image/jpeg,image/png,text/html,text/xml,text/javascript,text/css,text/plain" />  
  22.         <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  
  23.         <Engine name="Catalina" defaultHost="localhost">  
  24.             <Realm className="org.apache.catalina.realm.UserDatabaseRealm"  
  25.                 resourceName="UserDatabase"/>  
  26.             <Host name="www.jsp1.com"  appBase="webapps"  
  27.                 unpackWARs="true" autoDeploy="true"  
  28.                 xmlValidation="false" xmlNamespaceAware="false">  
  29.                 <Context path="" docBase="/usr/local/wangdalei/www/jsp1" debug="0" reloadable="true"/>  
  30.             </Host>  
  31.             <Host name="www.jsp2.com"  appBase="webapps"  
  32.                 unpackWARs="true" autoDeploy="true"  
  33.                 xmlValidation="false" xmlNamespaceAware="false">  
  34.                 <Context path="" docBase="/usr/local/wangdalei/www/jsp2" debug="0" reloadable="true"/>  
  35.             </Host>  
  36.         </Engine>  
  37.     </Service>  
  38.       
  39. </Server>  


通过上面的配置可以看出,Apache接收到请求后,根据ServerName来匹配到域名后,将jsp项目的请求通过ajp代理转发给tomcat处理,tomcat中得ajp得监听端口是8009。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值