apache+resin+pureftp的虚拟主机和负载均衡[原创]

发表于:2007-07-04来源:作者:点击数: 标签:
1、前言 apache+resin来做想来大家都比较熟悉了,一般的配置都是很熟悉的了,我查看了一些论坛上的文章,这方便的文章比较多。在这里,我只要写写apache+resin实现独立的虚拟主机和resin自带的负载均衡。 2、系统和环境: redhat9andsolaris9 httpd-2.50 re

1、前言
  apache+resin来做想来大家都比较熟悉了,一般的配置都是很熟悉的了,我查看了一些论坛上的文章,这方便的文章比较多。在这里,我只要写写apache+resin实现独立的虚拟主机和resin自带的负载均衡。

2、系统和环境:
redhat9 and solaris9
httpd-2.50
resin-3.06
pure-ftpd-1.0.17a.tar.gz
3、安装软件:

3.1、安装apache:

# tar zxvf httpd-2.49.tar.gz
# cd httpd-2.49
# ./configure --prefix=/usr/local/apache2 --enable-so --with-mpm=worker
# make
# make install

3.2、安装resin:

# tar zxvf resin-3.06.tar.gz
# cd resin03.06
# ./configure --prefix=/usr/local/resin --with-apxs=/usr/local/apache2/bin/apxs
# make
# make install

3.3、安装pureftp

# tar zxvf pure-ftpd-1.0.17a.tar.gz 
# cd pure-ftpd-1.0.17a
# ./configure --prefix=/usr/local/pureftpd
   --without-inetd --with-puredb
   --with-cookie --with-throttling
   --with-ratios --with-quotas 
   --with-ftpwho --with-largefile
   --with-welcomemsg
# make
# make install
# mkdir /usr/local/pureftpd/etc

4、配置软件:

目的:用apache和resin做基于域名的虚拟主机,启用resin自身的负载均衡的引擎。resin的负载均衡引擎实际上是可以启动多个java响应进程,通过内部机制来进行负载均衡。

4.1、配置apache:

# vi /usr/local/apache2/conf/httpd.conf
---------------------------------------
 DirctoryIndex index.html index.jsp
 AddDefaultCharset Off
 User nobody
 Group nobody
 NamevirtualHost 211.11.11.11
 <VirtualHost 211.11.11.11:80>
    ServerAdmin peng.zhang@bj.china.com
    DocumentRoot /data/web/xcity
    ServerName xcity.chinaunix.com
    ErrorLog logs/xcity.chinaunix.com-error_log
    CustomLog logs/xcity.chinaunix.com-aclearcase/" target="_blank" >ccess_log common
</VirtualHost>

<VirtualHost 211.11.11.11:80>
    ServerAdmin peng.zhang@bj.china.com
    DocumentRoot /data/web/sports
    ServerName sports.chinaunix.com
    ErrorLog logs/sports.chinaunix.com-error_log
    CustomLog logs/sports.chinaunix.com-access_log common
</VirtualHost>
........
....
# mod_caucho Resin Configuration
#

LoadModule caucho_module /usr/local/apache2/modules/mod_caucho.so

ResinConfigServer 127.0.0.1
---------------------------------------

4.2、配置resin:

# vi /usr/local/resin/conf/resin.conf
----------------------------------------

    <cluster>
      <srun id="a" host="127.0.0.1" port="6801" index="1"/>
      <srun id="b" host="127.0.0.1" port="6802" index="2"/>
      <srun id="c" host="127.0.0.1" port="6803" index="3"/>
      <srun id="d" host="127.0.0.1" port="6804" index="4"/>
    </cluster>

