您的位置:首页 > 运维架构 > Tomcat

apache2.2与tomcat5.5整合

2010-02-04 12:42 447 查看
apache2.2与tomcat5.5整合

搞了几天终于把apache和tomcat,jsp,php,oracle的问题整合了。搜索了n多相关文章都没有真正解决自己的问题,问题的根源
在于自己没有明白到底要整合什么,要什么样的效果。最后还是通过搜索到的文章得到启发自己解决了特殊的问题。看来真正解决问题还是要靠自己,要理解技术本
身才能根据业务,根据实际情况变动,否则满世界的找问题都是无解。这个跟编程是相通的:自己都不明白的事情是不可能让程序来帮你完成,自己不理解的事情不
可能让电脑理解。以前作出的许多修改和努力都作废了不少,但没有全部白费,至少提供了更多的方法和可能性,深入理解了整合的原理。

下面先说明一下我的需求:

1.Tomcat5.5
在服务器上要同时放置公司内部信息平台和外部网站,内部网站用特殊端口号,外部网站用另外的端口(即tomcat需要设置两个端口),但同时有论坛和博
客,由于jsp的论坛博客成熟的产品很少,所以选择了php成熟的论坛discuz,而且为了方便采用Discuz!EXP套件安装的(同时安装了
php5.1,zend,mysql,apche2.2,目前最新版)。根据习惯论坛和博客是放置在D:/Discuz!EXP/wwwroot下面的,
而Tomcat是放在D:/Tomcat 5.5/webapps下面的。

2.服务器上面还同时安装了oracle数据库,所以80和8080端口都给oracle占用了,由于80端口必须给外网使用,所以修改oracle的80端口,报留oracle的8080端口。

3.想要的结果是http://localhost
http://localhost:8088
的结果是一样的,都是到tomcat外部网站项目下的首页,而输入 http://localhost/bbs
是到apche下面的wwwroot下面的bbs下面。

4.输入 http://localhost/admin
会自动跳转到指定项目下admin文件夹下面的login.jsp的登录页面。

解决方法:

1.修改oracle
apache的80端口号:Oracle安装目录里面,有一个Apache文件夹(D:/oracle/ora92/Apache/Apache),里面
有一个ports.ini文件,打开此文件,将s_apscheport = 80 改为 s_apscheport = 808(或其它端口号)。

[Ports]

s_apachePort = 808

s_apachePortSSL = 443

s_jservPort = 8007

oracle的http server端口的修改:

E:/oracle/ora92/Apache/Apache/conf/httpd.conf

找到

Listen 80

Listen 443

两行修改Listen 80 后保存文件,重启oracle的http服务器就可以了

2.设置tomcat的两个端口,并把一个默认端口指定到外部网站的目录下:(由于8080端口给oracel占用了,所以不能用,而80端口是给apache用的也不能用,外部网用8088,内部网用其他的)

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->

<Connector

port="8088" maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

connectionTimeout="20000" disableUploadTimeout="true" />

<Connector

port="9090" maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

connectionTimeout="20000" disableUploadTimeout="true" />

设置默认路径(在</Host>前面加入):

<Context path="" debug="0" docBase="D:/Tomcat 5.5/webapps/newplan" reloadable="true" privileged="true"></Context>

D:/Tomcat 5.5/webapps/newplan为你指定的项目路径,注意/不能反过来用/

3.由于目录到了指定项目下,所以root下面的tomcat感觉界面进入不了了,要重新设置(在</Host>前面加入):

<Context path="/root" debug="0" docBase="D:/Tomcat 5.5/webapps/ROOT" reloadable="true" privileged="true">

</Context>

由于路径改了,所以Tomcat下面的首页文件链接的路径也要修改,但由于root的jsp是打包成jar包的,所以要把编译后的jsp文件覆盖jar包下面的文件才会生效。详细说明请看:http://hi.baidu.com/zdz8207/blog/item/c4b2de548bb4925cd00906f4.html

4.修改apache配置文件

在D:/Discuz!EXP/Apache2/conf/httpd.conf 文件末尾加入下面内容:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyPass /images/ !

ProxyPass /bbs/ !

ProxyPass /blog/ !

ProxyPass / ajp://127.0.0.1:8009/

ProxyPassReverse / ajp://127.0.0.1:8009/

说明:第一部分是文件内本身有的只是需要把#去掉,为了方便直接加上就可以了。第二部分前面三个是 /images/ ,/bbs/,/blog/下的请求不转发,最后两句的“ / ” 表示全部转发到8009端口(tomcat监听的)。

写到这里才发现一个解决不了的问题,就是输入http://localhost/bbs
提示找不到目录,而输入http://localhost/bbs/
则会跳转到bbs下面,原来是这里设置了 /bbs/ 只要把 /bbs/ 改为
/bbs就可以了。由于用户或链接可能有/也可能没有/所以两种情况都有考虑,最后由于images不转的话tomcat项目下的images图片也显示
不了,所以images这个就不用设置了,另外要加入mysql的管理后台phpmyadmin。zdz的作品,流风的作品。最后加入的是:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_http_module modules/mod_proxy_http.so

