Apache HTTP 服务器连接器和负载均衡指南

Red Hat JBoss Core Services 2.4.37

用于 Red Hat JBoss Core Services 2.4.37

摘要

安装并配置使用 mod_clustermod_jkconnector 模块以及 Red Hat JBoss Core Services 提供的其它模块的负载均衡解决方案。

对红帽文档提供反馈

我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。

注意

您必须有一个红帽帐户并登录到客户门户网站。

要从客户门户网站提交文档反馈,请执行以下操作:

  1. 选择 Multi-page HTML 格式。
  2. 点文档右上角的 反馈 按钮。
  3. 突出显示您要提供反馈的文本部分。
  4. 点高亮文本旁的添加反馈对话框。
  5. 在页面右侧的文本框中输入您的反馈,然后单击 Submit

每次提交反馈时,我们都会自动创建跟踪问题。打开在点 Submit 后显示的链接,并开始监视问题或添加更多注释。

感谢您的宝贵反馈。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 HTTP 连接器模块

Red Hat JBoss Core Services 包括两个不同的 HTTP 连接器模块,可用于负载均衡到一组后端 servlet 容器的 HTTP 请求:

  • Apache Tomcat 连接器(mod_jk) 支持将 HTTP 请求负载平衡到一组 servlet 容器,同时维护粘性会话并通过 Apache JServ Protocol(AJP)进行通信。
  • JBoss HTTP 连接器(mod_cluster) 是一个比 mod_jk 更高级的负载均衡器。mod_cluster 模块提供 mod_jk 和其他功能,如实时负载均衡计算、应用生命周期控制、自动代理发现和多个协议支持。

Apache HTTP 服务器连接器和负载均衡指南描述了如何安装和配置 mod_proxymod_cluster 连接器。本指南还提供有关 在线证书状态协议(OCSP) 的信息,它包含了一组 使用 mod_auth_kerb 的基本负载均衡和 Kerberos 验证 工作示例。

重要

本指南中显示的大部分文件和目录路径是在 Red Hat Enterprise Linux 上安装 JBoss Core Services。对于其他平台,请使用正确的安装路径,如 JBoss 核心服务 安装指南中的 指定。

重要

Red Hat Enterprise Linux 6 不再被支持,并随后从文档中被删除。

第 2 章 使用 Apache Tomcat 连接器进行负载均衡(mod_jk)

Apache Tomcat 连接器 mod_jk 是一个插件,它允许 Apache HTTP 服务器将 Web 请求转发到后端 servlet 容器。mod_jk 模块还允许 Apache HTTP 服务器在维护粘性会话的同时将请求负载平衡到一组 servlet 容器。

2.1. mod_jk 安装

mod_jk 模块包含在 JBoss Core Services 安装的 Apache HTTP Server 部分中。

您可以按照 Red Hat JBoss Core Services Apache HTTP Server 安装指南 中的步骤下载并安装适用于您的操作系统的 Apache HTTP 服务器。

2.2. 使用 mod_jk时的 Apache HTTP 服务器负载均衡配置

您可以将 Apache HTTP 服务器配置为使用 mod_jk 将请求负载平衡到一组 servlet 容器。这个设置包括后端 worker 节点的配置。

红帽 JBoss Core Services 在 JBCS_HOME/httpd/conf.d/ 目录中提供了 mod_ jk 的示例配置文件。这些示例配置文件名为 mod_jk.conf.sampleworker.properties.sampleuriworkermap.properties.sample。要使用这些示例而不是创建自己的配置文件,您可以删除 .sample 扩展,并根据需要修改文件内容。

注意

您还可以使用红帽客户门户网站上的 Load Balancer 配置工具,为 mod_jk 和 Tomcat worker 节点快速生成最佳配置模板。

当您为 Apache HTTP 服务器 2.4.37 使用 Load Balancer Configuration 工具时,请确保选择 2.4.x 作为 Apache 版本,然后选择 Tomcat 作为后端配置。

当在 Red Hat Enterprise Linux 8 上安装 Apache HTTP Server(httpd)时,基础操作系统模块位于 /usr/lib64/httpd/modules 目录中。Red Hat JBoss Core Services 模块目前位于 /opt/rh/jbcs/root/usr/lib64/httpd/modules 目录中。

红帽 JBoss Core Services 模块包括 mod_jkmod_clustermod_rtmod_bmx。这些模块遵循用于命名、目录和前缀的所有红帽 JBoss 核心服务规则。如果要使用这些模块,请创建或修改配置文件以添加 LoadModule 命令。例如:

LoadModule jk_module /opt/rh/jbcs/root/usr/lib64/httpd/modules/mod_jk.so

另外,您还可以在 JBCS_HOME/httpd/conf.d 目录中包括已安装的 Red Hat JBoss Core Services 模块的目录。

重要

考虑由 JBoss Core Services 和 Red Hat Enterprise Linux 提供的 httpd 实现之间的以下区别:

  • 您可以从存档文件或 RPM 软件包安装 JBoss Core Services httpd
  • 您还可以在 Windows Server 环境中安装 JBoss Core Services httpd
  • JBoss Core Services httpd 不提供或支持 mod_php 模块。Red Hat Enterprise Linux httpd 支持 mod_php 模块。
  • JBoss Core Services httpd 提供 mod_jkmod_cluster 负载均衡器模块。Red Hat Enterprise Linux httpd 不提供 mod_jkmod_cluster 模块。

JBoss Core Services httpd 的用例是使用代理连接到后端。您可以使用 mod_jkmod_proxy_clustermod_proxy 作为代理。在由 Red Hat JBoss Core Services 和 Red Hat Enterprise Linux 提供的 httpd 实现中,这些模块之间没有区别。

注意

自 2.4.37 服务包 10 发布以来,Red Hat JBoss Core Services 不支持将非升级连接连接到后端 WebSockets 服务器。这意味着,当您为 mod_proxy_wstunnel 模块配置 ProxyPass 指令时,您必须确保 upgrade 参数未设置为 NONE。有关 mod_proxy_wstunnel 的更多信息,请参阅 Apache 文档

2.3. 将 Apache HTTP 服务器配置为加载 mod_jk

您可以通过在 mod_jk.conf 文件中指定配置设置,将 Apache HTTP 服务器配置为加载 mod_jk。

您还可以执行以下可选配置步骤:

  • 除了 JkMount 指令外,您还可以使用 JkMountFile 指令指定挂载点的配置文件。配置文件包含多个 Tomcat 转发的 URL 映射。
  • 您可以配置作为负载均衡器运行的 Apache HTTP 服务器,以记录处理请求的每个 worker 节点的详情。如果您需要对负载均衡器进行故障排除,这很有用。

