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数据库成功!