#ProxyPass /images/ !

ProxyPass /bbs !

ProxyPass /bbs/ !

ProxyPass /blog !

ProxyPass /blog/ !

ProxyPass /phpMyAdmin !

ProxyPass /phpMyAdmin/ !

ProxyPass / ajp://127.0.0.1:8009/

ProxyPassReverse / ajp://127.0.0.1:8009/

5.mysql配置

站点配置文件设置说明

========================

由于 Discuz!EXP 中的 MySQL 使用 6033 端口启动,因而

Discuz! 和 SupeSite/X-Space 中的 config.inc.php/config.php

文件中 $dbhost 参数需要在主机地址后面追加端口号,如:

$dbhost = '12.34.56.78:6033';

如果需要将程序上传至远程虚拟主机空间或者实际服务器中,

则应去掉 :6033 ,使用服务器默认的 MySQL 服务端口。

6.配置tomcat的环境变量

TOMCAT_HOME

D:/Tomcat 5.5

7.由于apache转发过后的网站tomcat里面获取<%=request.getContextPath
()%>有些不同,所以必须把var urlcontent = <%=request.getContextPath
()%>/;修改成var urlcontent = '<%=request.getContextPath
()%>/';才可以,否则一直报javascript的错误,导致无法登录后台。

说明:由于昨天修改了配置文件,今天一来竟然启动不了apache了,看了好几次配置文件,修改了几个可疑的地方仍然找不到解决的办法。最后把
tomcat和discuz!EXP都卸载了重启后重装,再次配置了一遍竟然一切正常。看来有时候解决问题的办法还是重新来过的比较直接。

后记:在本机的windowxp系统上用以上的配置轻松整合了,但到了windows2003的服务器上面死活都不行,总是报错。503 错误

Service Temporarily Unavailable

The server is temporarily unable to service your request due to
maintenance downtime or capacity problems. Please try again later.

搜索了所有可能搜索的关键字都还没有找到解决的办法,尝试了所有想到的方法都没有解决,把tomcat和论坛都重装过几次仍然无果,整整郁闷了好几
天,到csdn上面发帖竟然一个人回答都没有。最后首到启发用 netstat
查一下那个端口是否被占用,在本机上面打开了http://localhost 后就能监听到两个8009

但在服务器上面就没有监听到,而是出来一打堆其他的端口号8000的最多还不停的跳,因为那台服务器还安装了其他的应用。

问题奇怪在于,我本机上面关闭网页后重启服务也没有监听到8009,而服务器上面也没有其他程序用到8009.为什么会这样呢?

理解了8009只是一个端口号,默认的监听端口号后就好办多了,把

ProxyPass / ajp://127.0.0.1:8009/

ProxyPassReverse / ajp://127.0.0.1:8009/

修改成

ProxyPass / ajp://127.0.0.1:8099/

ProxyPassReverse / ajp://127.0.0.1:8099/

把tomcat conf/server.xml下面的

<Connector port="8009"

enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

修改成

<Connector port="8099"

enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

重启tomcat,重启apache。打开网页,输入http://localhost

oye 一切ok,那个变态的503终于消失了!

这个过程中又学到了不少经验,原来用discuz!EXP安装的论坛只要路径相同那么文件可以随便copy来copy去,重新安装后直接用备份的资
料覆盖(或先删除安装目录下面的文件)就可以了。重新安装只是把一些dll文件放到系统文件里面和在注册表里面添加一些东西。这样就不用又来一次恢复那么
麻烦了。

---------------------------

参考资料:

1:前提准备:

安装文件:

Tomcat5.5.17.exe

下载:http://apache.justdn.org/tomcat/tomcat-5/v5.5.17/bin/apache-tomcat-5.5.17.exe

apache_2.2.4-win32-x86-no_ssl.msi

下载:http://apache.mirrors.tds.net/httpd/binaries/win32/apache_2.2.4-win32-x86-no_ssl.msi

php-5.2.1-win32-installer.msi

下载: http://cn2.php.net/get/php-5.2.1-win32-installer.msi/from/this/mirror

Mysql5.0.37

下载: http://mysql.isu.edu.tw/Downloads/MySQL-5.0/mysql-5.0.37-win32.zip

注意:这里每个版本都下载安装版,可以减少很多配置,也就是节约你的时间、精力。

测试文件:

test.php

<?php

phpinfo();

?>

test.jsp

<HTML>

<HEAD>

<TITLE> JSP TEST PAGE </TITLE>

</HEAD>

<BODY>

<%out.println("<H1>hello word!jsp</H1>");%>

</BODY>

</HTML>

testdb.php

<?php

$link=mysql_connect('localhost','root','123456');

if(!$link) echo "fail";

else echo "success";

mysql_close();

