【问题标题】:Tomcat, Apache : Failover not working even after configurationTomcat,Apache:即使在配置后故障转移也不起作用
【发布时间】:2016-03-14 20:32:54
【问题描述】:

我正在使用 Apache 和 tomcat 来设置负载平衡和故障转移。最初我以为load-balancing 会包含fail-over,但我错了。我认为如果一个实例不活动,那么使用另一个实例也成为负载管理的一部分。用了足够的术语,我设置了故障转移,但具有讽刺意味的是fail-over 本身正在失败。

一旦我关闭了一个 tomcat 实例,整个设置就死了​​,我得到 503。有人可以帮我理解问题所在。

在 apache2.conf 中添加了这个:

JkWorkersFile /etc/apache2/workers.properties

JkMount /* loadbalancer

workers.properties:

GNU nano 2.2.6 文件:workers.properties

 worker.list=loadbalancer
 worker.server1.port=8010
 worker.server1.host=localhost
 worker.server1.type=ajp13

 worker.server2.port=8011
 worker.server2.host=localhost
 worker.server2.type=ajp13

 worker.server1.lbfactor=1
 worker.server2.lbfactor=1

 worker.loadbalancer.type=lb
 worker.loadbalancer.balance_workers=server1,server2
worker.loadbalancer.method=B
worker.balancer.sticky_session=True

000-默认启用站点:

JkMountCopy On
<Proxy balancer://mycluster>
    BalancerMember ajp://localhost:8010 route=server1 connectiontimeout=10
    BalancerMember ajp://localhost:8011 route=server2 connectiontimeout=10

   ProxySet stickysession=JSESSIONID|jsessionid
   Order Deny,Allow
   Deny from none
   Allow from all

</Proxy>

<VirtualHost *:80>
ProxyRequests off

ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>

<Location /balancer-manager>
SetHandler balancer-manager

Order Deny,Allow
Deny from none
Allow from all
</Location>

第一个tomcat的server.xml:

<Connector port="8080" proxyPort="80" protocol="HTTP/1.1" compression="force" compressionMinSize="1024" 
               connectionTimeout="20000"
               redirectPort="443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/x-javascript,application/javascript"/>


<Connector port="443" enableLookups="false" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="200" compression="force"
              compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
                keystoreFile="keystore_file" keystorePass="PASSWORD" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/x-javascript,application/javascript"
/>
   <Connector port="8010" protocol="AJP/1.3" redirectPort="443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/x-javascript,application/javascript"
/>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="server1">
    // No modifications inside
</Engine>

第二个Tomcat的server.xml:

<Connector port="8081" proxyPort="80" protocol="HTTP/1.1" compression="force" compressionMinSize="1024" 
               connectionTimeout="20000"
               redirectPort="443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/x-javascript,application/javascript"/>


<Connector port="443" enableLookups="false" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="200" compression="force"
              compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
                keystoreFile="keystore_file" keystorePass="PASSWORD" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/x-javascript,application/javascript"
/>
 <Connector port="8011" protocol="AJP/1.3" redirectPort="8443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/x-javascript,application/javascript"
/>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="server2">
    // No modifications here
    </Engine>

我在配置中同时实现负载平衡和故障转移时犯了什么错误。非常感谢。

【问题讨论】:

    标签: java apache tomcat load-balancing failover


    【解决方案1】:

    首先,您使用的是两个不同的代理模块,不要那样做。

    一个是mod_jk,配置文件有worker.properties、uriworkermap.properties和apache.conf这部分:

    JkMount /* loadbalancer
    

    并且在 000-default 中

    JkMountCopy On
    

    另一个是mod_proxy和000-default中的相关配置:

    <Proxy balancer://mycluster>
        BalancerMember ajp://localhost:8010 route=server1 connectiontimeout=10
        BalancerMember ajp://localhost:8011 route=server2 connectiontimeout=10
    
        ProxySet stickysession=JSESSIONID|jsessionid
        Order Deny,Allow
        Deny from none
        Allow from all
    
        </Proxy>
    
    <VirtualHost *:80>
    
    ProxyRequests off
    
    ProxyPass /balancer-manager !
    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/
    </VirtualHost>
    
    <Location /balancer-manager>
    SetHandler balancer-manager
    
    Order Deny,Allow
    Deny from none
    Allow from all
    </Location>
    

    至于 cmets,让我们走 mod_jk 路线。首先删除 mod_proxy 配置部分,基本上都是 000-default 中的所有内容,只保留:

    JkMountCopy On
    

    然后禁用加载此模块(不是必需的,但更好):

    mod_proxy_*

    然后在workers.properties中将这个添加到你的负载均衡器的worker中:

    worker.loadbalancer.sticky_session_force = false

    并检查一切是否正常,基于此我会更新答案

    【讨论】:

    • 我不介意使用 mod_jk 先生。但是您发布的答案包含我的配置,如果您觉得方便,请建议我使用 mod_jk。多谢。 :-)#
    • 然后首先确保你有一个有效的 mod_jk 配置,开始删除我在回复中提到的 mod_proxy 的指令并检查是否仍然有效,基于此我会更新答案
    • 是的,我有那个模块。我还调用了 apache2ctl -M,它的输出在这里:pastebin.com/DxxPuLJG。我应该从 000-default 中删除所有内容,因为文件之前是空的
    • 查看答案,我会不断更新,因为我可以在那里格式化
    • 更新到最后了,基本就是去掉mod_proxy模块
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2016-04-15
    • 2015-01-29
    • 2011-06-24
    • 1970-01-01
    • 2014-01-21
    • 2011-12-09
    相关资源
    最近更新 更多