`
gembler
  • 浏览: 36489 次
  • 性别: Icon_minigender_1
  • 来自: 妖都
社区版块
存档分类
最新评论

开发环境中的Apache

阅读更多

假设:

        项目需要做 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 去了..

分享到:
评论
9 楼 gembler 2008-12-11  
sdh5724 写道

在apache里加rewrite 必要的时候可以用的, 但是别和开发相关起来。 另外一点是, 开个apache做开发, 是不是有点难以维护, 而且是几个人使用同一个apache进程, 这个设计本身就很不合理。  应用的开发最好, 每个人都是独立的, 不要和其他人关联起来, 再说, rewrite在java里的代价是非常小的, 不需要觉得这个是不合理的。 我们的应用虽然也是跑在apache上, 但是, 开发人员根本不需要apache, 开发的启动应用的脚本, 根本不把apache启动起来, 只有在生产的脚本上, 把apache起来。 开发的时候, 关联的东西越少越好, 最好没有。

ok`明白,其实一值都是每个人独立的
只不过是突然间脑子发热了一下
8 楼 sdh5724 2008-12-11  
gembler 写道
sdh5724 写道
最好你的项目别和APACHE挂在一起,所有rewrite应该在程序的Filter 里做 你会发现, 世界干净了很多, APACHE太多的rewrite很容易失去控制。

说得有道理 ,可是能否给出一两个例子呢? 比方说你的那些血的教训


在apache里加rewrite 必要的时候可以用的, 但是别和开发相关起来。 另外一点是, 开个apache做开发, 是不是有点难以维护, 而且是几个人使用同一个apache进程, 这个设计本身就很不合理。  应用的开发最好, 每个人都是独立的, 不要和其他人关联起来, 再说, rewrite在java里的代价是非常小的, 不需要觉得这个是不合理的。 我们的应用虽然也是跑在apache上, 但是, 开发人员根本不需要apache, 开发的启动应用的脚本, 根本不把apache启动起来, 只有在生产的脚本上, 把apache起来。 开发的时候, 关联的东西越少越好, 最好没有。
7 楼 mysoko 2008-12-10  
是的,我得测试!
原来搞这东西了,拖了很长时间!
事情总不是计划的那么顺利。
think you
6 楼 gembler 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/
5 楼 mysoko 2008-12-10  
<p> </p>
<p>按照你说的,那我之前的jk配置如何改变成proxy ajp</p>
<p> </p>
<p><span>见</span><span/><a href='http://mysoko.iteye.com/blog/259676'>多个tomcat同一个apache,使用jk建立关系时常出错!</a></p>
<p> </p>
<p>我的配置需要注意的就是</p>
<p>三个工程的先后顺序</p>
<p> </p>
<p> #网站主工程 <br/>&lt;VirtualHost *:80&gt;<br/># ServerAdmin sydney.sun@demo.com  <br/># DocumentRoot "D:\apache-tomcat-5.5.26-root\webapps\insurance"  <br/># ServerName *.demo.com  <br/># JkMountFile conf/uriworkermap-root.properties  <br/># ErrorLog logs/demo-error.log  <br/># CustomLog logs/demo-access.log common  <br/># DirectoryIndex index.jsp  <br/>#   <br/>#     &lt;Directory "D:\apache-tomcat-5.5.26-root\webapps\insurance"&gt;  <br/>#         Options FollowSymLinks  <br/>#         AllowOverride None  <br/>#         order allow,deny  <br/>#         Allow from all  <br/>#     &lt;/Directory&gt;  <br/>  &lt;IfModule mod_rewrite.c&gt;<br/>    Rewriteengine on<br/>    RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.demo\.com$<br/>    RewriteRule ^/zx\.demo\.com/?$ /advisory/index.do [L,PT]<br/>    #...<br/>  &lt;/IfModule&gt;<br/>&lt;/VirtualHost&gt;<br/><br/>#保险新闻工程<br/>&lt;VirtualHost *:80&gt;<br/># ServerAdmin sydney.sun@demo.com  <br/># DocumentRoot "D:\apache-tomcat-5.5.26-news\webapps\news"  <br/># ServerName news.demo.com  <br/># JkMountFile conf/uriworkermap-news.properties  <br/># ErrorLog logs/news-error.log  <br/># CustomLog logs/news-access.log common  <br/># DirectoryIndex index.jsp  <br/>#   <br/>#     &lt;Directory "D:\apache-tomcat-5.5.26-news\webapps\news"&gt;  <br/>#         Options FollowSymLinks  <br/>#         AllowOverride None  <br/>#         order allow,deny  <br/>#         Allow from all  <br/>#     &lt;/Directory&gt;  <br/>&lt;/VirtualHost&gt;<br/><br/>#文件服务器工程<br/>&lt;VirtualHost *:80&gt;<br/># ServerAdmin sydney.sun@demo.com  <br/># DocumentRoot "D:\apache-tomcat-5.5.26-d1\webapps\d1"  <br/># ServerName d1.demo.com  <br/># JkMountFile conf/uriworkermap-d1.properties  <br/># ErrorLog logs/d1-error.log  <br/># CustomLog logs/d1-access.log common  <br/># DirectoryIndex index.jsp  <br/>#   <br/>#     &lt;Directory "D:\apache-tomcat-5.5.26-d1\webapps\d1"&gt;  <br/>#         Options FollowSymLinks  <br/>#         AllowOverride None  <br/>#         order allow,deny  <br/>#         Allow from all  <br/>#     &lt;/Directory&gt;  <br/>&lt;/VirtualHost&gt;</p>
<p> </p>
<p>je编辑器有点问题</p>
4 楼 gembler 2008-12-10  
sdh5724 写道
最好你的项目别和APACHE挂在一起,所有rewrite应该在程序的Filter 里做 你会发现, 世界干净了很多, APACHE太多的rewrite很容易失去控制。

说得有道理 ,可是能否给出一两个例子呢? 比方说你的那些血的教训
3 楼 gembler 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,然后端口不一样就行了(这种情况没试过,但理论上是这样解决)。
2 楼 sdh5724 2008-12-10  
最好你的项目别和APACHE挂在一起,所有rewrite应该在程序的Filter 里做 你会发现, 世界干净了很多, APACHE太多的rewrite很容易失去控制。
1 楼 mysoko 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

相关推荐

Global site tag (gtag.js) - Google Analytics