windows上Apache+tomcat实现主备机服务器

来源:互联网 发布:手机拍照后期制作软件 编辑:程序博客网 时间:2024/04/25 13:04

转自:http://m.blog.csdn.net/article/details?id=47043559

   今天配置了windows下Apache+tomcat实现的服务器配置,主要实现的功能如下:

通过Apache监听80端口,然后用mod_jk.so把请求传给tomcat服务器,启用两个tomcat服务器监听不同的端口,如果主tomcat服务器挂了,就由备tomcat服务器提供服务。

    具体实现如下:

     1,安装apache,本次是用的是apache_2.2.4安装版。安装目录为D:\Tomcat_Test\Apache_home

      2,安装tomcat1,tomcat2,本次使用的是apache-tomcat-7.0.52-windows-x64 (1).zip绿色解压版,直接解压该文件   到D:\Tomcat_Test目录下 更名为D:\Tomcat_Test\tomcat1,复制一份更名为D:\Tomcat_Test\tomcat2

     下面就开始配置了--

     3,将mod_jk.so(可以在网上下载,该文件作用是链接tomcat与apache)拷贝到apache安装目录下的modules文件夹  下。

     4,在Apache安装目录下的conf下 找到httpd.conf配置文件,在该文件最后添加如下内容:

   #新添加


   ### Section 3: Virtual Hosts # Use name-based virtual hosting. NameVirtualHost *:80
   # 装载mod_jk模块,用于处理Apache和Tomcat的连接 


           LoadModule jk_module modules/mod_jk.so


   # 指出mod_jk模块工作所需要的工作文件workers.properties的位置 


  JkWorkersFile conf/workers.properties 


   # 记录日志的工作级别 # Set the jk log level [debug/error/info] 


  JkLogLevel  debug


  # 模块工作日志的目录位置,可自由定义 


  JkLogFile logs/mod_jk2.log