---注解:
(这里面,我用了系统本身的127.0.0.1,绑定了4个端口做伏在均衡。还可以用不同的ip地址和同一端口,来作。例如:
<cluster>
      <srun id="a" host="211.11.11.11" port="6802" index="1"/>
      <srun id="b" host="211.11.11.12" port="6802" index="2"/>
      <srun id="c" host="211.11.11.13" port="6802" index="3"/>
      <srun id="d" host="211.11.11.14" port="6802" index="4"/>
    </cluster>
还有些人,喜欢在apache中设置每一个java进程服务一个虚拟,这里我们不推荐,这样做,就会失去引擎本身的意义。)

<!-- configures the default host, matching any host name -->
    <host id='xcity.chinaunix.com'>
      <document-directory>/data/web/xcity</document-directory>
     <!-- configures the root web-app -->
     <web-app id='/'>
        <!-- adds xsl to the search path -->
        <class-loader>
          <simple-loader path="$host-root/xsl"/>
        </class-loader>
   <servlet-mapping url-pattern="/servlet/*" servlet-name="invoker"/>
      </web-app>
      </host>

      <host id='sports.chinaunix.com'>
      <document-directory>/opt/web/sports</document-directory>
      <!-- configures the root web-app -->
      <web-app id='/'>
        <!-- adds xsl to the search path -->
        <class-loader>
        <simple-loader path="$host-root/xsl"/>
        </class-loader>
       <servlet-mapping url-pattern="/servlet/*" servlet-name="invoker"/>
      </web-app>
     </host>
........
....

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

---注:这里面是基于域名的虚拟主机,如果是针对ip的虚拟主机,在<host id='*.*.*.*'>中,就应该是对应虚拟主机的ip了。也就是说,apache和resin关于虚拟主机的地方要保持一致。还有,在resin中,对于每个虚拟主机所用的web-app目录,其实是相对于她的家目录下的/目录。

4.3、配置pureftp
1、添加用户:
# pure-pw useradd xcityr -f /usr/local/pureftp/etc/ftppasswd -u nobody -g nobody -d /data/web/xcity -m

# pure-pw useradd sports -f /usr/local/pureftp/etc/ftppasswd -u nobody -g nobody -d /data/web/sports -m

   ---注:xcity :ftp用户 
       -f ftppasswd:存放用户密码信息的文件
       -u 用户uid  一般是系统的一个用户,就是你的ftp用户的家目录的用户
       -g 用户组id
       -d 锁定用户在家目录
       -m 使pureftp.d.passwd写进pureftpd.pdb,使更改生效。

*修改用户:
# pure-pw usermod --help

*删除用户:
# pure-pw userdel <login> [-f <passwd file>] [-m]

*更改拥护密码:

# pure-pw passwd  <login> [-f <passwd file>] [-m]

*查看用户详细内容:

# pure-pw show    <login> [-f <passwd file>]

*生成db文件,使密码生效:
# pure-pw mkdb    [<puredb database file> [-f <passwd file>]]

*列出所有用户:
# pure-pw list    [-f <passwd file>]


5、启动脚本:

当系统在solaris下:

apache和resin的启动脚本:
# vi /etc/rc2.d/S99webapp
-------------------------------
/usr/local/resin/bin/httpd.sh -pid srun1.pid -server a start
/usr/local/resin/bin/httpd.sh -pid srun2.pid -server b start
/usr/local/resin/bin/httpd.sh -pid srun3.pid -server c start
/usr/local/resin/bin/httpd.sh -pid srun4.pid -server d start
/usr/local/apache2/bin/apachectl start
--------------------------------

pureftp启动脚本:
--------------------------------
 #!/bin/sh
    
 /usr/local/pureftpd/sbin/pure-ftpd -j -lpuredb:/usr/local/pureftpd/etc/pureftpd.pdb &
-----------------------------------

在linux下,直接放到响应的开机启动等级目录下就ok了。

6、总结
 apache+resin应该是个很好的java应用平台了。实际使用中,还是有很多技巧。看了resin官方论坛的一些资料,说resin3.x以上的版本,对image和html的支持,比apache响应更快。我对此测试过,感觉还是有所欠缺。所以说,在大型一点的发布平台上,还是要apache和resin结合比较好。
  对于resin的负载均衡使用上启动的进程数,我认为还是要根据自己的机器实际情况来考虑的。少了达不到效果,多了会机器系统也是一个负载。个人认为,4个可以作为一个默认的选择来考虑。

