Tomcat mod_jk 集群跳过 404 http 状态

Tomcat mod_jk 集群跳过 404 http 状态

我尝试Tomcat Clusteringmod_jk几个月,到目前为止还不算太糟,但在部署过程中遇到了问题。我曾经FarmDeployer将 WAR 复制并部署到集群中的其他节点,但大多数情况下 WAR 部署不正确,因此页面出现错误404。即使在删除了展开的 war 目录并再次让 tomcat 提取 WAR 后,浏览器也无法呈现实际站点,直到我重新启动/停止该特定节点上的 tomcat 服务(当然,http://node-ip/myapp如果重新部署战争则有效,但不是http://site1.mydomain.net一旦呈现 404 页面)。而且我认为这个问题与浏览器有关(尝试了所有浏览器),因为在 404 错误后重新部署时,页面会在其他计算机上呈现。我也试过了fail_on_status,所以它会将节点置于错误阶段,无论呈现 404 http 状态还是重定向到其他节点,但在我的测试中,我发现它完全将这些节点置于错误状态,并且在重新启动之前不会向这些节点发送任何请求,尽管它们已恢复工作。

负载均衡器上的 Workers.properties:

workers.tomcat_home=/usr/share/tomcat
workers.java_home=/usr/lib/jvm/java-6-openjdk
ps=/
worker.list=cluster,balancer1,status

worker.balancer1.port=8009        
worker.balancer1.host=localhost
worker.balancer1.type=ajp13
worker.balancer1.lbfactor=2
worker.balancer1.cache_timeout=20
worker.balancer1.socket_timeout=20
#worker.balancer1.fail_on_status=-404,-503

worker.web1.port=8009        
worker.web1.host=192.168.1.8
worker.web1.type=ajp13
worker.web1.lbfactor=4
worker.web1.redirect=web2
worker.web1.cache_timeout=20
worker.web1.socket_timeout=20 
#worker.web1.fail_on_status=-404,-503

worker.web2.port=8009        
worker.web2.host=192.168.1.9
worker.web2.type=ajp13
worker.web2.lbfactor=4
worker.web2.redirect=web1
worker.web2.cache_timeout=20
worker.web2.socket_timeout=20 
#worker.web2.fail_on_status=-404,503

worker.cluster.type=lb
worker.cluster.balance_workers=web1,web2,balancer1
worker.cluster.sticky_session=True
worker.cluster.sticky_session_force=False

# Status worker for managing load balancer
worker.status.type=status

有人知道怎样跳过 404 错误节点并转而访问其他正确部署的节点吗?至少在配置方面有任何提示,以便在启用 404 后呈现实际页面stickey session

更新:1

负载均衡器上的 Apache 虚拟主机(192.168.1.5 或 balancer1):

<VirtualHost *:80>
ServerName site1.mydomain.net
JkAutoAlias /usr/share/tomcat/webapps/myapp
DocumentRoot /usr/share/tomcat/webapps/myapp

JkMount / cluster
JkMount /* cluster
JkMount /*.jsp cluster
  JkUnMount /myapp/*.html cluster
  JkUnMount /myapp/*.jpg  cluster
  JkUnMount /myapp/*.gif  cluster
  JkUnMount /myapp/*.png  cluster
  JkUnMount /myapp/*.css  cluster 

JkUnMount /abc cluster
JkUnMount /abc/* cluster
  JkUnMount /*.html cluster
  JkUnMount /*.jpg  cluster
  JkUnMount /*.gif  cluster
  JkUnMount /*.png  cluster
  JkUnMount /*.css  cluster

ProxyRequests Off
ProxyPreserveHost On
ProxyVia On 
<Proxy balancer://ajpCluster/>
    Order deny,allow
    Allow from all
  BalancerMember ajp://192.168.1.8:8009/ route=web1 ttl=60 timeout=20 retry=10
  BalancerMember ajp://192.168.1.9:8009/ route=web2 ttl=60 timeout=20 retry=10
  BalancerMember ajp://192.168.1.5:8009/ route=balancer1 status=+H ttl=60 

  ProxySet lbmethod=byrequests
  ProxySet stickysession=JSESSIONID|jsessionid
</Proxy>

<Location />
  ProxyPass balancer://ajpCluster/ nofailover=off
  ProxyPassReverse balancer://ajpCluster/
</Location>

</VirtualHost>

所有节点上通用的 Tomcat 虚拟主机:

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true" deployOnStartup="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="site1.mydomain.net" debug="0" appBase="webapps" unpackWARs="false" autoDeploy="false" deployOnStartup="false">
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="virtual_log1." suffix=".log" timestamp="true"/>
<Context path="" docBase="/usr/share/tomcat/webapps/myapps" debug="0" reloadable="true"/>

tomcat 集群无需进行会话复制:目前已通过注释<cluster>元素禁用,因为它在集群中一直更新和交互会消耗大量内存。目前,当 myapp 不可用(并再次可用)时,我遇到了Load balancing404Auto Failover错误问题,如上所述。大家如何处理这个问题mod_jkproxy_ajp

答案1

到目前为止,我能找到的唯一解决方案是停用 Web 服务器,在部署期间只留下一个服务器进行托管。部署成功后,激活 Web 服务器并通过禁用它来单独更新左侧后端服务器。也许我们可以使用balancer-manager虚拟主机中的代理或jkstatusWorkers.properties 中的 mod_jk 来激活/停用节点,例如:

代理人

# Balancer-manager, for monitoring
ProxyPass /balancer-manager !
<Location /balancer-manager>
    SetHandler balancer-manager

    Order deny,allow
    Deny from None
    Allow from all
</Location>

mod_jk

worker.list=cluster,status
................
.............
.......
# Status worker for managing load balancer
worker.status.type=status

需要大量用户干预!

相关内容