Apache Tomcat 7.0.57 集群和 mod_proxy/mod_proxy_ajp

Apache Tomcat 7.0.57 集群和 mod_proxy/mod_proxy_ajp

我已经在 CentOS 6.6 上设置了一个带有 Apache HTTP 服务器和负载平衡的 Apache Tomcat 集群,方式如下:

+ 1 个运行 HTTP 服务器的 VM 和 1 个 Tomcat 实例(用于部署,不响应请求)
+ 1 个在不同端口上运行 2 个 Tomcat 实例的 VM


重要的事情先说:
+ watchEnabled:在主节点上 = “true”,在从节点上 = “false”
+ HTTP 连接器仅适用于主节点,未在从节点上定义
+ AJP 连接器的端口在每个实例上都不同
+ NioReceiver 的 tcpListenerPort 在每个实例上都不同
+ jvmRoute 值等于所有实例上的相应主机名
+ watchDir / tempDir 的路径不同,deployDir = 每个实例上的 webapps
+ 每个实例上的关机端口不同
+ Firewalld/iptables 已启用离开在所有节点上(测试环境)
+是的,我已经阅读了很多关于这个主题的内容(官方文档、教程等)。

服务器.xml(只截取重要部分)

<Server port="8004" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <!-- HTTP connector on port 8081 -->
    <Connector 
      connectionTimeout="20000" 
      port="8081" protocol="HTTP/1.1" 
      redirectPort="8443"/>
    <!-- Define an AJP 1.3 Connector on port 8012 -->
    <Connector 
      port="8012" 
      protocol="AJP/1.3" 
      redirectPort="8443"/>
    <!-- Engine definition for clustering -->
    <Engine 
      defaultHost="localhost" 
      jvmRoute="acd10-master" 
      name="Catalina">
      <Realm className="org.apache.catalina.realm.MemoryRealm"/>
      <Host 
        appBase="webapps" 
        autoDeploy="true" 
        name="192.168.2.139" 
        undeployOldVersions="true" 
        unpackWARs="true">
        <Cluster 
          channelSendOptions="6" 
          className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
          useDirtyFlag="true">
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership 
              address="228.0.0.4" 
              className="org.apache.catalina.tribes.membership.McastService" 
              dropTime="3000" 
              frequency="500" 
              port="45564"/>
            <Receiver 
              address="auto" 
              className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
              maxThreads="6" 
              port="4005" 
              timeout="100"/>
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport 
                className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor 
              className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor 
              className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
            <Interceptor 
              className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
          </Channel>
          <Deployer 
            className="org.apache.catalina.ha.deploy.FarmWarDeployer" 
            deployDir="/usr/local/tomcat7/webapps/" 
            tempDir="/usr/local/tomcat7/war-temp/" 
            watchDir="/usr/local/tomcat7/war-watch/" 
            watchEnabled="true"/>
        </Cluster>
      </Host>
    </Engine>
  </Service>
</Server>



mod_proxy配置文件

<VirtualHost *:80>
  DocumentRoot /var/www/html

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  <Proxy balancer://testcluster>
    BalancerMember ajp://192.168.2.166:8010/ route=acd11-node01
    BalancerMember ajp://192.168.2.166:8011/ route=acd11-node02
    ProxySet lbmethod=byrequests
  </Proxy>

  # Exclude balancer-manager app to make it available on master
  ProxyPass /balancer-manager !

  ProxyPass / balancer://testcluster/ stickysession=JSESSIONID|jsessionid
  ProxyPassReverse / balancer://testcluster/ stickysession=JSESSIONID|jsessionid

  <Location /balancer-manager>
    SetHandler balancer-manager
  </Location>
</VirtualHost>



编辑:

Apache 错误日志(启动后它给了我什么):

[Tue Jan 06 08:29:49.235859 2015] [mpm_prefork:notice] [pid 9655] AH00170: caught SIGWINCH, shutting down gracefully
[Tue Jan 06 08:29:50.306520 2015] [core:notice] [pid 9727] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Tue Jan 06 08:29:50.307867 2015] [suexec:notice] [pid 9727] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Tue Jan 06 08:29:50.319218 2015] [so:warn] [pid 9727] AH01574: module proxy_module is already loaded, skipping
[Tue Jan 06 08:29:50.319797 2015] [so:warn] [pid 9727] AH01574: module proxy_ajp_module is already loaded, skipping
[Tue Jan 06 08:29:50.319827 2015] [so:warn] [pid 9727] AH01574: module proxy_balancer_module is already loaded, skipping
[Tue Jan 06 08:29:50.320610 2015] [so:warn] [pid 9727] AH01574: module proxy_http_module is already loaded, skipping
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::50a0:e2ff:fe74:5294. Set the 'ServerName' directive globally to suppress this message
[Tue Jan 06 08:29:50.328101 2015] [auth_digest:notice] [pid 9727] AH01757: generating secret for digest authentication ...
[Tue Jan 06 08:29:50.329387 2015] [lbmethod_heartbeat:notice] [pid 9727] AH02282: No slotmem from mod_heartmonitor
[Tue Jan 06 08:29:50.333216 2015] [mpm_prefork:notice] [pid 9727] AH00163: Apache/2.4.6 (CentOS) configured -- resuming normal operations
[Tue Jan 06 08:29:50.333263 2015] [core:notice] [pid 9727] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'



我想实现的目标:
我们有许多企业 Web 应用程序,我们希望通过 Tomcat 场实现负载平衡。


什么有效:
+ Tomcat 集群
+ 复制
+ FarmWarDeployer


无效的方法:
每当我尝试调用已部署到整个集群的应用程序时,它都会给我404 未找到。对于 Tomcat 根应用程序(例如 /manager/html 或 /host-manager)也是如此。显然,唯一可以运行的应用程序是 /balancer-manager。httpd

服务器应该充当 tomcat 的负载平衡器和代理。它必须提供一些静态内容,但首先,我需要启动并运行它来平衡 JavaEE 应用程序(servlet)的负载。对于我来说,集群节点必须有 AJP,因为不能允许 http 访问(+ 出于其他一些值得完全不同讨论的原因)。

由于每个人似乎都以不同的方式设置 mod_proxy 配置,因此我正在寻找一种简单的解决方案,让我可以在此基础上进行构建。如果您需要更多信息或更多配置详细信息,请告诉我,我会为您提供这些信息。我已经使用 mod_jk 配置了第二个集群一切都按预期运行,但利益相关者需要这个 mod_proxy(_ajp) 东西,这让我很恼火。


非常感谢您的帮助!

此致!

答案1

我还没有尝试重现您的配置,但是当我今天早上查看它时,看起来问题只是一个缺少空格,并且可能是 ProxyPassReverse 与 ProxyPass 不匹配(但是我认为后者不会给您 404)。

ProxyPass / balancer://testcluster/stickysession=JSESSIONID|jsessionid

ProxyPassReverse / balancer://testcluster/

应该:

ProxyPass / balancer://testcluster/ stickysession=JSESSIONID|jsessionid

ProxyPassReverse / balancer://testcluster/ stickysession=JSESSIONID|jsessionid

至少,这就是我的方式,并且我没有问题(但我不使用 AJP,只是使用常规的 http 代理)。

显然,这是假设所有基本内容都已到位(站点已启用、重新加载、http 代理模块已安装并启用等)。

相关内容