声明: 
写文章的时候,参考很多网友资料,如有雷同,不一定纯属巧合。 
以上过程,都是本人亲自测试和使用,但也难保证有书写遗漏,欢迎指出。
本着自由、共享的精神,网友可以任意转贴,转贴时请注明作者、出处。

 leirenyuan 回复于:2004-08-19 16:19:15
好东西
支持

 vipcui 回复于:2004-08-19 16:42:56
好文章,支持,我马上就要开展虚拟主机业务了。

 slg23 回复于:2004-08-19 17:31:25
window  apache   resin

 tianci3982730 回复于:2004-08-20 08:50:26
呵呵。。曾经用过不同机器不同ip的apache resin负载平衡
感觉不爽啊。几万人就会死掉

 peng 回复于:2004-08-20 09:05:24
[quote:b4e41cb224="tianci3982730"]呵呵。。曾经用过不同机器不同ip的apache resin负载平衡
感觉不爽啊。几万人就会死掉[/quote:b4e41cb224]

如果真是同时在线几万人,就应该考虑在apache前面加squid做cache了。

同时可以通过dns论寻来实现请求均衡。

 zjs-1 回复于:2004-08-20 09:05:49
好,实践一下!

 pansoncn 回复于:2004-08-21 23:13:23
好文章,学习!我也是这样的系统

 skylove 回复于:2004-08-22 09:18:34
[quote:d4ae42f122="peng"]

如果真是同时在线几万人,就应该考虑在apache前面加squid做cache了。

同时可以通过dns论寻来实现请求均衡。[/quote:d4ae42f122]

如果我的对象是论坛,那么用squid做cache的意义是不是就不大了??? 现在我这里流量大一些的,似乎都是论坛类的。。。

 handsun 回复于:2004-08-22 09:41:15
支持一下!

 mofaser 回复于:2004-08-22 11:12:39
不错,支持一下~!

 蓝色虫 回复于:2004-08-22 12:49:26
是好文章

 Fun-FreeBSD 回复于:2004-08-26 08:53:35
peng哥,再发个tomcat的吧,我都需要

 peng 回复于:2004-08-26 09:45:55
[quote:2478485176="skylove"]

如果我的对象是论坛,那么用squid做cache的意义是不是就不大了??? 现在我这里流量大一些的,似乎都是论坛类的。。。[/quote:2478485176]

论坛用cache的意义更大。对于论坛,一般都是用动态的网页技术(jsp or php),squid的工作原理是复制已有的动态网页为静态页面到自己的存贮条带中。这样的好处就是减轻jsp or php 这种应用服务器的压力,页面静态化(因为静态的页面访问最快),减轻对磁盘的IO压力(很多访问都是转移到cache服务器的条带中)。。

 livelybear 回复于:2004-08-26 09:48:14
:em02:  :em02:  :em02: 

老PENG是大好银!

 peng 回复于:2004-08-26 10:00:23
[quote:aaa176234e="Fun-FreeBSD"]peng哥,再发个tomcat的吧,我都需要[/quote:aaa176234e]

晕,tomcat没有用过,我看过一些老外写的测试报告。tomcat的稳定性和压力测试,都不如resin。

唯一的优点是,他和apache是兄弟产品。为了公司产品的单一化,除了超大型的服务还用(dynimo和iplanet)俺已经把公司的java平台都变成了resin。


 
当然了,如果你需要更专业的(有钱的话),websphereweblogic、iplanet(现在好像叫sun one了))。

 adrianmak 回复于:2004-09-02 14:22:04
請問以resin作负载均衡, 是否只對jsp, servlets生效?
對php 有沒有用?

 peng 回复于:2004-09-02 17:40:06