JkMount /* router    

    5,在Apache的安装目录下的conf文件夹下,建立一个新文件命名为workers.properties,在文件中写入:

        #定义宏属性
workers.tomcat_home1=D:\Tomcat_Test\tomcat1\apache-tomcat-7.0.52
workers.tomcat_home2=D:\Tomcat_Test\tomcat2\apache-tomcat-7.0.52
#让mod_jk模块知道
Tomcat workers.java_home=C:/software/work/jdk_home/Java/jdk1.7.0_51     
#让mod_jk模块知道j2sdk 
ps=/ 

# 定义一个高级路由LB worker
worker.list=router

# 定义一个使用 ajp13的worker
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker1.inprocess.class_path=$(workers.tomcat_home1)$(ps)classes
worker.worker1.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar


# 给worker1定义了一个发生错误处理失败后要引用的节点
worker.worker1.redirect=worker2


# 定义另外一个使用ajp13的节点
worker.worker2.port=8008
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
worker.worker2.inprocess.class_path=$(workers.tomcat_home2)$(ps)classes
worker.worker2.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar


# 除非发生了错误并且处理失败了,否则就禁用所有发给worker2的请求
worker.worker2.disabled=True


# 定义LB worker
worker.router.type=lb
worker.router.balance_workers=worker1,worker2
#Worker1的Redirect标记告诉lb_worker 只有当worker1在错误状态时才把请求重定向到worker2。否则worker2#不会接到任何请求,worker2就好像热备份一样。

       

6,修改tomcat1安装目录下的conf中的server.xml

          1)把内容:

         <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
       改为:

 <Host name="www.quanttechTest.cn" debug="0" appBase="D:/Tomcat_Test/tomcat1/apache-tomcat-7.0.52/webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"   xmlNamespaceAware="false">
<Alias>www.quanttechTest.cn</Alias>
<Alias>www.quanttechTest1.cn</Alias>
<Alias>www.quanttechTest2.cn</Alias>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/>
<Context path="" docBase="quanttech" reloadable="true" caseSensitive="false" debug="0"></Context>
</Host>

<Host name="wd.quanttechTest.cn" debug="0" appBase="D:/Tomcat_Test/tomcat1/apache-tomcat-7.0.52/webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Alias>wd.quanttechTest.cn</Alias>
<Alias>wd.quanttechTest1.cn</Alias>
<Alias>wd.quanttechTest2.cn</Alias>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/>
<Context path="" docBase="weChatpay" reloadable="true" caseSensitive="false" debug="0"></Context>
</Host>
      

             2)把端口8080改为8081,

           即把

              <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

        改为

<Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
   
     

              3)修改tomcat1安装目录下的conf文件夹中的web.xml,在该文件的最后添加自己的欢迎页面

     <welcome-file-list>
<welcome-file>homepage.jsp</welcome-file>
       
        <welcome-file>index.html</welcome-file>
       
        <welcome-file>index.htm</welcome-file>
       
         <welcome-file>index.jsp</welcome-file>
   
             </welcome-file-list>

    

       7,修改tomcat2安装目录下conf文件夹下的server.xml文件

            1)修改相关端口(避免两个tomcat的端口冲突)     

<Server port="8005"shutdown="SHUTDOWN">

<Connector port="8080"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

把port端口换成不一样的就行,如:

<Server port="8004"shutdown="SHUTDOWN">

<Connector port="8082"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>

<Connector port="8008"protocol="AJP/1.3"redirectPort="8443" />

   

         2)把如下内容:

     <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
           <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>

改为:
 <Host name="www.quanttechTest.cn" debug="0" appBase="D:/Tomcat_Test/tomcat2/apache-tomcat-7.0.52/webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"   xmlNamespaceAware="false">
<Alias>www.quanttechTest.cn</Alias>
<Alias>www.quanttechTest1.cn</Alias>
<Alias>www.quanttechTest2.cn</Alias>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/>
<Context path="" docBase="quanttech" reloadable="true" caseSensitive="false" debug="0"></Context>
</Host>


<Host name="wd.quanttechTest.cn" debug="0" appBase="D:/Tomcat_Test/tomcat2/apache-tomcat-7.0.52/webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Alias>wd.quanttechTest.cn</Alias>
<Alias>wd.quanttechTest1.cn</Alias>
<Alias>wd.quanttechTest2.cn</Alias>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/>
<Context path="" docBase="weChatpay" reloadable="true" caseSensitive="false" debug="0"></Context>
</Host>

     

3)在tomcat2目录下的conf文件夹下修改web.xml文件,添加欢迎页面

               <welcome-file-list>
<welcome-file>homepage.jsp</welcome-file>
       
        <welcome-file>index.html</welcome-file>
       
        <welcome-file>index.htm</welcome-file>
       
        <welcome-file>index.jsp</welcome-file>
   
            </welcome-file-list>



8,修改C:\Windows\System32\drivers\etc\hosts文件:

              添加如下内容:

              127.0.0.1 www.quanttechTest.cn
      127.0.0.1www.quanttechTest1.cn
      127.0.0.1www.quanttechTest2.cn
      127.0.0.1wd.quanttechTest.cn
      127.0.0.1wd.quanttechTest1.cn
              127.0.0.1 wd.quanttechTest2.cn
              127.0.0.1       localhost


至此已配置完毕

              将weChatpay.war和quanttech.war拷贝到tomcat1和tomcat2的webapps目录,启动apache-->tomcat1-->tomcat2, 在浏览器输入:www.quanttechTest.cn 和wd.weChatpay.cn查看





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

参考相关文档:

1,http://blog.csdn.net/good_youth/article/details/2581360

2,http://blog.chinaunix.net/uid-10182882-id-2969723.html

3,http://blog.csdn.net/zhanshenyn/article/details/6976861



Workers实际上属于Tomcat的链接器(Connector),代表了一个Tomcat实例,这个实例代表了由某种web服务器来执行 servelet程序。举例来说,我们可以使用某个服务器,例如apache 来把servelet请求转递Tomcat进程(worker)来进行后台处理。

上面所描述的这一情景是非常简单的例子;实际上我们可以通过配置多个 Worker 来代表某一种web服务器去执行servelet。这样做的原因是:我们常常希望不同的上下文能够被不同的worker处理,这些worker可以提供不同的开发环境,使得所有开发者可以共享一个服务器而每个人都拥有自己的worker。

我们希望不同的虚拟主机能够由不同Tomcat进程来处理,并且这些处理于各个公司之间的站点间进行处理时彼此是完全独立的。我们想要提供负载平衡,就意味着要再同一台机器上运行多个Tomcat Worker并且能够在这些worker之间分布Web请求。可能还有很多很多要用到多个Tomcat Worker的原因,但是我想列出的这些就已经足够了……

Tomcat workers都定义在一个叫做workers.properties属性文件之中,并且workers的说明告诉应该如何使用它们。

这部分文档原是Tomcat文档的一部分:是由Gal Shachor所撰写的《最低需求用户指南》(A Minimalistic User s Guide), 但是因为组织文章的需要被分离出来。

定义Workers

可以通过属性文件来为Tomcat Web服务器插件定义Worker。(在conf/下有个文件名为wo
rkers.properties就是一个可用Workers属性文件).

文件中有如下形式的条目:

worker.list=<由逗号分离开的worker名称列表>

# the list of workers (worker 列表)
worker.list= worker1, worker2

当启动服务器的时候,Web服务器插件会把这些出现在worker.list属性中出现名字的worker实例化,而这些也就是你可以用来映射请求的worker。

Workers的类型

对于每个有名字的worker都会有若干条目给使用者提供worker自身的附加信息。这些信息包括worker的类型和与之相关的worker的信息。JK 1.2.5中包含下列的worker类型:

类型 说明
ajp12 这种worker知道如何使用ajpv12协议去给用来外部处理的worker传递一个请求。

ajp13 这种worker知道如何使用ajpv13协议去给用来外部处理的worker传递一个请求。

jni 这种worker知道如何使用JNI去给用来外部处理的worker传递一个请求。


lb 这是一个负载平衡worker;它知道怎样在一定容错范围内提供一个基于粘性负载的循环。


status 这是一个状态worker来管理负载平衡。

定义一个worker的类型,应该使用如下的属性格式:

worker. worker name.type=

这里worker的名字是你已经分配给worker的,并且,worker的类型只能定义为下表四种类型之一:(worker的名字中不能含有空格,对于一系列worker的好的命名规范应该遵从Java变量命名规则。)

定义一个worker的类型,应该使用如下的属性格式:

设置worker属性

定义完worker之后你可以详细的为他们每个设定相应的属性。属性设定遵循如下样式:

worker.. =

每个worker都有一组属性,你可以按照下面小节的说明来设定他们:

ajp13 Worker 属性
ajp13类型标记的workers使用ajpv13协议通过TCP/IP的服务套接字(sockets)来传递请求给Tomcat处理。
ajpv12和ajpv13 的主要不同之处在于:
• ajpv13是一个变长字节协议。它依照使用频率最多的字符串编码为最小整数的方
式对请求数据做一定的压缩。
• ajpv13 会重用打开的套接字,并且把他们保留给以后的请求 (记住,这是当你的
Web服务器和Tomcat之间有防火墙时)。
• ajpv13 针对SSL信息有专有的策略以便容器能够实现与SSL关联的方法,例如isS
ecure()。
你应该注意到Ajp13 是Tomcat 4.0.x, 4.1.x and 5当前唯一支持的外部处理协议 。
# worker “worker2″会与监听在名为 www2.x.com 的机器上的8009 端口使用3个负载平
衡系数的Tomcat 通信
worker.worker2.host=www2.x.com
worker.worker2.port=8009
worker.worker2.lbfactor=3
# worker “worker2″ 用掉10个套接字, 这些会保持不超过10钟的缓存
worker.worker2.cachesize=10
worker.worker2.cache_timeout=600

# worker “worker2″ 会请求操作系统给连接(connection)发出 KEEP-ALIVE 信号
worker.worker2.socket_keepalive=1
# worker “worker2″ 试图使ajp13 连接于5分钟后断开(周期性的)
worker.worker2.recycle_timeout=300
注意:在ajpv13协议中,默认的端口是8009。


负载平衡Worker(lb Worker)属性
负载平衡worker 并不是真正的与Tomcat 的其它worker通信,而是负责对若干“真实”的workers的管理。这些管理包括内容如下:
• 实例化Web服务器上的worker。
• 使用worker的负载平衡参数,在性能强的机器上运行有利于循环的负载平衡(这可以处理更多的请求)
• 在执行同一个Tomcat Worker时候保持针对同一个会话线程的请求。
• 认证失败的Tomcat worker,对他们的请求会被中止并会反馈给其他由lb worker管理的worker们,并由这些被管理的worker替代。

总之,结果就是,由同一个lb worker管理的worker会被平衡负载(这取决于他们的lb factor和当前用户会话线程)并且也被反馈,这样一个单独的Tomcat处理过程的死亡不会“杀死”整个站点。

下表详述了lb worker可接受的属性:
• balance_workers 是用逗号分隔负载平衡器所需管理的worker的名称。这些worker不应该出现在worker.list属性中。
• sticky_session指明带有会话线程ID的请求是否应该被发送回到同一个Tomcat worker。sticky_session是一个标记(flag),当且仅当会话线程是粘连的,其值为真(True),否则其值为假(false)。只有当Tomcat使用一个会话线程管理器时,并且这个会话线程管理器时能够在多个Tomcat实体之间相互持续传递数据,sticky_session被设定为False。默认的sticky_session的值是True。


例如worker balance1 同时使用“真实”的worker―― worker1 和 worker2:
worker.balance1.balance_workers=worker1, worker2
高级负载平衡Worker属性(Advanced lb Worker properties)
在JK 1.2.x中新增加了2个负载平衡和容错支持的属性,这两个属性是: 重定向(redire
ct)和禁用(disabled)。
让我们看看一个实例环境下的属性设定:
一个机群(cluster)有两个节点(worker1+worker2),他们前后相继运着各自的webserve
r+tomcat,并且每个节点都有一个负载平衡器。
# 定义一个高级路由LB worker
worker.list=router

# 定义一个使用 ajp13的worker
worker.worker1.port=8009
worker.worker1.host=node1.domain.org
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
# 给worker1定义了一个发生错误处理失败后要引用的节点
worker.worker1.redirect=worker2

# 定义另外一个使用ajp13的节点
worker.worker2.port=8009
worker.worker2.host=node2.domain.org
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
# 除非发生了错误并且处理失败了,否则就禁用所有发给worker2的请求
worker.worker2.disabled=True

# 定义LB worker
worker.router.type=lb
worker.router.balance_workers=worker1,worker2
Worker1的Redirect标记告诉lb_worker 只有当worker1在错误状态时才把请求重定向到wo
rker2。否则worker2不会接到任何请求,worker2就好像热备份一样。


状态Worker属性(Status Worker properties)
状态worker并不与Tomcat通信,而是负责一个lb worker管理:
# 在worker.list中增加一个状态worke r
worker.list=jkstatus
# 给 jkstatus worker定义一个使用的状态
worker.jkstatus.type=status
下一件事情就是把请求挂载到jkstatus worker上。
对于Apache Web Sever我们这样使用:
# 添加jkstatus挂载点
JkMount /jkmanager/* jkstatus
要获取一个高级安全权限我们这样做:
# 让 JK 管理器只能从访问localhost访问

JkMount jkstatus
Order deny,allow
Deny from all
Allow from 127.0.0.1

宏属性文件定义
你可以在属性文件中定义宏。这些宏允许你定义属性,并且在你后来构建其他属性时候使
用他们,而且在你改变你的Java Home,Tomcat Home或OS路径分隔符的时候,他们会变得
非常有用。
# 属性例子, 不要hardcode路径分隔符
ps=\
workers.tomcat_home=d:\tomcat
workers.java_home=d:\sdk\jdk1.2.2
# 通过使用宏,我们使得:worker.inprocess.class_path=d:\tomcat\classes改写为

worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes
# 通过使用宏,我们使得:worker.inprocess.class_path=d:\sdk\jdk1.2.2\lib\tool
s.jar改写为
worker.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar
worker.properties 例子
由于要应付你自己的worker.properties 并不是件容易事,所以JK同时捆绑了一个worker
.properties。
你也可以找到一个workers.properties的例子,定义如下 :
• ajp12 worker 使用主机为 localhost 端口为 8007
• ajp13 worker 使用主机为 localhost 端口为 8007
• jni worker
• lb worker 平衡ajp12和ajp13 worker的负载
# 定义一些宏属性
workers.apache_log=/var/log/httpd/
workers.tomcat_home=/var/tomcat3
workers.java_home=/opt/IBMJava2-131/
ps=/
# 定义4个workers,3个实体workers分别使用ajp12, ajp13, jni, 最后一个作为负载
平衡worker
worker.list=worker1, worker2, worker3, worker4
# 设置worker1的属性 (ajp12)
worker.worker1.type=ajp12
worker.worker1.host=locahost
worker.worker1.port=8007
worker.worker1.lbfactor=1
# 设定worker2的属性 (ajp13)
worker.worker2.type=ajp13
worker.worker2.host=locahost
worker.worker2.port=8009
worker.worker2.lbfactor=1
worker.worker2.cachesize=10
worker.worker2.cache_timeout=600
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=60
# 设定worker3的属性 (jni)
worker.worker3.type=jni
# 设定worker3桥的类型,这里时Tomcat3.3
worker.worker3.bridge=tomcat33
# 设定worker3目录
worker.worker3.class_path=$(workers.tomcat_home)$(ps)classes
worker.worker3.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
# 设定worker3 tomcat命令行
worker.worker3.cmd_line=-home
worker.worker3.cmd_line=$(workers.tomcat_home)
# 设定worker3 Tomcat/JVM设置
worker.worker3.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)
libjvm.so
worker.worker3.stdout=$(workers.apache_log)$(ps)inprocess.stdout
worker.worker3.stderr=$(workers.apache_log)$(ps)inprocess.stderr
worker.worker3.sysprops=tomcat.home=$(workers.tomcat_home)
#设定worker4 (lb)属性,用来使用worker1和worker2
worker.worker4.balance_workers=worker1,worker2


0 0