锁定老帖子 主题:开发环境中的Apache
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-20
最后修改:2008-11-20
假设: 项目需要做 URL Rewrite,不想用 UrlRewriteFilter 集成到应用程序里去,于是就选用一些 Web Server 来做,后来选了 Apache,但是又懒,不想每台开发机器都去做配置,因为确实很麻烦,规则变了又要每台开发机器都去同步,如果是 Linux 还好一点,可以 mount 一下。
有四台开发机器,IP 分别为:
192.168.1.10(Apache) 192.168.1.20(A同事) 192.168.1.30(B同事) 192.168.1.40(C同事)。
在192.168.1.10上部署一个 Apache,做 Rewrite 规则,然后统一分发到另外三台机器上。可是每位同事的开发机器上的项目的版本有可能不一致,而且还要根据各自手头上的版本来调试。
也就是说:A同事启动了应用程序,请求192.168.1.10的 Apache,享受了一了Rewrite 规则,然后被分发回A同事的 Tomcat
既然这样,每位同事都要弄个标识才行,端口是不错的选择:
A同事:1020 B同事:1030 C同事:1040
OK,标识分好了,就开始做配置了,Apache 的版本采用2.2,结合几个Module:
mod_rewrite mod_proxy mod_proxy_ajp/mod_proxy_http
在 make/make install Apache 前的 configure 加入几个参数:
./configure --enable-rewrite --enable-proxy --enable-proxy-ajp --enable-proxy-http
到 httpd.conf 了,当然少不了的是把 Module 们 load 进来:
LoadModule proxy_module modules/mod_proxy.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_http_module modules/mod_proxy_http.so
把几位同事对应的端口也配进去:
#A同事 Listen 1020 #B同事 Listen 1030 #C同事 Listen 1040
既然每位同事都有一台开发机器,那么就给他们每人多配一台虚拟机器吧:
#A同事 <VirtualHost *:1020></VirtualHost> #B同事 <VirtualHost *:1030></VirtualHost> #C同事 <VirtualHost *:1040></VirtualHost>
差点忘了proxy,Oops。都配上 mod_proxy_ajp 吧,免得麻烦。 在这个时候,C同事的孩子气来了,他说他一定要 mod_proxy_http,。。。。。
#顺被带上RewriteRule #A同事 <VirtualHost *:1020> ProxyPass / ajp://192.168.1.20:8009/ ProxyPassReverse / ajp://192.168.1.20:8009/ RewriteEngine On #RewriteRule... ... </VirtualHost> #B同事 <VirtualHost *:1030> ProxyPass / ajp://192.168.1.30:8009/ ProxyPassReverse / ajp://192.168.1.30:8009/ RewriteEngine On #RewriteRule... ... </VirtualHost> #C同事 <VirtualHost *:1040> ProxyPass / http://192.168.1.40:8080/ ProxyPassReverse / http://192.168.1.40:8080/ RewriteEngine On #RewriteRule... ... </VirtualHost>
个人感觉 mod_proxy 的风格比 mod_jk 好。 但是有一点很不爽,如果我想 /topics 目录下的 html 都由 Apache 解析,jsp都要由 Tomcat 解析。开始想着 “ProxyPass /topics/*.html !” 就行,后来屡试不爽,…#&¥@#×(&%×,竟然不支持通配符。
在 Tomcat 的 server.xml 里,AJP代理的,就对应回 AJP Connector 的 port,Http代理的,就对应回 Http Connector 的 port,另外,如果想在程序里用 request.getServerName() 取到代理的 Name、用request.getServerPort() 取到代理的 Port,就在 Connector 里配置 proxyName 和 proxyPort 吧。
OK,可以测试一下了:
A同事在地址栏敲入:http://192.168.1.10:1020
B同事在地址栏敲入:http://192.168.1.10:1030
C同事在地址栏敲入:http://192.168.1.10:1040
各取其需。。。。。。。可以写 Rewrite Rule 去了.. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-10
如果a同事在地址栏不敲端口呢,就是http://192.168.1.10,想到他的工作环境去,
b,c同样如此。。类似: http://a.demo.com 到a http://b.demo.com 到b http://c.demo.com 到c 还有这样的话,你这边是a,b,c每人一台机器上有个独立的项目,还要去假设访问apache哪里做什么?? 哈,就是让我想起了我那个问题! 特殊情况: 如果3个人的项目都在apache那机器上,装了3个tomcat分别放入a,b,c项目,给予tomcat相应的配置,那么apache这边又如何实现 http://a.demo.com 到a http://b.demo.com 到b http://c.demo.com 到c |
|
返回顶楼 | |
发表时间:2008-12-10
最好你的项目别和APACHE挂在一起,所有rewrite应该在程序的Filter 里做 你会发现, 世界干净了很多, APACHE太多的rewrite很容易失去控制。
|
|
返回顶楼 | |
发表时间:2008-12-10
最后修改:2008-12-10
mysoko 写道 如果a同事在地址栏不敲端口呢,就是http://192.168.1.10,想到他的工作环境去,
b,c同样如此。。类似: http://a.demo.com 到a http://b.demo.com 到b http://c.demo.com 到c 我这里只不过是其中一种方法(端口)来做标识 ,可以采用其他方法,比如你说的域名方式: 每位同事的hosts增加各自东西: A同事的hosts配置 写道 192.168.1.10 a.demo.com
B同事的hosts配置 写道 192.168.1.10 b.demo.com
C同事的hosts配置 写道 192.168.1.10 c.demo.com
然后修改Apache的httpd.conf: 1.所有都Listen都干掉,只弄一个: 原来的配置 写道 #A同事
Listen 1020 #B同事 Listen 1030 #C同事 Listen 1040 修改后的配置 写道 Listen 80
2.在那几VirtualHost前加一句: 写道 NameVirtualHost 192.168.1.10 3.每个VirtualHost都修改一下: 原来的配置 写道 #A同事
<VirtualHost *:1020></VirtualHost> #B同事 <VirtualHost *:1030></VirtualHost> #C同事 <VirtualHost *:1040></VirtualHost> 修改后的配置 写道 #A同事
<VirtualHost a.demo.com> #新加的ServerName ServerName a.demo.com #proxy和rewrite的东西不动 </VirtualHost> #B同事 <VirtualHost b.demo.com> #新加的ServerName ServerName b.demo.com #proxy和rewrite的东西不动 </VirtualHost> #C同事 <VirtualHost c.demo.com> #新加的ServerName ServerName c.demo.com #proxy和rewrite的东西不动 </VirtualHost> 4.在192.168.1.10(Apache)的机器上的hosts里增加指向本机ip的配置: hosts 写道 192.168.1.10 a.demo.com b.demo.com c.demo.com
btw:要是觉得每VirtualHost里都放相同的rewrite rule觉得不爽的话,可以分出文件出来,然后include。 --------------------------我要隔开我要隔开-------------------------- mysoko 写道 还有这样的话,你这边是a,b,c每人一台机器上有个独立的项目,还要去假设访问apache哪里做什么??
共享同一份rewrite rule。 --------------------------我要隔开我要隔开-------------------------- mysoko 写道 哈,就是让我想起了我那个问题!
特殊情况: 如果3个人的项目都在apache那机器上,装了3个tomcat分别放入a,b,c项目,给予tomcat相应的配置,那么apache这边又如何实现 http://a.demo.com 到a http://b.demo.com 到b http://c.demo.com 到c 在每个VirtualHost里ProxyPass和ProxyPassReverse后面的那ip都用本机ip,然后端口不一样就行了(这种情况没试过,但理论上是这样解决)。 |
|
返回顶楼 | |
发表时间:2008-12-10
最后修改:2008-12-10
sdh5724 写道 最好你的项目别和APACHE挂在一起,所有rewrite应该在程序的Filter 里做 你会发现, 世界干净了很多, APACHE太多的rewrite很容易失去控制。
说得有道理 ,可是能否给出一两个例子呢? 比方说你的那些血的教训 |
|
返回顶楼 | |
发表时间:2008-12-10
按照你说的,那我之前的jk配置如何改变成proxy ajp
见多个tomcat同一个apache,使用jk建立关系时常出错!
我的配置需要注意的就是 三个工程的先后顺序
#网站主工程
je编辑器有点问题 |
|
返回顶楼 | |
发表时间:2008-12-10
其实在你那贴子里,robbin都已经说了。我细化一点点:
在httpd.conf里注释掉所有关于jk的东西,然后把mod_proxy include进来,根据需要include其他mod,如mod_proxy_http(2.0+),mod_proxy_ajp(2.2+),mod_proxy_balancer(2.2+)。 在加上: ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/ or ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ |
|
返回顶楼 | |
发表时间:2008-12-10
是的,我得测试!
原来搞这东西了,拖了很长时间! 事情总不是计划的那么顺利。 think you |
|
返回顶楼 | |
发表时间:2008-12-11
gembler 写道 sdh5724 写道 最好你的项目别和APACHE挂在一起,所有rewrite应该在程序的Filter 里做 你会发现, 世界干净了很多, APACHE太多的rewrite很容易失去控制。
说得有道理 ,可是能否给出一两个例子呢? 比方说你的那些血的教训 在apache里加rewrite 必要的时候可以用的, 但是别和开发相关起来。 另外一点是, 开个apache做开发, 是不是有点难以维护, 而且是几个人使用同一个apache进程, 这个设计本身就很不合理。 应用的开发最好, 每个人都是独立的, 不要和其他人关联起来, 再说, rewrite在java里的代价是非常小的, 不需要觉得这个是不合理的。 我们的应用虽然也是跑在apache上, 但是, 开发人员根本不需要apache, 开发的启动应用的脚本, 根本不把apache启动起来, 只有在生产的脚本上, 把apache起来。 开发的时候, 关联的东西越少越好, 最好没有。 |
|
返回顶楼 | |
发表时间:2008-12-11
sdh5724 写道 在apache里加rewrite 必要的时候可以用的, 但是别和开发相关起来。 另外一点是, 开个apache做开发, 是不是有点难以维护, 而且是几个人使用同一个apache进程, 这个设计本身就很不合理。 应用的开发最好, 每个人都是独立的, 不要和其他人关联起来, 再说, rewrite在java里的代价是非常小的, 不需要觉得这个是不合理的。 我们的应用虽然也是跑在apache上, 但是, 开发人员根本不需要apache, 开发的启动应用的脚本, 根本不把apache启动起来, 只有在生产的脚本上, 把apache起来。 开发的时候, 关联的东西越少越好, 最好没有。 ok`明白,其实一值都是每个人独立的 只不过是突然间脑子发热了一下 。 |
|
返回顶楼 | |
浏览 6888 次