[quote:d1d8582fe8="adrianmak"]請問以resin作负载均衡, 是否只對jsp, servlets生效?
對php 有沒有用?[/quote:d1d8582fe8]

 :em06:  :em06: 

resin和php有关系吗?
resin是java的应用平台啊。。

 jackylau 回复于:2004-09-02 19:47:57
peng这几天是不是没什么事呀?最近发了不少精华贴子呀!

 simonzhan 回复于:2004-09-02 23:25:53
不错的说,支持一下。

 firer2000 回复于:2004-09-03 08:56:28
出手不凡!!

 minasi 回复于:2004-09-03 10:24:20
各位楼主,有没有apache + weblogic的负载均衡呀?现在公司用dns轮寻,但好像经常有问题!

寻求好的解决方案,谢谢各位楼主指点!

 peng 回复于:2004-09-03 10:57:05
[quote:5972990d2d="minasi"]各位楼主,有没有apache + weblogic的负载均衡呀?现在公司用dns轮寻,但好像经常有问题!

寻求好的解决方案,谢谢各位楼主指点![/quote:5972990d2d]

dns论寻的好处是经济实惠,坏处就是如果一个server坏了,很难发现和找出。

好的解决办法是用负载均衡器,也就是那种4层交换机了。
常用的就是北电的和cisco,比如:f5,但是投入应该在40万左右。

还有的人用一台机器在前段做负载均衡,通过软件,但是效果不好。问题不在于机器的处理能力(因为现在的机器都很快了),而是机器的总线宽度。对于上10万个连接,如果用sun15k还可以考虑,其他档次的不要想了。所以说,这种群集对于处理数据运算的合适的。但是它不能针对web访问方式,来负载httpd请求。所以,我感觉软件的意义不大。

所以我认为,如果是web服务器,除了dns论寻,只能考虑硬件的伏在均衡器了。sina、263、tom、china在某些服务上,都是用的伏在均衡器。

昨天去了2911、联通的机房,看到做伏在均衡的都是用这种设备。

 peng 回复于:2004-09-03 11:21:01
其实楼上的说apache+weblogic有问题,具体是什么问题啊?有没有错误现象和日志。

对于java的应用服务器,其实问题很多是出在设计和构架的思路上。这个具体问题还要具体分析了。举个简单例子:

前端是apache来接收访问,对于jsp的请求,转发给weblogic,但是多少个apache server对应一个weblogic机器?这个要从机器的系统性能来分析了。如果是访问量很大,对于jsp的请求超出了weblogic的能力。那么增大apache,其实是不能解决问题的,而是加大了weblogic的负担。
还有,如果涉及到数据库的问题,对于数据库的访问,也会托跨weblogic的。

以前我搭建过这种结构,通常是分析apache的80端口和weblogic的响应端口,看看负载究竟出在什么地方。是web,还是java,还是数据库,还是存储。

其实dns论寻本身没有什么可以调的。他是很简单的,问题一般都是底层的服务配置和构建原因引起的。

 minasi 回复于:2004-09-03 12:49:54
我们的数据库没有问题,有时连接数很大也还可以。但就是weblogic应用服务器曾死过。是这样,6台机器都变慢了,这是有一台死了,然后其它的又都正常了,这时数据库一直都没问题!除了DNS轮寻,我们还有一个自己写的高度程序,但可能不太完善。请问peng,squid可以做高度吗?squid能检测应用服务器的状态吗,可能按负载指派吗?

 peng 回复于:2004-09-03 13:14:04
[quote:21a559be14="minasi"]我们的数据库没有问题,有时连接数很大也还可以。但就是weblogic应用服务器曾死过。是这样,6台机器都变慢了,这是有一台死了,然后其它的又都正常了,这时数据库一直都没问题!除了DNS轮寻,我们还有一个自己写的高..........[/quote:21a559be14]

6台是什么,是webserver还是weblogic?

其实,用squid是一个非常不错的选择。
squid的好处是减轻apache和weblogic的负载,把动态页面静态化。同时还减轻io的负载。

其实你可以这样的,对外响应的服务器都是squid,给squid用80端口,然后apache用81端口来连接squid。
这样的结构就是,4个squid对外响应,他们下层是2个apache服务器。最下边是weblogic。好处是对于攻击,可以防范在外层。

还有一种结构就是,4个squid和2个apache同时对外响应服务。他们是平级的。然后他们的下层是weblogic。这样的结构对比第一种,可以加大对http的并行连接数量。

关于squid和apache的数量对比,可以参考两点:
1、web对站点的访问是读取的多,还是生成新页面的多。
2、最大访问量,一般的情况。squid的软件上线是3000条http请求。而apache要比squid多。一般的情况用apache2,软件限制不是问题。看硬件的总线大小了。我的情况是用的sun e450,通过软件调优,最大http连接数在8000左右,再多,就是sun e450的极限了。

总的来说,squid是缓解了weblogic的压力,而不是apache的压力。squid缓解的是weblogic连接阵列(或硬盘)的IO。如果你的压力在apache上,squid没有意义的。如果问题出在weblogic上或者磁盘阵列的IO读取上,建议用squid。

 minasi 回复于:2004-09-03 13:47:39
多谢peng的耐心指点,我这就去试试!

 peng 回复于:2004-09-03 15:10:19
[quote:9d4e3ef28d="minasi"]多谢peng的耐心指点,我这就去试试![/quote:9d4e3ef28d]

互相学习吧,最近忙,也没有时间深看,希望成功后经验共享。 :em02:

 adrianmak 回复于:2004-10-14 09:22:42
現在服務器是作php 論壇,而且流量蠻大,
同時在線人數隨時超過千人,所以想 resin 的負載均衡能否應用於只有http要求

本身不會有jsp/servlet 要求

 peng 回复于:2004-10-14 10:03:42
[quote:dfa951fa79="adrianmak"]現在服務器是作php 論壇,而且流量蠻大,
同時在線人數隨時超過千人,所以想 resin 的負載均衡能否應用於只有http要求

本身不會有jsp/servlet 要求[/quote:dfa951fa79]

resin是java的应用服务器,如果不是jsp的程序,是不行的。它不能解释php的语句!

负载大,分析具体的读/写比例,用squid做反相web代理,是个不错的选择。可以考虑多机负载分流。

 sql2000 回复于:2005-08-10 16:58:40
每次找东西,还是看peng的文章感觉很合口味。

 钟钟. 回复于:2005-08-18 01:41:12
我按楼主的做了一下,事实证明并没有达到负载均衡的目的,我象楼主说的一样配了四个进程,resinA/B/C/D,启远起来以后,发现事实上每个apache的虚拟主机只会动态分配一个固定的,比如我把A和B单独停掉,有的虚拟主机就用不了了,也就是说并没有智能的去找一个能用的。我确认完全按楼主说的配的。
我用的是 resin3.0.14 apache2.0.54,不知道是不是版本的原因,发现resin不同版本间的变动都好大,同样是3.0.x的版本,竟然配置文件里的tag都不一样。

 钟钟. 回复于:2005-08-18 09:47:29
up一下,等楼主来解答

 钟钟. 回复于:2005-08-18 22:08:17
知道了,看了官方文档,要都写进去,比如:

ResinConfigServer localhost 6801
ResinConfigServer localhost 6802
ResinConfigServer localhost 6803
ResinConfigServer localhost 6804

而工作过程是resin模块分配的,旧的会话仍用原来的进程,新的则启用一个新的,进行轮巡。

不过我也没有实际试哈

 johnyo 回复于:2005-08-18 22:26:20
个人觉得LVS也是一个不错的选择。功能强大。性能也非常不错。有很多的商业产品都是从LVS改的。

原文转自:http://www.ltesting.net