流程

  1. 前往 JBCS_HOME/httpd/conf.d 目录。
  2. 创建一个名为 mod_jk.conf 的新文件,并输入以下配置详情:

    # Load mod_jk module
    # Specify the filename of the mod_jk lib
    LoadModule jk_module modules/mod_jk.so
    
    # Where to find workers.properties
    JkWorkersFile conf.d/workers.properties
    
    # Where to put jk logs
    JkLogFile logs/mod_jk.log
    
    # Set the jk log level [debug/error/info]
    JkLogLevel info
    
    # Select the log format
    JkLogStampFormat  "[%a %b %d %H:%M:%S %Y]"
    
    # JkOptions indicates to send SSL KEY SIZE
    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
    
    # JkRequestLogFormat
    JkRequestLogFormat "%w %V %T"
    
    # Mount your applications
    JkMount /application/* loadbalancer
    
    # Add shared memory.
    # This directive is present with 1.2.10 and
    # later versions of mod_jk, and is needed for
    # for load balancing to work properly
    JkShmFile logs/jk.shm
    
    # Add jkstatus for managing runtime data
    <Location /jkstatus/>
        JkMount status
        Require ip 127.0.0.1
    </Location>
    重要

    确保 LoadModule 指令引用您已安装的 mod_jk 原生二进制文件。

    注意

    JkMount 指令指定 Apache HTTP 服务器可以转发到 mod_jk 模块的 URL。根据 JkMount 指令的配置,mod_jk 会将接收的 URL 转发到正确的 servlet 容器。

    要启用 Apache HTTP 服务器直接提供静态内容(或 PHP 内容),且只使用 Java 应用程序的负载均衡器,前面的配置示例指定 Apache HTTP 服务器仅向 mod_jk 负载均衡器发送请求。

    或者,您可以通过在 JkMount 指令中指定 /*,将 Apache HTTP 服务器配置为将所有 URL 转发到 mod_jk

  3. 可选: 要使用 JkMountFile 指令为挂载点指定配置文件,请执行以下步骤:

    1. 前往 JBCS_HOME/httpd/conf.d/ 目录。
    2. 创建名为 uriworkermap.properties 的文件。
    3. 指定您要转发和 worker 名称的 URL。

      例如:

      # Simple worker configuration file
      
      # Mount the Servlet context to the ajp13 worker
      /application=loadbalancer
      /application/*=loadbalancer
      注意

      所需语法的格式是: /URL=WORKER_NAME

      前面的示例将 mod_jk 配置为将 /application 的请求转发到 JBoss Web Server Tomcat 后端。

    4. JBCS_HOME/httpd/conf.d/mod_jk.conf 文件中,输入以下指令:

      # Use external file for mount points.
      # It will be checked for updates each 60 seconds.
      # The format of the file is: /url=worker
      # /examples/*=loadbalancer
      JkMountFile conf.d/uriworkermap.properties
  4. 可选: 要启用 Apache HTTP 服务器日志,请执行以下步骤之一:

    • JkRequestLogFormat 指令中包含 %w,如上一步中有关 mod_jk.conf 设置所示。
    • 通过在 Apache HTTP 服务器 LogFormat(s)中包含 %{JK_WORKER_NAME}n 记录要使用的 mod_jk worker 名称。

2.4. 在 mod_jk中配置 worker 节点

您可以配置多个 worker 节点,以处理 Apache HTTP 服务器转发到 servlet 容器的请求。

此流程中的示例演示了如何在加权轮循配置中定义两个 mod_jk worker 节点,它使用两个 servlet 容器之间的粘性会话。

先决条件

流程

  1. 前往 JBCS_HOME/httpd/conf.d/ 目录。
  2. 创建名为 workers.properties 的文件。
  3. 输入以下配置详情:

    # Define list of workers that will be used
    # for mapping requests
    worker.list=loadbalancer,status
    
    # Define Node1
    # modify the host as your host IP or DNS name.
    worker.node1.port=8009
    worker.node1.host=node1.mydomain.com
    worker.node1.type=ajp13
    worker.node1.ping_mode=A
    worker.node1.lbfactor=1
    worker.node1.secret=<YourSecret>
    
    # Define Node2
    # modify the host as your host IP or DNS name.
    worker.node2.port=8009
    worker.node2.host=node2.mydomain.com
    worker.node2.type=ajp13
    worker.node2.ping_mode=A
    worker.node2.lbfactor=1
    worker.node1.secret=<YourSecret>
    
    # Load-balancing behavior
    worker.loadbalancer.type=lb
    worker.loadbalancer.balance_workers=node1,node2
    worker.loadbalancer.sticky_session=1
    
    # Status worker for managing load balancer
    worker.status.type=status
    注意

    在前面的示例中,确保将 主机端口secret 设置替换为与您的环境相关的值。

    重要

    使用 Tomcat AJP 连接器时需要 secret 属性。您可以为 worker 节点或 worker .properties 文件中的负载均衡器指定 secret 属性。例如:

    worker.<WORKER_NAME>.secret=<YOUR_AJP_SECRET>

    在前面的示例中,将 &lt ;WORKER_NAME& gt ; 和 <YOUR_AJP_SECRET > 替换为与您的环境相关的值。

2.5. 配置 Tomcat 以使用 mod_jk

Tomcat 配置为默认从 mod_jk 接收 Apache JServ Protocol(AJP)流量。但是,在将 worker 节点用于 mod_jk 时,您必须执行以下额外配置步骤:

  • 配置 AJP 连接器。默认情况下不配置 AJP 连接器。
  • 为每个 worker 节点的引擎中配置 jvmRoute 属性的唯一值。
  • 指定 worker 节点或负载均衡器的 secret 属性。使用 Tomcat AJP 连接器时需要 secret 属性。

流程

  1. 要配置 AJP 连接器,请执行以下步骤:

    1. 打开 JBCS_HOME/tomcat &lt;VERSION&gt; /conf/server.xml 文件。
    2. server.xml 文件中,输入以下行:

      <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  2. 要为每个 worker 节点的引擎中的 jvmRoute 属性配置唯一值,请输入以下详情:

    <Engine name="Catalina" jvmRoute="node1" >
    重要

    确保 jvmRoute 属性值与 worker .properties 文件中指定的 worker 名称匹配。

  3. 要为 worker 节点或负载均衡器指定 secret 属性,请执行以下步骤:

    1. 打开 JBCS_HOME/httpd/conf.d/workers.properties 文件。
    2. worker.properties 文件中,确保 secret 属性以以下格式指定:

      worker.<WORKER_NAME>.secret=<YOUR_AJP_SECRET>`
      注意

      确保将 < WORKER_NAME& gt; 和 < YOUR_AJP_SECRET > 替换为与您的环境相关的值。

      注意

      如果您使用 ProxyPass 指令在负载均衡器上设置 secret,则它的所有成员都会继承这个 secret。例如:

      <Proxy balancer://mycluster>`
          BalancerMember ajp://node1:8009 route=node1 secret=YOUR_AJP_SECRET
          BalancerMember ajp://node2:8009 route=node2 secret=YOUR_AJP_SECRET
      </Proxy>
      ProxyPass /example/ balancer://mycluster/example/ stickysession=JSESSIONID|jsessionid

第 3 章 使用 JBoss HTTP 连接器进行负载平衡(mod_cluster)

mod_cluster 连接器是一个减少配置、智能负载均衡解决方案,适用于 JBoss EAP 和 Apache HTTP 服务器 Tomcat。mod_cluster 模块基于最初由 JBoss mod_cluster 社区项目开发的技术。

3.1. JBoss HTTP 连接器(mod_cluster)

mod_cluster 模块对 JBoss EAP 和 Apache HTTP Server Tomcat 工作节点进行 HTTP 请求。mod_cluster 模块使用 Apache HTTP 服务器作为代理服务器。

mod_cluster的主要功能

mod_cluster 连接器与 mod_jk 连接器相比有几个优点:

  • 启用 mod_cluster 模块后,mod_cluster 管理协议(MCMP)是 Tomcat 服务器和 Apache HTTP 服务器之间的额外连接。Tomcat 服务器使用 MCMP 使用一组自定义 HTTP 方法,将服务器端负载图和生命周期事件传输至 Apache HTTP 服务器。
  • 使用 mod_cluster 的动态配置 Apache HTTP 服务器允许 Tomcat 服务器加入负载平衡安排,无需手动配置。
  • Tomcat 服务器执行负载计算,而不是依赖于 Apache HTTP 服务器。这使得负载均衡指标比其他连接器更准确。
  • mod_cluster 连接器提供细粒度应用程序生命周期控制。每个 Tomcat 服务器将 web 应用程序上下文生命周期事件转发到 Apache HTTP 服务器。这些生命周期事件包括告知 Apache HTTP 服务器启动或停止特定上下文的路由请求。这可防止最终用户因为不可用资源而看到 HTTP 错误。
  • 您可以使用 Apache JServ Protocol(AJP)、HJP)、Harv)或使用 mod_cluster 的 Hypertext 传输协议 Secure(HTTPS)传输。

mod_cluster 组件

在代理服务器中,mod_cluster 由四个 Apache 模块组成:

组件描述

mod_cluster_slotmem.so

Shared Memory Manager 模块与多个 Apache HTTP 服务器进程共享实时 worker 节点信息。

mod_manager.so

Cluster Manager 模块接收和确认来自 worker 节点的消息,包括节点注册、节点加载数据和节点应用程序生命周期事件。

mod_proxy_cluster.so

Proxy Balancer 模块处理到集群节点的请求路由。Proxy Balancer 根据集群中的应用程序位置、每个集群节点的当前状态以及 Session ID(请求是已建立的会话的一部分)选择适当的目的地节点。

mod_advertise.so

Proxy Advertisement 模块通过 UDP 多播消息广播代理服务器是否存在。服务器广告信息包含来自要加入负载平衡集群的 worker 节点的 IP 地址和端口号。

3.2. mod_cluster 字符限制

mod_cluster 模块使用共享内存来保留节点描述。共享内存是在 Apache HTTP 服务器启动时创建的,每个项目的结构已被修复。

当您定义代理服务器和 worker 节点属性时,请确定您遵循以下字符限制:

属性最大字符限制描述

别名长度

100 个字符

alias 对应于对应虚拟主机的网络名称;名称在 Host 元素中定义。

上下文长度

40 个字符

例如,如果 myapp.war 已部署到 /myapp 中,则 /myapp 包含在上下文中。

balancer 名称长度

40 个字符

这是 mbean 中的 balancer 属性。

JVMRoute 字符串长度

80 个字符

< Engine> 元素中的 JVMRoute

域名长度

20 个字符

这是 mbean 中的域属性。

节点的主机名长度

64 个字符

这是 < Connector> 元素中的主机名 地址。

节点的端口长度

7 个字符

这是 < Connector> 元素中的 port 属性。例如: 8009 为 4 个字符。

节点的方案长度

6 个字符

这是连接器的协议。可能的值有 httphttpsajp

Cookie 名称长度

30 个字符

这是会话 ID 的标头 Cookie 名称。默认值为 JSESSIONID,它基于 org.apache.catalina.Globals.SESSION_COOKIE_NAME 属性。

路径名称长度

30 个字符

这是会话 ID 的参数名称。默认值为 JSESSIONID,它基于 org.apache.catalina.Globals.SESSION_PARAMETER_NAME 属性。

会话 ID 长度

120 个字符

会话 ID 采用以下格式: BE81FAA969BF64C8EC2B6600457EAAAA.node01

3.3. mod_cluster 安装

mod_cluster 模块包含在 JBoss Core Services 安装的 Apache HTTP Server 部分中。

您可以按照 Red Hat JBoss Core Services Apache HTTP Server 安装指南 中的步骤下载并安装适用于您的操作系统的 Apache HTTP 服务器。

3.4. 使用 mod_cluster时的 Apache HTTP 服务器负载均衡配置

在 Apache HTTP Server 2.1 及更高版本中,默认情况下为 Apache HTTP 服务器正确配置了 mod_cluster。有关设置自定义配置的更多信息,请参阅配置 基本代理服务器

注意

您还可以使用红帽客户门户网站上的 Load Balancer Configuration 工具为 mod_cluster 和 Tomcat worker 节点快速生成最佳配置模板。

当您为 Apache HTTP 服务器 2.4.37 使用 Load Balancer Configuration 工具时,请确保选择 2.4.x 作为 Apache 版本,然后选择 Tomcat 作为后端配置。

当在 Red Hat Enterprise Linux 8 上安装 Apache HTTP Server(httpd)时,基础操作系统模块位于 /usr/lib64/httpd/modules 目录中。Red Hat JBoss Core Services 模块目前位于 /opt/rh/jbcs/root/usr/lib64/httpd/modules 目录中。

红帽 JBoss Core Services 模块包括 mod_jkmod_clustermod_rtmod_bmx。这些模块遵循用于命名、目录和前缀的所有红帽 JBoss 核心服务规则。如果要使用这些模块,请创建或修改配置文件以添加 LoadModule 命令。例如:

LoadModule jk_module /opt/rh/jbcs/root/usr/lib64/httpd/modules/mod_jk.so

另外,您还可以在 JBCS_HOME/httpd/conf.d 目录中包括已安装的 Red Hat JBoss Core Services 模块的目录。

注意
  • 如果要使用 mod_proxy_cluster 模块,您必须启用 mod_proxy 模块并禁用 mod_proxy_balancer 模块。
  • 如果您希望 mod_proxy_cluster 使用 Apache JServ Protocol(AJP),您必须启用 proxy_ajp_module
  • 使用 AJPSecret your_secret 为 AJP 后端提供 secret。如果 your_secret 不与后端配置的值不匹配,后端会为通过代理发送的任何请求发送 503 错误响应。
注意

自 2.4.37 服务包 10 发布以来,Red Hat JBoss Core Services 不支持将非升级连接连接到后端 websocket 服务器。这意味着,当您为 mod_proxy_wstunnel 模块配置 ProxyPass 指令时,您必须确保 upgrade 参数未设置为 NONE。有关 mod_proxy_wstunnel 的更多信息,请参阅 Apache 文档

3.5. 配置基本代理服务器

您可以将 Apache HTTP 服务器配置为作为代理服务器,转发 web 客户端和后端 web 服务器之间的请求和响应。您必须配置代理服务器监听器从后端 worker 节点接收连接请求和响应。当您要配置使用 mod_cluster 的负载平衡代理服务器时,还必须为管理频道配置虚拟主机。

先决条件

流程

  1. 打开 mod_cluster 配置文件。

    注意

    mod_cluster 配置文件通常位于 JBCS_HOME/httpd/conf.d/mod_cluster.conf 目录中。

  2. 要为代理服务器创建 Listen 指令,请在 mod_cluster.conf 文件中输入以下行:

    Listen IP_ADDRESS:PORT_NUMBER
    注意

    在前面的示例中,将 IP_ADDRESS 替换为代理服务器用来与 worker 节点通信的服务器网络接口地址,并将 PORT_NUMBER 替换为代理服务器侦听的端口。

    确保为传入 TCP 连接打开端口。

  3. 要创建虚拟主机,请在 mod_cluster.conf 文件中输入以下详情:

    <VirtualHost IP_ADDRESS:PORT_NUMBER>
    
       <Directory />
          Require ip IP_ADDRESS
       </Directory>
    
       KeepAliveTimeout 60
       MaxKeepAliveRequests 0
    
       ManagerBalancerName mycluster
       AdvertiseFrequency 5
       EnableMCPMReceive On
    
    </VirtualHost>
    注意

    在前面的示例中,将 IP_ADDRESSPORT_NUMBER 替换为您为 Listen 指令指定的服务器网络接口和端口号的地址。

    此地址和端口组合仅用于 mod_cluster 管理消息。此地址和端口组合不用于常规流量。

有关配置 mod_jk 并启动 Apache HTTP 服务器服务的详情,请查看 Red Hat JBoss Core Services Apache HTTP Server 安装指南

3.5.1. 禁用服务器公告

代理服务器使用 UDP 多播来公告其自身。AdvertiseFrequency 指令指示服务器默认每 10 秒发送服务器广告消息。服务器广告信息包含您在 VirtualHost 定义中指定的 IP_ADDRESSPORT_NUMBER。配置为响应服务器公告的 worker 节点,使用此信息在代理服务器中注册。如果要阻止 worker 节点使用代理服务器注册,您可以选择性地禁用服务器公告。

注意

当代理服务器和 worker 节点之间有 UDP 多播时,服务器公告会添加 worker 节点,而无需在代理服务器上进行进一步配置。服务器公告只需要在 worker 节点上进行最少的配置。

流程

  1. 打开 mod_cluster 配置文件。

    注意

    mod_cluster 配置文件通常位于 JBCS_HOME/httpd/conf.d/mod_cluster.conf 目录中。

  2. VirtualHost 定义中添加以下指令:

    ServerAdvertise Off
    注意

    如果禁用服务器广告,或者代理服务器和 worker 节点之间无法看到 UDP 多播,您可以使用静态代理服务器列表配置 worker 节点。在这两种情况下,您不需要使用 worker 节点列表配置代理服务器。

3.5.2. 记录 worker 节点详情

当您配置使用 mod_cluster 的负载均衡代理服务器时,您可以选择将 Apache HTTP 服务器配置为记录处理请求的每个 worker 节点的详细信息。如果需要对负载均衡器进行故障排除,请记录 worker 节点详情。

流程

  1. 打开 mod_cluster 配置文件。

    注意

    mod_cluster 配置文件通常位于 JBCS_HOME/httpd/conf.d/mod_cluster.conf 目录中。

  2. 在您的 Apache HTTP Server LogFormat 指令中添加以下详情:

    %{BALANCER_NAME}e ::
    The name of the balancer that served the request.
    
    %{BALANCER_WORKER_NAME}e ::
    The name of the worker node that served the request.

3.6. 在 mod_cluster中配置 Tomcat worker 节点

使用 mod_cluster 时,您可以将 Tomcat worker 节点配置为仅以非集群模式运行的 Apache HTTP Server Tomcat 服务。在这种情况下,在计算负载均衡因时,一次只能使用一个负载指标。

注意

Apache HTTP Server Tomcat worker 节点只支持 mod_cluster 功能的子集。JBoss EAP 提供了完整 mod_cluster 功能。

流程

  1. 要为 Tomcat 添加监听程序,请在 JWS_HOME/tomcat <VERSION> /conf/server.xml 文件中的其他 Listener 元素下添加以下 Listener 元素:

    <Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="true" stickySession="true" stickySessionForce="false" stickySessionRemove="true" />
  2. 要为 worker 节点指定唯一身份,请编辑 JWS_HOME/tomcat &lt;VERSION&gt; /conf/server.xml 文件,将 jvmRoute 属性和值添加到 Engine 元素中:

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker01">
  3. 要配置 STATUS MCMP 消息频率,请修改 org.jboss.modcluster.container.catalina.status-frequency Java 系统属性。

    例如:

    -Dorg.jboss.modcluster.container.catalina.status-frequency=6
    注意

    Tomcat worker 节点会定期将包含其当前负载状态的状态信息发送到 Apache HTTP 服务器负载均衡器。这些消息的默认频率为 10 秒。如果您有数百个 worker 节点,STATUS MCMP 消息可能会增加 Apache HTTP 服务器网络上的流量拥塞。

    您可以通过修改 org.jboss.modcluster.container.catalina.status-frequency Java 系统属性来配置 MCMP 消息频率。默认情况下,属性接受以十秒为单位指定的值。例如,将 属性设为 1 表示 10 秒。在前面的示例中,属性设为 6,即 60 秒。

  4. 可选: 要为代理服务器公告配置防火墙,请完成以下步骤在 worker 节点的防火墙中为 UDP 连接打开端口 23364

    • Red Hat Enterprise Linux 7:

      firewall-cmd --permanent --zone=public --add-port=23364/udp
    • 对于使用 PowerShell 的 Microsoft Windows

      Start-Process "$psHome\powershell.exe" -Verb Runas -ArgumentList '-command "NetSh Advfirewall firewall add rule name="UDP Port 23364" dir=in  action=allow protocol=UDP localport=23364"'
      Start-Process "$psHome\powershell.exe" -Verb Runas -ArgumentList '-command "NetSh Advfirewall firewall add rule name="UDP Port 23364" dir=out action=allow protocol=UDP localport=23364"'
      注意

      当代理服务器使用 mod_cluster 时,代理服务器可以使用 UDP 多播来公告自身。大多数操作系统防火墙默认阻止服务器广告功能。要启用服务器公告并接收这些多播信息,您可以在 worker 节点的防火墙上打开 UDP 连接的端口 23364,如上例中所示。

重要

Red Hat Enterprise Linux 6 不再被支持,并随后从文档中被删除。

3.7. 配置 worker 节点以使用静态代理服务器列表操作

服务器公告允许 worker 节点动态发现并注册到代理服务器。如果禁用 UDP 多播,或者服务器广告被禁用,您必须使用静态代理服务器地址和端口配置 Apache HTTP 服务器 worker 节点。

流程

  1. 打开 JWS_HOME/tomcat &lt;VERSION&gt; /conf/server.xml 文件。
  2. 要定义 mod_cluster 侦听器并禁用动态代理发现,请添加或更改 ModCluster Listener 的 Listener 元素。

    例如:

    <Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="false" stickySession="true" stickySessionForce="false" stickySessionRemove="true"/>
    注意

    确保将 advertise 属性设置为 false

  3. 要创建静态代理服务器列表,请通过以以下格式添加以逗号分隔的代理列表来更新 proxyList 属性: IP_ADDRESS:PORT,IP_ADDRESS:PORT

    例如:

    <Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="false" stickySession="true" stickySessionForce="false" stickySessionRemove="true" proxyList="10.33.144.3:6666,10.33.144.1:6666"/>

第 4 章 使用 OCSP 保护连接

在线证书状态协议(OCSP)是一种技术,它允许 Web 浏览器和 Web 服务器通过安全连接进行通信。加密的数据从一个一端发送,并在处理前由另一侧解密。Web 浏览器和 Web 服务器同时加密和解密数据。

4.1. 在线证书状态协议

当 Web 浏览器和 Web 服务器通过安全连接进行通信时,服务器将以证书的形式提供一组凭据。然后,浏览器验证证书并发送证书状态信息的请求。服务器会使用当前、过期或未知的证书状态进行响应。

证书包含以下类型的信息:

  • 通信语法
  • 控制信息(如启动时间、结束时间和地址信息)以访问在线证书状态协议(OCSP)响应器。

Web 服务器使用 OCSP 响应程序检查证书状态。您可以将 Web 服务器配置为使用证书或另一个 OCSP 响应者中列出的 OCSP 响应者。OCSP 允许过期证书的宽限期,允许在更新证书前访问有限时间的服务器。

OCSP 解决了旧的证书撤销列表(CRL)方法的限制。

4.2. 为 SSL 连接配置 Apache HTTP 服务器

您可以通过安装 mod_ssl 软件包并在 ssl.conf 文件中指定配置设置,将 Apache HTTP 服务器配置为支持 SSL 连接。

先决条件

  • 您已生成 SSL 证书和私钥。
  • 您知道 SSL 证书和私钥文件的位置。
  • 您已获取与 SSL 证书关联的通用名称(CN)。

流程

  1. 要安装 mod_ssl,请输入以下命令:

    # yum install jbcs-httpd24-mod_ssl
  2. 指定 SSL 配置设置:

    1. 打开 JBCS_HOME/httpd/conf.d/ssl.conf 文件。
    2. ServerNameSSLCertificateFileSSLCertificateKeyFile 输入详情。

      例如:

      <VirtualHost _default_:443>
      ServerName www.example.com:443
      SSLCertificateFile /opt/rh/jbcs-httpd24/root/etc/pki/tls/certs/localhost.crt
      SSLCertificateKeyFile /opt/rh/jbcs-httpd24/root/etc/pki/tls/private/localhost.key
      注意
      • ServerName 必须与与 SSL 证书关联的通用名称(CN)匹配。如果 ServerName 与 CN 不匹配,客户端浏览器会显示域名不匹配错误。
      • SSLCertificateFile 指定到 SSL 证书文件的路径。
      • SSLCertificateKeyFile 指定与 SSL 证书关联的私钥文件的路径。
  3. 验证 Listen 指令是否与部署的 httpd 服务的主机名或 IP 地址匹配。
  4. 要重启 Apache HTTP 服务器,请输入以下命令:

    # service jbcs-httpd24-httpd restart

4.3. 在 Apache HTTP 服务器中使用 OCSP

您可以使用在线证书状态协议(OCSP)与 Apache HTTP 服务器安全连接。

流程

  1. 配置证书颁发机构。

    注意

    确保您的 CA 可以发布 OCSP 证书。CA 必须能够在证书中添加以下属性:

    [ usr_cert ]
    ...
    authorityInfoAccess=OCSP;URI:http://<HOST>:<PORT>
    ...
    [ v3_OCSP ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = OCSP Signing

    在前面的示例中,将 HOSTPORT 替换为您要配置的 OCSP 响应者的详细信息。

  2. 配置 OCSP 响应器。

4.4. 配置 Apache HTTP 服务器以验证 OCSP 证书

您可以通过在 ssl_conf 文件中定义 OCSP 设置,将 Apache HTTP 服务器配置为验证 OCSP 证书。

流程

  1. 打开 JBCS_HOME/httpd/conf.d/ssl.conf 文件。
  2. 为您的部署指定适当的 OCSP 配置详情。

    例如:

    # Require valid client certificates (mutual auth)
    SSLVerifyClient require
    SSLVerifyDepth  3
    # Enable OCSP
    SSLOCSPEnable on
    SSLOCSPDefaultResponder http://<HOST>:<PORT>
    SSLOCSPOverrideResponder on
    注意

    前面的示例演示了如何启用客户端证书的 OCSP 验证。在前面的示例中,将 < HOST&gt; 和 & lt;PORT > 替换为默认的 OCSP Responder 的 IP 地址和端口。

4.5. 验证 Apache HTTP 服务器的 OCSP 配置

您可以使用 OpenSSL 命令行工具验证 Apache HTTP 服务器的 OCSP 配置。

流程

  • 在命令行中,以以下格式输入 openssl 命令:

    # openssl ocsp -issuer cacert.crt -cert client.cert -url http://HOST:PORT -CA ocsp_ca.cert -VAfile ocsp.cert

    在前面的命令中,请确定指定了以下详情:

    • 使用 -issuer 选项指定 CA 证书。
    • 使用 -cert 选项指定您要验证的客户端证书。
    • 使用 -url 选项指定 HTTP 服务器验证证书(OCSP)。
    • 使用 -CA 选项指定是验证 Apache HTTP 服务器证书的 CA 证书。
    • 使用 -VAfile 选项指定 OCSP 响应程序证书。

第 5 章 使用 mod_cluster进行负载平衡的配置示例

您可以将 JBoss Core Services 配置为使用 mod_cluster 连接器在 Red Hat Enterprise Linux 系统中进行负载均衡。

当您要配置使用 mod_cluster 的负载均衡解决方案时,您必须执行以下任务:

5.1. 将 JBoss Core Services 设置为代理服务器

当您将 JBoss Core Services 配置为使用 mod_cluster 时,您必须通过在 mod_cluster.conf 文件中指定配置详情将 JBoss Core Services 设置为代理服务器。

流程

  1. 前往 JBCS_HOME/httpd/conf.d/ 目录。
  2. 创建名为 mod_cluster.conf 的文件。
  3. 输入以下配置详情:

    LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
    LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so
    LoadModule manager_module modules/mod_manager.so
    LoadModule advertise_module modules/mod_advertise.so
    
    MemManagerFile cache/mod_cluster
    
    <IfModule manager_module>
      Listen 6666
      <VirtualHost *:6666>
        <Directory />
          Require ip 127.0.0.1
        </Directory>
        ServerAdvertise on
        EnableMCPMReceive
        <Location /mod_cluster_manager>
          SetHandler mod_cluster-manager
          Require ip 127.0.0.1
       </Location>
      </VirtualHost>
    </IfModule>
    注意

    前面的示例演示了如何将 JBoss Core Services 设置为侦听 localhost 的代理服务器。

5.2. 配置 Tomcat worker 节点

当您将 JBoss Core Services 配置为使用 mod_cluster 时,您必须通过将 Listener 元素添加到 server.xml 文件中来配置 Tomcat worker 节点。

流程

  1. 打开 JWS_HOME/tomcat &lt;VERSION&gt; /conf/server.xml 文件。
  2. 添加以下 Listener 元素:

    <Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="true"/>

5.3. 定义 iptables 防火墙规则示例

当您将 JBoss Core Services 配置为使用 mod_cluster 时,您必须使用 iptables 定义防火墙规则。

流程

  • 使用 iptables 定义一组防火墙规则。

    例如:

    /sbin/iptables -I INPUT 5 -p udp -d 224.0.1.0/24 -j ACCEPT -m comment --comment "mod_cluster traffic"
    /sbin/iptables -I INPUT 6 -p udp -d 224.0.0.0/4 -j ACCEPT -m comment --comment "JBoss Cluster traffic"
    /sbin/iptables -I INPUT 9 -p udp -s 192.168.1.0/24 -j ACCEPT -m comment --comment "cluster subnet for inter-node communication"
    /sbin/iptables -I INPUT 10 -p tcp -s 192.168.1.0/24 -j ACCEPT -m comment --comment "cluster subnet for inter-node communication"
    /etc/init.d/iptables save
    注意

    前面的示例演示了为 192.168.1.0/24 子网上的集群节点定义防火墙规则。

第 6 章 使用 mod_auth_kerb进行 Kerberos 验证的配置示例

您可以使用 JBoss Core Services Apache HTTP 服务器和 Red Hat Enterprise Linux 上的 mod_auth_kerb 模块来配置 Kerberos 身份验证。

当要配置 Kerberos 身份验证时,您必须执行以下任务:

6.1. 先决条件

  • 您已使用通用安全服务(GSS)协商支持安装了 curl 命令行工具。
  • 您已配置并运行 Kerberos 或 LDAP 服务器(如 ApacheDS)在与 JBoss Core Services 相同的主机上运行。
  • 如果您使用 LDAP 服务器,已经创建了名为 krbtgt 的 LDAP 用户、LDAP 和HTTP,以及名为 hnelson 的测试 LDAP 用户。

    • 要创建 krbtgt 用户,请输入以下详情:

      dn: uid=krbtgt,ou=Users,dc=example,dc=com
      objectClass: top
      objectClass: person
      objectClass: inetOrgPerson
      objectClass: krb5principal
      objectClass: krb5kdcentry
      cn: KDC Service
      sn: Service
      uid: krbtgt
      userPassword: secret
      krb5PrincipalName: krbtgt/EXAMPLE.COM@EXAMPLE.COM
      krb5KeyVersionNumber: 0
    • 要创建 ldap 用户,请输入以下详情:

      dn: uid=ldap,ou=Users,dc=example,dc=com
      objectClass: top
      objectClass: person
      objectClass: inetOrgPerson
      objectClass: krb5principal
      objectClass: krb5kdcentry
      cn: LDAP
      sn: Service
      uid: ldap
      userPassword: randall
      krb5PrincipalName: ldap/localhost@EXAMPLE.COM
      krb5KeyVersionNumber: 0
    • 要创建 HTTP 用户,请输入以下详情:

      dn: uid=HTTP,ou=Users,dc=example,dc=com
      objectClass: top
      objectClass: person
      objectClass: inetOrgPerson
      objectClass: krb5principal
      objectClass: krb5kdcentry
      cn: HTTP
      sn: Service
      uid: HTTP
      userPassword: secretpwd
      krb5PrincipalName: HTTP/localhost@EXAMPLE.COM
      krb5KeyVersionNumber: 0
    • 要创建测试用户 hnelson,请输入以下详情:

      dn: uid=hnelson,ou=Users,dc=example,dc=com
      objectClass: top
      objectClass: person
      objectClass: inetOrgPerson
      objectClass: krb5principal
      objectClass: krb5kdcentry
      cn: Horatio Nelson
      sn: Nelson
      uid: hnelson
      userPassword: secret
      krb5PrincipalName: hnelson@EXAMPLE.COM
      krb5KeyVersionNumber: 0

6.2. 配置 Kerberos 客户端

当您配置 Kerberos 验证时,您必须执行以下步骤来配置 Kerberos 客户端:

  1. 指定 krb5.conf 文件中的配置设置。
  2. JBCS_HOME/httpd/conf 文件中创建一个密钥选项卡。
  3. 为密钥选项卡分配权限。
  4. 确保 /etc/hosts 文件中包含 localhost

流程

  1. 指定 krb5.conf 文件中的配置设置:

    1. 进入 /etc 目录。
    2. 创建名为 krb5.conf 的文件。
    3. 输入以下配置详情:

      [logging]
        default = FILE:/var/log/krb5libs.log
        kdc = FILE:/var/log/krb5kdc.log
        admin_server = FILE:/var/log/kadmind.log
      
      [libdefaults]
        default_realm = EXAMPLE.COM
        default_tgs_enctypes = des-cbc-md5,des3-cbc-sha1-kd
        default_tkt_enctypes = des-cbc-md5,des3-cbc-sha1-kd
        dns_lookup_realm = false
        dns_lookup_kdc = false
        allow_weak_crypto = yes
        ticket_lifetime = 24h
        renew_lifetime = 7d
        forwardable = yes
      
      [realms]
        EXAMPLE.COM = {
          kdc = localhost:60088
          admin_server = localhost:60088
        }
      
      [domain_realm]
        .example.com = EXAMPLE.COM
        example.com = EXAMPLE.COM
  2. 要创建密钥标签页:

    1. 打开 JBCS_HOME/httpd/conf 文件。
    2. 输入以下详情:

      # ktutil
      ktutil: addent -password -p HTTP/localhost@EXAMPLE.COM -k 0 -e des-cbc-md5
      Password for HTTP/localhost@EXAMPLE.COM: secretpwd
      ktutil: list
      slot KVNO Principal
      ---- ---- ---------------------------------------------------------------------
         1    0               HTTP/localhost@EXAMPLE.COM
      ktutil: wkt JBCS_HOME/httpd/conf/krb5.keytab
      ktutil: quit
      重要

      环境变量不会在 ktutil 提示符中扩展。您必须替换 JBCS_HOME 变量的完整路径。

  3. 要将正确的组和权限应用到密钥标签页,以 root 用户身份输入以下命令:

    # chgrp apache JBCS_HOME/httpd/conf/krb5.keytab
    # chmod 640 JBCS_HOME/httpd/conf/krb5.keytab
  4. 确保 /etc/hosts 文件中包含了以下主机配置:

    127.0.0.1 localhost

6.3. 配置 mod_auth_kerb

当您配置 Kerberos 身份验证时,您必须通过在 auth_kerb.conf 文件中指定设置来配置 mod_auth_kerb

流程

  1. 前往 JBCS_HOME/httpd/conf.d/ 目录。
  2. 创建名为 auth_kerb.conf 的文件。
  3. 输入以下配置详情:

    #
    # The mod_auth_kerb module implements Kerberos authentication over HTTP, following the "Negotiate" protocol.
    #
    
    # The LoadModule statement is done in conf.d/10-auth_kerb.conf
    # LoadModule auth_kerb_module modules/mod_auth_kerb.so
    
    <Location /kerberostest>
      AuthType Kerberos
      AuthName "Kerberos Login"
      KrbMethodNegotiate On
      KrbMethodK5Passwd Off
      KrbAuthRealms EXAMPLE.COM
      KrbServiceName HTTP
      Krb5KeyTab $JBCS_HOME/httpd/krb5.keytab
      require valid-user
    </Location>
重要

环境变量不会在配置文件中扩展。在前面的示例中,确保您替换了 JBCS_HOME 变量的完整路径。

6.4. 测试 Kerberos 身份验证

当您配置 Kerberos 身份验证时,可以使用测试页面来测试 Kerberos 身份验证。

流程

  1. 要创建测试页面,请执行以下步骤:

    1. 进入 JBCS_HOME/httpd/www/html/kerberostest 目录。
    2. 创建名为 auth_kerb_page.html 的测试页面。
    3. 输入以下详情:

      <html>
      <body>
          <h1>mod_auth_kerb successfully authenticated!</h1>
      </body>
      </html>
  2. 可选:在 JBCS_HOME/httpd/conf/httpd.conf 文件中,将日志级别设置为调试。
  3. 启动 Apache HTTP 服务器。如需更多信息,请参阅 Red Hat JBoss Core Services Apache HTTP Server 安装指南
  4. 要为测试用户启动 Kerberos 验证 hnelson,请输入以下命令:

    $ kinit hnelson
  5. 要查看测试用户 hnel son 的详情,请输入以下命令:

    $ klist

    klist 命令生成以下输出类型:

    Ticket cache: FILE:/tmp/krb5cc_18602
    Default principal: hnelson@EXAMPLE.COM
    
    Valid starting     Expires            Service principal
    06/03/13 14:21:13  06/04/13 14:21:13  krbtgt/EXAMPLE.COM@EXAMPLE.COM
    renew until 06/10/13 14:21:13

验证

  • 要测试 Kerberos 验证,请输入以下命令:

    $ curl --negotiate -u : http://localhost/kerberostest/auth_kerb_page.html

    如果 Kerberos 身份验证正常工作,curl 命令会生成以下输出:

    <html>
    <body>
        <h1>mod_auth_kerb successfully authenticated!</h1>
    </body>
    </html>

6.5. 其他资源(或后续步骤)

附录 A. Apache HTTP 服务器代理模块

本节包含 mod_cluster 包括的 Apache HTTP 服务器代理模块的扩展定义。

A.1. Mod_manager 模块和指令

集群管理器模块 mod_manager 接收和确认来自节点的消息,包括 worker 节点注册、worker 节点加载数据和 worker 节点应用程序生命周期事件。

LoadModule manager_module modules/mod_manager.so

mod_manager可配置的指令

< VirtualHost> 元素中的可配置指令如下:

EnableMCPMReceive
允许 VirtualHost 从节点接收 mod_cluster Protocol 消息 (MCPM)。向 Apache HTTP 服务器配置添加一个 EnableMCPMReceive 指令,以允许 mod_cluster 正确运行。在配置了 广播 的位置,必须在 VirtualHost 配置中添加 EnableMCPMReceive
MaxMCMPMaxMessSize
定义 mod_cluster 管理协议 (MCMP) 消息的最大大小。默认值从其他 Max 指令计算。最小值为 1024
AllowDisplay
切换 mod_cluster-manager 主页上的附加显示。默认值为 off,这会导致在 mod_cluster-manager 主页中仅显示版本信息。
AllowCmd
使用 mod_cluster-manager URL 切换命令的权限。默认值为 on,它允许命令。
ReduceDisplay
切换 mod_cluster-manager 页面中显示的信息的减少。减少信息可让更多节点在页面中显示。默认值为 off,它允许所有可用的信息显示。
MemManagerFile
定义 mod_manager 存储配置详情的文件位置。mod_manager 还使用此位置生成了共享内存和锁定文件的密钥。这必须是绝对路径名。建议此路径位于本地驱动器中,而不是 NFS 共享。默认值为 /logs/
Maxcontext
将要使用的最大上下文数 mod_cluster。默认值为 100
Maxnode
将将使用的最大 worker 节点 mod_cluster。默认值为 20
Maxhost
将使用最多的主机数(别名)mod_cluster。这也是负载均衡器的最大数量。默认值为 20
Maxsessionid
存储的活跃会话标识符的最大数量。如果会话没有从该会话收到任何信息(五分钟)时,会话被视为不活跃。这仅用于演示和调试目的。默认值为 0, 它禁用这个逻辑。
ManagerBalancerName
当 worker 节点不提供负载均衡器名称时,要使用的负载均衡器的名称。默认值为 mycluster
PersistSlots
当设置为 上的 时,节点、别名和上下文则会保留在文件中。默认值为 off
CheckNonce

设置为 时,会检查会话标识符以确保它们是唯一的且之前没有发生。默认值在

注意

将这个指令设置为 off 可能会使服务器存在易受回放攻击。

SetHandler mod_cluster-manager

定义一个处理程序来显示集群中 worker 节点的信息。这在 Location 元素中定义:

<Location $LOCATION>
  SetHandler mod_cluster-manager
  Require ip 127.0.0.1
</Location>

当访问浏览器中在 Location 元素中定义的 $LOCATION 时,您会看到类似如下的内容。(此例中,$LOCATION 也定义为 mod_cluster-handler.)

传输 与发送到 worker 节点的 POST 数据对应。连接 与请求此状态页面时已处理的请求数相对应。会话 对应于活跃会话的数量。当 Maxsessionid0 时,此字段不存在。

A.2. Mod_proxy_cluster 模块和指令

Proxy Balancer 模块 mod_proxy_cluster 处理请求到集群节点的路由。Proxy Balancer 选择适当的节点,以根据集群中的应用程序位置、每个集群节点的当前状态以及 Session ID(如果请求是已建立的会话的一部分)将请求转发到。

LoadModule proxy_cluster_module modules/mod_proxy_cluster.so

适用于 mod_proxy_cluster的可配置指令

您还可以在 < VirtualHost> 元素中 配置以下指令来更改负载均衡行为。

CreateBalancers

定义如何在 Apache HTTP 服务器虚拟主机中创建负载均衡器。在 CreateBalancers 中,以下值有效:

  • 0 :在 Apache HTTP 服务器中定义的所有虚拟主机中创建负载均衡器。记得在 ProxyPass 指令中配置负载均衡器。
  • 1: 不要创建负载均衡器。使用此值时,还必须在 ProxyPassProxyPassMatch 中定义负载均衡器名称。
  • 2: 仅创建主服务器。这是 CreateBalancers 的默认值。
UseAlias

定义是否可检查定义的 Alias 是否与 ServerName 对应。以下值对 UseAlias 有效:

  • 0 :忽略 worker 节点的别名信息。这是 UseAlias 的默认值。
  • 1: 验证定义的别名对应于 worker 节点的服务器名称。
LBstatusRecalTime
定义代理计算 worker 节点状态的时间间隔(以秒为单位)。默认间隔为 5 秒。
ProxyPassMatch; ProxyPass

ProxyPass 将远程服务器映射到本地服务器命名空间中。如果本地服务器有地址,如 http://local.com/,以下 ProxyPass 指令会将 http://local.com/requested/file1 的本地请求转换为 http://worker.local.com/file1 的代理请求。

ProxyPass /requested/ http://worker.local.com/

ProxyPassMatch 使用正则表达式匹配应应用 URL 的本地路径。

对于任一指令,! 表示指定的路径为本地路径,并且该路径的请求不应路由到远程服务器。例如,以下指令指定应在本地提供 gif 文件。

ProxyPassMatch ^(/.*\.gif)$ !

A.3. Mod_advertise 模块和指令

Proxy Advertisement 模块 mod_advertise 通过 UDP 多播消息广播代理服务器是否存在。服务器广告消息包含 IP 地址和端口号,代理从希望加入负载平衡集群的节点中侦听响应。

mod_advertise 模块必须与 VirtualHost 元素中的 mod_manager 模块定义。在以下示例中,mod_advertise 模块的标识符是 advertise_module

LoadModule advertise_module modules/mod_advertise.so

适用于 mod_advertise的可配置指令

mod_advertise 模块可以通过以下指令进行配置:

ServerAdvertise

定义广告机制的用法。

默认值为 Off。当设置为 Off 时,代理不会公告其位置。

当设置为 On 时,广告机制用于告知 worker 节点向此代理发送状态信息。您还可以使用以下语法指定主机名和端口: ServerAdvertise On http://HOSTNAME:PORT/.这只有在使用基于名称的虚拟主机或者未定义虚拟主机时才需要。

AdvertiseGroup

定义要公告的多播地址。语法是 AdvertiseGroup ADDRESS:PORT,电子邮件地址必须与 AdvertiseGroupAddress 对应,PORT 必须与 worker 节点上的 AdvertisePort 对应。

如果您的 worker 节点是基于 JBoss EAP,并且在启动时使用 -u 开关,则默认的 AdvertiseGroupAddress 是通过 -u 切换传递的值。

默认值为 224.0.1.105:23364。如果没有指定端口,则端口默认为 23364

AdvertiseFrequency
多播消息之间的时间间隔(以秒为单位)广告 IP 地址和端口。默认值为 10
AdvertiseSecurityKey
定义用于在 Apache HTTP 服务器中识别 mod_cluster 的字符串。默认情况下不设置这个指令,不会发送任何信息。
AdvertiseManagerUrl
定义 worker 节点应该用来向代理服务器发送信息的 URL。默认情况下不设置这个指令,不会发送任何信息。
AdvertiseBindAddress
定义发送多播消息的地址和端口。语法是 Advertise BindAddress ADDRESS:PORT。这允许在具有多个 IP 地址的机器中指定地址。默认值为 0.0.0.0:23364

A.4. mod_proxy 模块和指令

mod_proxy 模块是一个标准的 Apache HTTP Server 模块,它允许服务器充当通过 AJP(Apache JServe Protocol)、FTP、CONNECT(用于 SSL)和 HTTP 协议传输的数据的代理。mod_proxy 模块不需要额外的配置。mod_proxy 模块的标识符是 proxy_module

mod_proxy 的可配置指令(如 ProxyIOBufferSize )用于配置 mod_cluster 模块。

A.5. Mod_proxy_ajp 模块和指令

mod_proxy_ajp 模块是一个标准 Apache HTTP 服务器模块,它支持 AJP(Apache JServe Protocol)代理。如果要使用 mod_proxy _ ajp,也需要 mod_proxy 模块。此外,在使用 Tomcat AJP 连接器时,需要 secret 属性。使用以下命令可将 secret 属性添加到 ProxyPass 设置中:

ProxyPass /example/ ajp://localhost:8009/example/ secret=YOUR_AJP_SECRET

注意

如果您在负载均衡器上设置 secret,其所有成员都会继承这个 secret

A.6. Mod_cluster_slotmem 模块和指令

mod_cluster_slotmem 模块是一个共享内存提供程序,用于创建和管理数据集在"slots"中组织的共享内存段。

mod_cluster_slotmem 模块不需要任何配置指令。

附录 B. Worker.properties 文件

Apache HTTP 服务器 worker 节点是映射到 mod_jk 负载均衡器的 servlet 容器。worker 节点在 JBCS_HOME/httpd/conf/workers.properties 中定义。此文件指定不同的 servlet 容器所处的位置,以及如何在它们之间进行负载平衡调用。

B.1. Worker.properties 概述

workers.properties 文件包含全局属性部分和 worker 属性部分。

全局属性
本节包含应用到所有 worker 的指令。
worker 属性
本节包含适用于每个单独 worker 的指令。

每个节点使用 worker 属性命名规则进行定义。worker 名称只能包含小写字母、大写字母、数字和特定特殊字符(_/)。

worker 属性的结构为 worker。WORKER_NAME.DIRECTIVE.

worker
所有 worker 属性的恒定前缀。
WORKER_NAME
提供给 worker 的任意名称。例如: node1、node _01Node_1
指令
需要的特定指令。

B.2. workers.properties 指令

workers.properties 文件指令分为全局、强制、连接和负载平衡分类。

worker.properties全局指令

worker.list

指定 mod_jk 使用的 worker 名称列表。此列表中的 worker 可用于将请求映射到。

注意

单个节点配置(不由负载均衡器管理)必须设置为 worker.list=WORKER_NAME

worker.properties的必要指令

type

指定 worker 类型,它决定了适用于 worker 的指令。默认值为 ajp13,这是为 web 服务器和 Apache HTTP 服务器之间的通信的首选 worker 类型。

其他值包括 lbstatus

有关 AJPv13 的详情,请查看 Apache Tomcat 连接器 - AJP 协议参考

worker.properties 的连接指令

主机

worker 的主机名或 IP 地址。worker 节点必须支持 ajp13 协议堆栈。默认值为 localhost

您可以将 port 指令指定为 host 指令的一部分,方法是在主机名或 IP 地址后附加端口号。例如: worker.node1.host=192.168.2.1:8009worker.node1.host=node1.example.com:8009

port
侦听定义的协议请求的远程服务器实例的端口号。默认值为 8009,这是 AJPv13 worker 的默认监听端口。
ping_mode

指定在其当前网络健康状态中探测到哪些连接的条件。

该探测为 CP 使用空的 AJPv13 数据包,并在指定的超时内要求返回 CPong

您可以使用指令标记的组合来指定条件。标志不是用逗号分开。例如,设置正确的指令标记是 worker.node1.ping_mode=CI

c(connect)
指定连接在连接到服务器后探测一次。您可以使用 connect_timeout 指令指定超时,否则将使用 ping_timeout 的值。
P(prepost)
指定连接在向服务器发送每个请求前被探测。您可以使用 prepost_timeout 指令指定超时,否则将使用 ping_timeout 的值。
I(interval)
指定在常规内部维护周期内会探测连接。您可以使用 connection_ping_interval 指令指定每个间隔之间的空闲时间,否则使用 ping_timeout 的值。
A(全部)
最常用的设置,用于指定应用所有指令标记。有关 \*_timeout 高级指令的详情,请查看 Apache Tomcat Connector - 参考指南
ping_timeout
指定 CPong 回答连接探测的时间(请参阅 ping_mode)。默认值为 10000 (毫秒)。

worker.properties 的负载均衡指令

lbfactor

指定单独的 worker 的负载均衡因,且仅为负载均衡器的成员 worker 指定。

这个指令定义了与集群中其他 worker 相比的与 worker 发布的 HTTP 请求负载的相对数量。

适用该指令的一个常见示例就是您希望将服务器区分比集群中的其他人更多的处理能力。例如,如果您需要一个 worker 负载的三倍,但需要其他 worker. WORKER_NAME.lbfactor=3

balance_workers
指定负载均衡器必须管理的 worker 节点。指令可以多次用于同一负载平衡器,并且由 workers.properties 文件中指定的以逗号分隔的 worker 名称列表组成。
sticky_session

指定对带有 SESSION ID 的 worker 的请求是否路由到同一 worker。默认值为 0( false)。如果设置为 1 (true),则启用负载均衡器持久性。

例如,如果指定 worker.loadbalancer.sticky_session=0,则每个请求在集群中的每个节点之间平衡负载。换句话说,相同会话的不同请求可以根据服务器负载进入不同的服务器。

如果您指定了 worker.loadbalancer.sticky_session=1,每个会话都会持久(锁定)到服务器终止前,提供该服务器可用。

附录 C. 多处理模块(MPM)

Red Hat JBoss Core Services 包括了各种多处理模块(MPM)。您可以使用这些 MPMs 自定义 Apache HTTP 服务器响应传入请求。

C.1. MPMs 概述

Red Hat Enterprise Linux 和 Microsoft Windows 都提供了多处理模块(MPM)。

MPMs for Red Hat Enterprise Linux

prefork
prefork MPM 实现非线程的预派生 Web 服务器。单个控制进程负责启动子进程,在到达时侦听传入连接和服务它们。每个请求都由一个进程处理,确保每个请求被隔离,且不会影响任何其他请求。
worker
worker MPM 实现混合多进程、多线程服务器。每个子进程都会创建一个固定数量的服务器线程,允许服务器处理大量系统资源的请求。
event
事件 MPM 基于 worker MPM,但允许通过将某些处理工作传递给监听器线程来同时提供额外的请求,从而释放 worker 线程来为新请求服务。

Microsoft Windows 的 MPM

winnt
winnt MPM 是 Windows 系统唯一可用的。它使用单一控制过程,启动单一进程来为传入请求创建线程。

C.2. 切换 MPM

服务器根据 JBCS_HOME/httpd/conf.modules.d/00-mpm.conf 文件中的 LoadModule 指令选择 MPM。您可以通过从 00-mpm.conf 文件中的 LoadModule 指令中删除注释字符(#)来选择一个特定的 MPM。

默认情况下会选择 prefork MPM。例如:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

流程

  1. 编辑 JBCS_HOME/httpd/conf.modules.d/00-mpm.conf,为 prefork MPM 的 LoadModule 指令添加注释(#)字符。例如:

    # prefork MPM: Implements a non-threaded, pre-forking web server
    # See: http://httpd.apache.org/docs/2.4/mod/prefork.html
    #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
  2. 在同一个 00-mpm.conf 文件中,从您要切换到的 MPM 的 LoadModule 指令中删除注释(#)字符。这些行直接位于 prefork MPM 下。

    例如,要加载 worker MPM,请从 worker MPM 的 LoadModule 指令中删除注释(#)字符:

    # worker MPM: Multi-Processing Module implementing a hybrid
    # multi-threaded multi-process web server
    # See: http://httpd.apache.org/docs/2.4/mod/worker.html
    LoadModule mpm_worker_module modules/mod_mpm_worker.so
  3. 要验证 MPM 是否已正确配置,请输入以下命令:

    $ sbin/apachectl -V

    这个命令显示当前 MPM。例如:

    Server MPM:     worker

附录 D. Worker 节点配置

配置值会在以下情况下发送到代理:

  • 服务器启动过程中
  • 当通过公告机制检测到代理时
  • 在重置代理配置时进行错误恢复

表 D.1. Tomcat 的代理配置值

默认描述

stickySession

true

指定给定会话的后续请求是否应该路由到同一节点(如果可能)。

stickySessionRemove

false

如果负载均衡器无法将请求路由到卡的节点,则指定 Apache HTTP 服务器代理是否应该删除会话粘性。如果 stickySessionfalse,则此属性将被忽略。

stickySessionForce

true

如果负载均衡器无法将请求路由到它卡的节点,则指定 Apache HTTP 服务器代理是否应该返回错误。如果 stickySessionfalse,则此属性将被忽略。

workerTimeout

-1

指定等待 worker 可以用来处理请求的秒数。当一个负载均衡器的所有 worker 都不可用时,mod_cluster 将在同时(workerTimeout/100)后重试,以查找可用的 worker。值 -1 表示 Apache HTTP 服务器将不会等待 worker 可用,如果没有 worker 可用,则返回错误。

maxAttempts

1

指定 Apache HTTP 服务器代理试图向 worker 发送给定请求的次数,然后再中止。最小值为 1: 在中止前尝试一次。

flushPackets

false

指定数据包清除是启用还是禁用。

flushWait

-1

指定在清除数据包前等待的时间。值 -1 表示永久等待。

ping

10

等待(以秒为单位)等待(以秒为单位)对 ping 进行 pong 答案。

smax

 

指定软最大闲置连接数。最大的值由 Apache HTTP 服务器线程配置(ThreadsPerChild1)决定。

ttl

60

指定闲置连接的时间(以秒为单位)会保留超过 smax 阈值。

nodeTimeout

-1

指定在返回错误前,mod_cluster 会等待后端服务器响应的时间(以秒为单位)。mod_cluster 始终使用 cping/cpong,再转发请求。mod_cluster 使用的 connectiontimeout 值是 ping 值。

balancer

mycluster

指定负载均衡器的名称。

loadBalancingGroup

 

指定同一负载均衡组内 jvmRoutes 之间的负载平衡。loadBalancingGroup 在概念上相当于 mod_jk 域指令。

附录 E. mod_cluster 代理和代理发现配置属性

下表包含 mod_cluster 代理和代理发现配置属性的属性和信息。

表 E.1. mod_cluster的代理发现配置属性

属性属性默认值

proxy-list

proxyList

 

proxy-url

proxyURL

 

公告

advertise

true

advertise-security-key

advertiseSecurityKey

 

excluded-contexts

excludedContexts

 

auto-enable-contexts

autoEnableContexts

true

stop-context-timeout

stopContextTimeout

10 秒(以秒为单位)

socket-timeout

nodeTimeout

20 秒(以毫秒为单位)

注意

当未定义 nodeTimeout 时,会使用 Proxy Timeout 指令 Proxy。如果没有定义 ProxyTimeout,则使用服务器超时(超时)(在 JBCS httpd.conf 中默认使用120 秒)。nodeTimeoutProxy Timeout 和 Timeout 在套接字级别上设置。

表 E.2. mod_cluster的代理配置属性

属性属性默认值

sticky-session

stickySession

true

sticky-session-remove

stickySessionRemove

false

sticky-session-force

stickySessionForce

true

node-timeout

workerTimeout

-1

max-attempts

maxAttempts

1

flush-packets

flushPackets

false

flush-wait

flushWait

-1

ping

ping

10(秒)

smax

smax

-1(使用默认值)

ttl

ttl

-1(使用默认值)

domain

loadBalancingGroup

 

load-balancing-group

loadBalancingGroup

 

附录 F. 载入 Tomcat 的配置

当您要在 Apache Tomcat 中使用 mod_cluster 时,您可以配置以下额外属性来加载指标。

表 F.1. 载入 Tomcat 的配置

属性默认值描述

loadMetricClass

org.jboss.modcluster.load.metric.impl.BusyConnectorsLoadMetric

实施 org.jboss.load.metric.LoadMetric的对象的类名称

loadMetricCapacity

1

通过 loadMetricClass 属性定义的负载指标的容量

loadHistory

9

在负载均衡因计算中必须考虑的历史负载值数

loadDecayFactor

2

历史负载值降低的因素