?>

2.安装tomcat,不用配置。(我的安装路径:D:/WEBSERVER/Tomcat5.5)

打开IE:http://localhost:8080/
出现小猫说明安装成功!

3.安装apache,也不用配置. (我的安装路径:D:/WEBSERVER/Apache2.2)

打开IE:http://localhost
/ 出现“It works!”说明安装成功!

4. 整合apache2.2.4与php5.2.1:

安装php5,(我的安装路径:D:/WEBSERVER/PHP/),安装的时候只需选择apache的版本,这里选择apache
2.2.x,然后选择你的apache安装位置(D:/WEBSERVER/Apache2.2)。其他的不用配置,默认即可。重启apache!完成后
即可解析.php文件。

测试:将两个测试文件放在D:/WEBSERVER/Apache2.2/htdocs下,然后IE:http://localhost/test.php
,出现php的相关版本信息说明整合apache2.2.4与php5.2.1成功。

http://localhost/test.jsp
,出现空白,因为这时apache不能解析.jsp。

5. 整合apache2.2.4与tomcat5.5.17:

因为apache2.2.4采用mod_proxy连接apache与tomcat,所以配置非常简单。这里我们只需要改动D:/WEBSERVER/Apache2.2/conf/ 下的httpd.conf的两个地方即可:

A:#LoadModule proxy_module modules/mod_proxy.so

#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

找到这两行,把前面的#去掉。

B:在最后加上

ProxyPass / ajp://127.0.0.1:8009/

ProxyPassReverse / ajp://127.0.0.1:8009/

保存后启动apache,再启动tomcat,地址栏输入http://localhost:8080/
出现小猫说明整合apache2.2.4与tomcat5.5.17成功!

测试:将两个测试文件放在D:/WEBSERVER/Tomcat5.5/webapps/ROOT 下,然后IE:

http://localhost/test.jsp
,显示“hello word!jsp”,OK了!但是此时IE:

http://localhost/test.php
,却不行(我最开始的时候表现是 服务器返回php文件,没有解析的,可以保存,类似下载)。

这主要是因为apache把所有80端口的请求都转发给了tomcat的8009(ProxyPass /
ajp://127.0.0.1:8009/ ;ProxyPassReverse /
ajp://127.0.0.1:8009/),由tomcat处理请求,这时的apache只相当于一个转发器的作用!而tomcat不能解析.php
所以对.php文件不成功。此时要是关闭tomcat,再访问还会出现Service Temporarily Unavailable 错误!

解决办法:将请求中静态的页面交给apache处理,动态请求交给tomcat处理。因为他们在各自的处理效率上比较高,这也是整合apache和tomcat的一个作用。

这里我们是要将php交给apache处理,而把jsp转发给tomcat处理。先看下面三句:

ProxyPass /images/ !

ProxyPass / ajp://127.0.0.1:8009/

ProxyPassReverse / ajp://127.0.0.1:8009/

第一句表示 /images/ 下的请求不转发,第2,3句的“ / ”
表示全部转发到8009端口(tomcat监听的)。所以这时只要把不想转发到tomcat处理的放在D:/WEBSERVER/Apache2.2
/htdocs 下 名为images文件夹的下面即可。比如:我们把

test.php放在D:/WEBSERVER/Apache2.2/htdocs/images 下,

test.jsp放在D:/WEBSERVER/Tomcat5.5/webapps/ROOT下,在分别

http://localhost/images/test.php

http://localhost/test.jsp

就都可以显示我们需要的结果了!

Apache
tomcat各司其职。这里都只是测试,具体项目,服务器的其他设置都可以通过在httpd.cong里修改,改变路径等。顺便说一下:这里的
Apache
tomcat是通过Mod-proxy连接起来的。Mod-proxy的缺点是,当其中一台tomcat停止运行的时候,apache仍然会转发请求过
去,导致502网关错误。但是只要服务器再启动就不存在这个问题。

Mod-proxy优点是.可以只将Apache置于公网,节省公网IP地址资源。可以通过设置来实现Apache专门负责处理静态网页,让
Tomcat专门负责处理JSP和servlet等动态请求。缺点是:如果前置Apache代理服务器停止运行,所有集群服务将无法对外提供。

6.安装MySQL

这里面就没有什么了,除了一两项需要手动设置一下其他默认就可以了。

7.PHP连接MySQL数据库。

首先注意:安装版的php5.2.1默认没有安装支持MySQL的组件,所以我们在安装的时候需要手动选择安装该组件:

选中MySQL组建 ,安装……next…..finish。

测试与解决:

将testdb.php放在images文件夹下,IE:http://localhost/images/testdb.php

1.Fatal error:Call to undefined function mysql_connect()……

解决:

1.将php5目录下的libmysql.dll复制到system32目录下,

2.将php5目录下的php.ini复制到windows目录下并命名为php.ini

重启服务器

这时就可以显示:success 表明PHP连接MySQL数据库成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: