教程:在 Azure 虚拟机上手动安装 Red Hat JBoss EAP

本教程演示了在 Red Hat Enterprise Linux (RHEL)上安装 Red Hat JBoss EAP 并在 Azure 虚拟机(VM)上以域模式配置群集的步骤。

本教程介绍如何执行以下任务:

  • 创建自定义虚拟网络并在网络中创建 VM。
  • 使用手动命令行在 VM 上安装所需的 JDK 和 Red Hat JBoss EAP。
  • 使用命令行接口(CLI)在域模式下配置 Red Hat JBoss EAP 群集。
  • 在群集中配置 PostgreSQL 数据源连接。
  • 在群集中部署并运行示例 Java 企业版应用程序。
  • 通过Azure 应用程序网关向公共 Internet 公开应用程序。
  • 验证成功配置。

如果你更喜欢代表 GNU/Linux VM 执行所有这些步骤的完全自动化解决方案,请直接从Azure 门户参阅快速入门:使用 Azure 门户 在 Azure 虚拟机上部署 JBoss EAP 服务器。

注意

本文包含对术语“从属”的引用,这是 Microsoft 不再使用的术语。 在从软件中删除该术语后,我们会将其从本文中删除。

先决条件

  • 如果还没有 Azure 订阅,可以在开始前创建一个免费帐户

  • 安装 Azure CLI 2.51.0 或更高版本 以运行 Azure CLI 命令。

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展
    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade
  • 确保拥有必要的 Red Hat 许可证。 需要拥有 Red Hat 订阅管理(RHSM)的 Red Hat 帐户(RHSM)权利才能获得 Red Hat JBoss EAP。 此权利使完全自动化的解决方案提及之前(使用 Azure 门户 在 Azure 虚拟机上部署 JBoss EAP 服务器)以安装经过测试和认证的 JBoss EAP 版本。

    注意

    如果你没有 EAP 权利,可以通过适用于个人的 Red Hat 开发人员订阅注册免费的开发人员订阅。 将帐户详细信息保存为下一部分中的 RHSM 用户名RHSM 密码

  • 如果已注册或完成注册后,可以使用以下步骤找到所需的凭据(池 ID)。 后续步骤中,这些 池 ID 还用作 具有 EAP 权利 的 RHSM 池 ID。

    1. 登录到你的 Red Hat 帐户

    2. 首次登录时,系统会提示你完成个人资料。 根据使用情况,选择 “个人 ”或 “公司 帐户 类型”,如以下屏幕截图所示:

      Red Hat 帐户窗口的屏幕截图,其中显示了“个人”选项的“帐户类型”选项。

    3. 打开 个人 Red Hat 开发人员订阅。 此链接可访问你的帐户中相应 SKU 的所有订阅。

    4. 在“所有已购买的订阅”表下的控件行中,选择“活动”。 这可确保仅显示活动订阅。

    5. 选择结束日期可排序列标题,直到将来最远的值显示为第一行。

    6. 选择第一行。 然后,从池 ID 复制并保存以下主池的值。

  • Java JDK 版本 11。 在本指南中,建议 使用 OpenJDK 的 Red Hat 内部版本。 确保在运行命令的 shell 中正确设置 JAVA_HOME 环境变量。

  • Git;用于 git --version 测试是否 git 正常工作。 本教程已使用版本 2.25.1 进行测试。

  • Maven;用于 mvn -version 测试是否 mvn 正常工作。 本教程已使用版本 3.6.3 进行测试。

准备环境

在本部分中,将设置在其中安装 JDK、Red Hat JBoss EAP 和 PostgreSQL JDBC 驱动程序的基础结构。

假设

本教程在域模式下配置 Red Hat JBoss EAP 群集,总共在三台 VM 上配置了一台管理服务器和两个托管服务器。 若要配置群集,需要创建以下三个 Azure VM:

  • 管理员 VM(VM 名称 adminVM)以域控制器身份运行。
  • 两个托管 VM(VM 名称和mspVM1mspVM2)作为主机控制器运行。

登录 Azure

如果尚未登录,请使用 az login 命令并按照屏幕上的说明登录到 Azure 订阅。

az login

注意

如果有多个 Azure 租户与 Azure 凭据相关联,则必须指定要登录的租户。 可以使用此选项 --tenant 执行此操作。 例如 az login --tenant contoso.onmicrosoft.com

创建资源组

使用 az group create 创建资源组。 资源组名称在订阅中必须全局唯一。 因此,请考虑将一些唯一标识符追加到创建的任何必须唯一的名称。 一种有用的方法是使用首字母缩写,后跟今天的日期(格式为 mmdd)。 此示例创建一个名为位置的eastus资源组abc1110rg

az group create \
    --name abc1110rg \
    --location eastus

创建虚拟网络

由 Red Hat JBoss EAP 群集组成的资源必须使用虚拟网络相互通信,以及公共 Internet。 有关规划虚拟网络的完整指南,请参阅 Azure 指南规划虚拟网络云采用框架。 有关详细信息,请参阅 Azure 虚拟网络常见问题

本部分中的示例创建具有地址空间 192.168.0.0/16 的虚拟网络,并创建用于 VM 的子网。

首先,使用 az network vnet create 创建虚拟网络。 以下示例创建一个名为 myVNet

az network vnet create \
    --resource-group abc1110rg \
    --name myVNet \
    --address-prefixes 192.168.0.0/24

使用 az network vnet subnet create 为 Red Hat JBoss EAP 群集创建子网。 以下示例创建名为 mySubnet 的子网:

az network vnet subnet create \
    --resource-group abc1110rg \
    --name mySubnet \
    --vnet-name myVNet \
    --address-prefixes 192.168.0.0/25

使用 az network vnet subnet create 为 应用程序网关 创建子网。 以下示例创建名为 jbossVMGatewaySubnet 的子网:

az network vnet subnet create \
    --resource-group abc1110rg \
    --name jbossVMGatewaySubnet \
    --vnet-name myVNet \
    --address-prefixes 192.168.0.128/25

创建网络安全组并向其分配子网

在使用公共 IP 创建 VM 之前,请创建网络安全组(NSG),以保护之前创建的虚拟网络和子网。

使用 az network nsg create 创建网络安全组。 以下示例创建名为 mynsg的网络安全组:

az network nsg create \
    --resource-group abc1110rg \
    --name mynsg

使用 az network nsg rule create 创建网络安全组规则。 以下示例创建名为 ALLOW_APPGW 的网络安全组规则。ALLOW_HTTP_ACCESS 这些规则允许应用网关接受 Red Hat JBoss EAP 使用的 HTTP 端口上的入站流量:

az network nsg rule create \
    --resource-group abc1110rg \
    --nsg-name mynsg \
    --name ALLOW_APPGW \
    --protocol Tcp \
    --destination-port-ranges 65200-65535 \
    --source-address-prefix GatewayManager \
    --destination-address-prefix '*' \
    --access Allow \
    --priority 500 \
    --direction Inbound

az network nsg rule create \
    --resource-group abc1110rg \
    --nsg-name mynsg \
    --name ALLOW_HTTP_ACCESS \
    --protocol Tcp \
    --destination-port-ranges 22 80 443 9990 8080 \
    --source-address-prefix Internet \
    --destination-address-prefix '*' \
    --access Allow \
    --priority 510 \
    --direction Inbound

使用 az network vnet subnet update 将之前创建的子网关联到此网络安全组,如以下示例所示:

az network vnet subnet update \
    --resource-group abc1110rg \
    --vnet-name myVNet \
    --name mySubnet \
    --network-security-group mynsg

az network vnet subnet update \
    --resource-group abc1110rg \
    --vnet-name myVNet \
    --name jbossVMGatewaySubnet \
    --network-security-group mynsg

为管理员创建 Red Hat Enterprise Linux 计算机

创建管理员 VM

用于创建 VM 的市场映像是 RedHat:rhel-raw:86-gen2:latest。 有关其他映像,请参阅 Azure 中提供的 Red Hat Enterprise Linux (RHEL) 映像。

注意

可以使用 az vm image list 命令查询 Red Hat 提供的所有可用 Red Hat Enterprise Linux 映像,例如: az vm image list --offer RHEL --publisher RedHat --output table --all 有关详细信息,请参阅 Red Hat Enterprise Linux 映像概述。

如果使用其他映像,可能需要安装额外的库才能启用本指南中使用的基础结构。

创建基本 VM,在它上安装所有必需的工具,获取其快照,然后基于快照创建副本 (replica)。

运行 az vm create 创建 VM。 在此 VM 上运行管理员服务器。

以下示例使用用于身份验证的用户名和密码对创建 Red Hat Enterprise Linux VM。 如果需要,可以改用 TLS/SSL 身份验证。

az vm create \
    --resource-group abc1110rg \
    --name adminVM \
    --image RedHat:rhel-raw:86-gen2:latest \
    --size Standard_DS1_v2  \
    --admin-username azureuser \
    --admin-password Secret123456 \
    --public-ip-sku Standard \
    --nsg mynsg \
    --vnet-name myVnet \
    --subnet mySubnet

安装 OpenJDK 11 和 Red Hat JBoss EAP 7.4

使用以下步骤进行安装:

  1. 使用以下命令获取公共 IP:adminVM

    export ADMIN_VM_PUBLIC_IP=$(az vm show \
        --resource-group abc1110rg \
        --name adminVM \
        --show-details \
        --query publicIps | tr -d '"')
    
  2. 使用以下命令打开终端并 SSH 连接到 adminVM 该终端:

    ssh azureuser@$ADMIN_VM_PUBLIC_IP
    
  3. 以密码的形式提供 Secret123456

  4. 使用以下命令为端口配置防火墙:

    sudo firewall-cmd --zone=public --add-port={9999/tcp,8443/tcp,8009/tcp,8080/tcp,9990/tcp,9993/tcp,45700/tcp,7600/tcp} --permanent
    sudo firewall-cmd --reload
    sudo iptables-save
    

    前两个命令后应会看到该单词 success 。 第三个命令后,应会看到类似于以下示例的输出:

    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *filter
    :INPUT ACCEPT [20:3546]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [24:5446]
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *security
    :INPUT ACCEPT [19:3506]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [5:492]
    -A OUTPUT -d 168.63.129.16/32 -p tcp -m tcp --dport 53 -j ACCEPT
    -A OUTPUT -d 168.63.129.16/32 -p tcp -m tcp --dport 53 -j ACCEPT
    -A OUTPUT -d 168.63.129.16/32 -p tcp -m owner --uid-owner 0 -j ACCEPT
    -A OUTPUT -d 168.63.129.16/32 -p tcp -m conntrack --ctstate INVALID,NEW -j DROP
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *raw
    :PREROUTING ACCEPT [20:3546]
    :OUTPUT ACCEPT [24:5446]
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *mangle
    :PREROUTING ACCEPT [20:3546]
    :INPUT ACCEPT [20:3546]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [24:5446]
    :POSTROUTING ACCEPT [24:5446]
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023
    *nat
    :PREROUTING ACCEPT [1:40]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [4:240]
    :OUTPUT ACCEPT [4:240]
    COMMIT
    # Completed on Wed Mar 29 22:39:23 2023
    
  5. 使用以下命令将管理员主机注册到 Red Hat 订阅管理(RHSM)帐户:

    export RHSM_USER=<your-rhsm-username>
    export RHSM_PASSWORD="<your-rhsm-password>"
    export EAP_POOL=<your-rhsm-pool-ID>
    
    sudo subscription-manager register --username ${RHSM_USER} --password ${RHSM_PASSWORD} --force
    

    应会看到与如下示例类似的输出:

    Registering to: subscription.rhsm.redhat.com:443/subscription
    The system has been registered with ID: redacted
    The registered system name is: adminVM
    
  6. 使用以下命令将管理员主机附加到 Red Hat JBoss EAP 池:

    sudo subscription-manager attach --pool=${EAP_POOL}
    

    注意

    如果使用 简单内容访问 模式,将忽略此命令。

  7. 使用以下命令安装 OpenJDK 11:

    sudo yum install java-11-openjdk -y
    

    应会看到许多输出行,以结尾 Complete!

  8. 使用以下命令安装 Red Hat JBoss EAP 7.4:

    sudo subscription-manager repos --enable=jb-eap-7.4-for-rhel-8-x86_64-rpms
    sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'
    sudo yum groupinstall -y jboss-eap7
    

    对于第二个和第三个命令,应会看到许多输出行,以结尾 Complete!

  9. 使用以下命令设置权限和 TCP 配置:

    sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
    echo 'AllowTcpForwarding no' | sudo tee -a /etc/ssh/sshd_config
    sudo systemctl restart sshd
    
  10. 使用以下命令配置环境变量:

    echo 'export EAP_RPM_CONF_DOMAIN="/etc/opt/rh/eap7/wildfly/eap7-domain.conf"' >> ~/.bash_profile
    echo 'export EAP_HOME="/opt/rh/eap7/root/usr/share"' >> ~/.bash_profile
    source ~/.bash_profile
    sudo touch /etc/profile.d/eap_env.sh
    echo 'export EAP_HOME="/opt/rh/eap7/root/usr/share"' | sudo tee -a /etc/profile.d/eap_env.sh
    
  11. 通过键入退出退出 SSH 连接。

为托管服务器创建计算机

已安装 OpenJDK 11 和 Red Hat JBoss EAP 7.4 adminVM,该版本作为域控制器服务器运行。 你仍然需要准备计算机来运行两台主机控制器服务器。 接下来,创建一个快照adminVM,并为两个托管的分机准备计算机,mspVM1以及mspVM2

本部分介绍使用 快照 adminVM准备计算机的方法。 返回到已登录 Azure CLI 的终端,然后使用以下步骤:

  1. 使用以下命令停止 adminVM

    az vm stop --resource-group abc1110rg --name adminVM
    
  2. 使用 az 快照 create 获取 OS 磁盘的快照adminVM,如以下示例所示:

    export ADMIN_OS_DISK_ID=$(az vm show \
        --resource-group abc1110rg \
        --name adminVM \
        --query storageProfile.osDisk.managedDisk.id \
        --output tsv)
    az snapshot create \
        --resource-group abc1110rg \
        --name myAdminOSDiskSnapshot \
        --source ${ADMIN_OS_DISK_ID}
    
  3. 使用以下命令启动 adminVM

    az vm start --resource-group abc1110rg --name adminVM
    
    
  4. 使用以下步骤创建 mspVM1

    1. 首先,使用 az disk create 创建托管磁盘mspVM1

      #Get the snapshot ID
      export SNAPSHOT_ID=$(az snapshot show \
          --name myAdminOSDiskSnapshot \
          --resource-group abc1110rg \
          --query '[id]' \
          --output tsv)
      
      #Create a new Managed Disks using the snapshot Id
      #Note that managed disk is created in the same location as the snapshot
      az disk create \
          --resource-group abc1110rg \
          --name mspVM1_OsDisk_1 \
          --source ${SNAPSHOT_ID}
      
    2. 接下来,使用以下命令创建 VM mspVM1并附加 OS 磁盘 mspVM1_OsDisk_1

      #Get the resource Id of the managed disk
      export MSPVM1_DISK_ID=$(az disk show \
          --name mspVM1_OsDisk_1 \
          --resource-group abc1110rg \
          --query '[id]' \
          --output tsv)
      
      #Create VM by attaching existing managed disks as OS
      az vm create \
          --resource-group abc1110rg \
          --name mspVM1 \
          --attach-os-disk ${MSPVM1_DISK_ID} \
          --os-type linux \
          --public-ip-sku Standard \
          --nsg mynsg \
          --vnet-name myVnet \
          --subnet mySubnet
      
    3. mspVM1已安装 OpenJDK 11 和 Red Hat JBoss EAP 7.4。 由于 VM 是从 OS 磁盘的快照adminVM创建的,因此这两个 VM 具有相同的主机名。 使用 az vm run-command 调用 将主机名更改为值 mspVM1

      az vm run-command invoke \
          --resource-group abc1110rg \
          --name mspVM1 \
          --command-id RunShellScript \
          --scripts "sudo hostnamectl set-hostname mspVM1"
      

      命令成功完成后,会看到类似于以下示例的输出:

      {
          "value": [
              {
              "code": "ProvisioningState/succeeded",
              "displayStatus": "Provisioning succeeded",
              "level": "Info",
              "message": "Enable succeeded: \n[stdout]\n\n[stderr]\n",
              "time": null
              }
          ]
      }
      
  5. 使用相同的命令创建 mspVM2

    #Create a new Managed Disks for mspVM2
    az disk create \
        --resource-group abc1110rg \
        --name mspVM2_OsDisk_1 \
        --source ${SNAPSHOT_ID}
    
    #Get the resource Id of the managed disk
    export MSPVM2_DISK_ID=$(az disk show \
        --name mspVM2_OsDisk_1 \
        --resource-group abc1110rg \
        --query '[id]' \
        --output tsv)
    
    #Create VM by attaching existing managed disks as OS
    az vm create \
        --resource-group abc1110rg \
        --name mspVM2 \
        --attach-os-disk ${MSPVM2_DISK_ID} \
        --os-type linux \
        --public-ip-sku Standard \
        --nsg mynsg \
        --vnet-name myVnet \
        --subnet mySubnet
    
    #Set hostname
    az vm run-command invoke \
        --resource-group abc1110rg \
        --name mspVM2 \
        --command-id RunShellScript \
        --scripts "sudo hostnamectl set-hostname mspVM2"
    

使用以下命令获取并显示专用 IP 地址,稍后部分将用到这些地址:

export ADMINVM_NIC_ID=$(az vm show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name adminVM \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export ADMINVM_IP=$(az network nic show \
    --ids ${ADMINVM_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)
export MSPVM1_NIC_ID=$(az vm show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name mspVM1 \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export MSPVM1_IP=$(az network nic show \
    --ids ${MSPVM1_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)
export MSPVM2_NIC_ID=$(az vm show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name mspVM2 \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export MSPVM2_IP=$(az network nic show \
    --ids ${MSPVM2_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)
echo "Private IP of adminVM: ${ADMINVM_IP}"
echo "Private IP of mspVM1: ${MSPVM1_IP}"
echo "Private IP of mspVM2: ${MSPVM2_IP}"

现在,所有三台计算机都已准备就绪。 接下来,在托管域模式下配置 Red Hat JBoss EAP 群集。

配置托管域和群集

配置启用了会话副本 (replica)的群集。 有关详细信息,请参阅 会话复制

若要启用会话副本 (replica),请使用群集的 Red Hat JBoss EAP 高可用性。 Microsoft Azure 不支持基于 UDP 多播的 JGroups 发现协议。 尽管可以使用其他 JGroups 发现协议(例如静态配置()、共享数据库(TCPPINGJDBC_PING)、基于共享文件系统的 ping(FILE_PINGTCPGOSSIP),但我们强烈建议使用专门为 Azure 开发的共享文件发现协议: AZURE_PING 有关详细信息,请参阅 在 Microsoft Azure 中使用 JBoss EAP 高可用性。

为 AZURE_PING 创建 Azure 存储帐户和 Blob 容器

使用以下命令创建存储帐户和 Blob 容器:

# Define your storage account name
export STORAGE_ACCOUNT_NAME=azurepingstgabc1110rg
# Define your Blob container name
export CONTAINER_NAME=azurepingcontainerabc1110rg

# Create storage account
az storage account create \
    --resource-group abc1110rg \
    --name ${STORAGE_ACCOUNT_NAME} \
    --location eastus \
    --sku Standard_LRS \
    --kind StorageV2 \
    --access-tier Hot

然后,使用以下命令检索存储帐户密钥供以后使用。 如果看到错误,请等待几分钟,然后重试。 此错误可能是由上一命令创建未完全完成的存储帐户引起的。

export STORAGE_ACCESS_KEY=$(az storage account keys list \
    --resource-group abc1110rg \
    --account-name ${STORAGE_ACCOUNT_NAME} \
    --query "[0].value" \
    --output tsv)

# Create blob container
az storage container create \
    --name ${CONTAINER_NAME} \
    --account-name ${STORAGE_ACCOUNT_NAME} \
    --account-key ${STORAGE_ACCESS_KEY}

应会看到以下输出:

{
  "created": true
}

配置域控制器(管理员节点)

本教程使用 Red Hat JBoss EAP 管理 CLI 命令配置域控制器。 有关详细信息,请参阅 管理 CLI 指南

以下步骤在上 adminVM设置域控制器配置。 使用 SSH 以用户身份azureuser连接到adminVM该用户。 回想一下,以前捕获到环境变量中的ADMIN_VM_PUBLIC_IP公共 IP 地址adminVM

ssh azureuser@$ADMIN_VM_PUBLIC_IP

首先,使用以下命令使用协议配置 HA 配置文件和 JGroups AZURE_PING

export HOST_VM_IP=$(hostname -I)
export STORAGE_ACCOUNT_NAME=azurepingstgabc1110rg
export CONTAINER_NAME=azurepingcontainerabc1110rg
export STORAGE_ACCESS_KEY=<the-value-from-before-you-connected-with-SSH>


#-Configure the HA profile and JGroups using AZURE_PING protocol
sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --echo-command \
'embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-master.xml',\
':write-attribute(name=name,value=domain1)',\
'/profile=ha/subsystem=jgroups/stack=tcp:remove',\
'/profile=ha/subsystem=jgroups/stack=tcp:add()',\
'/profile=ha/subsystem=jgroups/stack=tcp/transport=TCP:add(socket-binding=jgroups-tcp,properties={ip_mcast=false})',\
"/profile=ha/subsystem=jgroups/stack=tcp/protocol=azure.AZURE_PING:add(properties={storage_account_name=\"${STORAGE_ACCOUNT_NAME}\", storage_access_key=\"${STORAGE_ACCESS_KEY}\", container=\"${CONTAINER_NAME}\"})",\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MERGE3:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_SOCK:add(socket-binding=jgroups-tcp-fd)',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_ALL:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=VERIFY_SUSPECT:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.NAKACK2:add(properties={use_mcast_xmit=false,use_mcast_xmit_req=false})',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=UNICAST3:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.STABLE:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.GMS:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MFC:add',\
'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FRAG3:add',\
'/profile=ha/subsystem=jgroups/channel=ee:write-attribute(name="stack", value="tcp")',\
'/server-group=main-server-group:write-attribute(name="profile", value="ha")',\
'/server-group=main-server-group:write-attribute(name="socket-binding-group", value="ha-sockets")',\
"/host=master/subsystem=elytron/http-authentication-factory=management-http-authentication:write-attribute(name=mechanism-configurations,value=[{mechanism-name=DIGEST,mechanism-realm-configurations=[{realm-name=ManagementRealm}]}])",\
"/host=master/interface=unsecure:add(inet-address=${HOST_VM_IP})",\
"/host=master/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})",\
"/host=master/interface=public:add(inet-address=${HOST_VM_IP})"

# Save a copy of the domain.xml, later you need to share it with all host controllers
cp $EAP_HOME/wildfly/domain/configuration/domain.xml /tmp/domain.xml

输出的最后一个部分应类似于以下示例。 如果没有,请在继续操作之前进行故障排除并解决问题。

[domain@embedded /] /host=master/interface=public:add(inet-address=192.168.0.4 )
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined,
    "response-headers" => {"process-state" => "reload-required"}
}
02:05:55,019 INFO  [org.jboss.as] (MSC service thread 1-1) WFLYSRV0050: JBoss EAP 7.4.10.GA (WildFly Core 15.0.25.Final-redhat-00001) stopped in 28ms

然后,使用以下命令配置 JBoss 服务器并设置 EAP 服务:

# Configure the JBoss server and setup EAP service
echo 'WILDFLY_HOST_CONFIG=host-master.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN

# Configure JBoss EAP management user
export JBOSS_EAP_USER=jbossadmin
export JBOSS_EAP_PASSWORD=Secret123456
sudo $EAP_HOME/wildfly/bin/add-user.sh  -u $JBOSS_EAP_USER -p $JBOSS_EAP_PASSWORD -g 'guest,mgmtgroup'

输出应类似于以下示例:

Added user 'jbossadmin' to file '/etc/opt/rh/eap7/wildfly/standalone/mgmt-users.properties'
Added user 'jbossadmin' to file '/etc/opt/rh/eap7/wildfly/domain/mgmt-users.properties'
Added user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap7/wildfly/standalone/mgmt-groups.properties'
Added user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap7/wildfly/domain/mgmt-groups.properties'

最后,使用以下命令启动 EAP 服务:

# Start the JBoss server and setup EAP service
sudo systemctl enable eap7-domain.service

# Edit eap7-domain.services
sudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap7-domain.service
sudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \nBefore=httpd.service/' /usr/lib/systemd/system/eap7-domain.service

# Reload and restart EAP service
sudo systemctl daemon-reload
sudo systemctl restart eap7-domain.service

# Check the status of EAP service
systemctl status eap7-domain.service

输出应类似于以下示例:

● eap7-domain.service - JBoss EAP (domain mode)
   Loaded: loaded (/usr/lib/systemd/system/eap7-domain.service; enabled; vendor>
   Active: active (running) since Thu 2023-03-30 02:11:44 UTC; 5s ago
 Main PID: 3855 (scl)
    Tasks: 82 (limit: 20612)
   Memory: 232.4M
   CGroup: /system.slice/eap7-domain.service
           ├─3855 /usr/bin/scl enable eap7 -- /opt/rh/eap7/root/usr/share/wildf>
           ├─3856 /bin/bash /var/tmp/sclfYu7yW
           ├─3858 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/launch.sh /us>
           ├─3862 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/domain.sh --h>
           ├─3955 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>
           └─3967 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>

Mar 30 02:11:44 adminVM systemd[1]: Started JBoss EAP (domain mode).

键入 q 退出寻呼程序。 通过键入退出退出 SSH 连接。

启动 Red Hat JBoss EAP 服务后,可以通过 Web 浏览器中访问管理控制台http://$ADMIN_VM_PUBLIC_IP:9990。 使用配置的用户名和密码jbossadminSecret123456登录。

Red Hat JBoss Enterprise Application Platform 域控制器管理控制台的屏幕截图。

选择“运行时”选项卡。在导航窗格中,选择“拓扑”。 此时,群集应仅包含一个域控制器:

Red Hat JBoss Enterprise Application Platform 的屏幕截图,其中显示了“运行时”选项卡和“仅包含域控制器的拓扑”窗格。

配置主机控制器(工作器节点)

使用 SSH 作为用户进行mspVM1azureuser连接。 使用以下命令获取 VM 的公共 IP 地址:

MSPVM_PUBLIC_IP=$(az vm show \
    --resource-group abc1110rg \
    --name mspVM1 \
    --show-details \
    --query publicIps)

ssh azureuser@$MSPVM_PUBLIC_IP

请记住密码与以前相同,因为 mspVM1 只是克隆密码 adminVM

使用以下命令设置主机控制器 mspVM1

# environment variables
export DOMAIN_CONTROLLER_PRIVATE_IP=<adminVM-private-IP>
export HOST_VM_NAME=$(hostname)
export HOST_VM_NAME_LOWERCASE=$(echo "${HOST_VM_NAME,,}")
export HOST_VM_IP=$(hostname -I)

export JBOSS_EAP_USER=jbossadmin
export JBOSS_EAP_PASSWORD=Secret123456

# Save default domain configuration as backup
sudo -u jboss mv $EAP_HOME/wildfly/domain/configuration/domain.xml $EAP_HOME/wildfly/domain/configuration/domain.xml.backup

# Fetch domain.xml from domain controller
sudo -u jboss scp azureuser@${DOMAIN_CONTROLLER_PRIVATE_IP}:/tmp/domain.xml $EAP_HOME/wildfly/domain/configuration/domain.xml

系统要求你输入连接的密码。 对于此示例,密码为 Secret123456

使用以下命令将主机控制器更改应用到 mspVM1

# Setup host controller
sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --echo-command \
"embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-slave.xml",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-one:remove",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-two:remove",\
"/host=${HOST_VM_NAME_LOWERCASE}/server-config=${HOST_VM_NAME_LOWERCASE}-server0:add(group=main-server-group)",\
"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-configuration=slave:add(authentication-name=${JBOSS_EAP_USER}, credential-reference={clear-text=${JBOSS_EAP_PASSWORD}})",\
"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-context=slave-context:add(match-rules=[{authentication-configuration=slave}])",\
"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote.username, value=${JBOSS_EAP_USER})",\
"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote, value={host=${DOMAIN_CONTROLLER_PRIVATE_IP}, port=9990, protocol=remote+http, authentication-context=slave-context})",\
"/host=${HOST_VM_NAME_LOWERCASE}/core-service=discovery-options/static-discovery=primary:write-attribute(name=host, value=${DOMAIN_CONTROLLER_PRIVATE_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=unsecured:add(inet-address=${HOST_VM_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})",\
"/host=${HOST_VM_NAME_LOWERCASE}/interface=public:write-attribute(name=inet-address, value=${HOST_VM_IP})"

输出的最后一个部分应类似于以下示例。 如果没有,请在继续操作之前进行故障排除并解决问题。

[domain@embedded /] /host=mspvm1/interface=public:write-attribute(name=inet-address, value=192.168.0.5 )
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => undefined,
    "response-headers" => {"process-state" => "reload-required"}
}
02:58:59,388 INFO  [org.jboss.as] (MSC service thread 1-2) WFLYSRV0050: JBoss EAP 7.4.10.GA (WildFly Core 15.0.25.Final-redhat-00001) stopped in 58ms

然后,使用以下命令配置 JBoss 服务器并设置 EAP 服务:

echo 'WILDFLY_HOST_CONFIG=host-slave.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN

# Enable the JBoss server and setup EAP service
sudo systemctl enable eap7-domain.service

# Edit eap7-domain.services
sudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap7-domain.service
sudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \nBefore=httpd.service/' /usr/lib/systemd/system/eap7-domain.service

# Reload and restart EAP service
sudo systemctl daemon-reload
sudo systemctl restart eap7-domain.service

# Check the status of EAP service
systemctl status eap7-domain.service

输出应类似于以下示例:

● eap7-domain.service - JBoss EAP (domain mode)
   Loaded: loaded (/usr/lib/systemd/system/eap7-domain.service; enabled; vendor>
   Active: active (running) since Thu 2023-03-30 03:02:15 UTC; 7s ago
 Main PID: 9699 (scl)
    Tasks: 51 (limit: 20612)
   Memory: 267.6M
   CGroup: /system.slice/eap7-domain.service
           ├─9699 /usr/bin/scl enable eap7 -- /opt/rh/eap7/root/usr/share/wildf>
           ├─9700 /bin/bash /var/tmp/sclgJ1hRD
           ├─9702 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/launch.sh /us>
           ├─9706 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/domain.sh --h>
           ├─9799 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>
           └─9811 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>

Mar 30 03:02:15 mspVM1 systemd[1]: Started JBoss EAP (domain mode).

键入 q 退出寻呼程序。 通过键入退出退出 SSH 连接。

使用 SSH 作为用户进行mspVM2azureuser连接。 使用以下命令获取 VM 的公共 IP 地址:

az vm show \
    --resource-group abc1110rg \
    --name mspVM2 \
    --show-details \
    --query publicIps

重复上述步骤 mspVM2,然后通过键入 退出退出退出来退出 SSH 连接。

连接到 adminVM两个主机控制器后,应能够看到群集拓扑,如以下屏幕截图所示:

Red Hat JBoss Enterprise Application Platform 的屏幕截图,其中显示了“运行时”选项卡和包含所有主机的“拓扑”窗格。

使用 Azure 应用程序网关 公开 Red Hat JBoss EAP 群集

在 Azure 虚拟机上创建了 Red Hat JBoss EAP 群集后,本部分将引导你完成使用 Azure 应用程序网关 向 Internet 公开 Red Hat JBoss EAP 的过程。

创建 Azure 应用程序网关

若要向 Internet 公开 Red Hat JBoss EAP,需要公共 IP 地址。 创建公共 IP 地址,然后将Azure 应用程序网关与其相关联。 使用 az network public-ip create 创建它,如以下示例所示:

az network public-ip create \
    --resource-group abc1110rg \
    --name myAGPublicIPAddress \
    --allocation-method Static \
    --sku Standard

接下来,将后端服务器添加到应用程序网关后端池。 使用以下命令查询后端 IP 地址。 只有主机控制器(工作节点)配置为后端服务器。

export MSPVM1_NIC_ID=$(az vm show \
    --resource-group abc1110rg \
    --name mspVM1 \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export MSPVM1_IP=$(az network nic show \
    --ids ${MSPVM1_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)
export MSPVM2_NIC_ID=$(az vm show \
    --resource-group abc1110rg \
    --name mspVM2 \
    --query networkProfile.networkInterfaces'[0]'.id \
    --output tsv)
export MSPVM2_IP=$(az network nic show \
    --ids ${MSPVM2_NIC_ID} \
    --query ipConfigurations'[0]'.privateIPAddress \
    --output tsv)

接下来,创建Azure 应用程序网关。 以下示例在默认后端池中创建具有主机控制器的应用程序网关:

az network application-gateway create \
    --resource-group abc1110rg \
    --name myAppGateway \
    --public-ip-address myAGPublicIPAddress \
    --location eastus \
    --capacity 2 \
    --http-settings-port 8080 \
    --http-settings-protocol Http \
    --frontend-port 80 \
    --sku Standard_V2 \
    --subnet jbossVMGatewaySubnet \
    --vnet-name myVNet \
    --priority 1001 \
    --servers ${MSPVM1_IP} ${MSPVM2_IP}

注意

此示例使用 HTTP 设置对 Red Hat JBoss EAP 服务器的简单访问。 如果想要安全访问,请按照“端到端 TLS”中的说明配置 TLS/SSL 终止,并应用程序网关

此示例公开端口 8080 上的主机控制器。 在后续步骤中,你将使用数据库连接到群集部署示例应用程序。

连接 Azure Database for PostgreSQL

本部分介绍如何在 Azure 上创建 PostgreSQL 实例,以及如何在 Red Hat JBoss EAP 群集上配置与 PostgreSQL 的连接。

创建 Azure Database for PostgreSQL 实例

使用以下步骤创建数据库实例:

  1. 使用 az postgres server create 在 Azure 上预配 PostgreSQL 实例,如以下示例所示:

    export DATA_BASE_USER=jboss
    export DATA_BASE_PASSWORD=Secret123456
    
    DB_SERVER_NAME="jbossdb$(date +%s)"
    echo "DB_SERVER_NAME=${DB_SERVER_NAME}"
    az postgres server create \
        --resource-group abc1110rg \
        --name ${DB_SERVER_NAME}  \
        --location eastus \
        --admin-user ${DATA_BASE_USER} \
        --ssl-enforcement Enabled \
        --admin-password ${DATA_BASE_PASSWORD} \
        --sku-name GP_Gen5_2
    
  2. 使用以下命令允许从 Azure 服务进行访问:

    # Save aside the following names for later use
    export fullyQualifiedDomainName=$(az postgres server show \
        --resource-group abc1110rg \
        --name ${DB_SERVER_NAME} \
        --query "fullyQualifiedDomainName" \
        --output tsv)
    export name=$(az postgres server show \
        --resource-group abc1110rg \
        --name ${DB_SERVER_NAME} \
        --query "name" \
        --output tsv)
    
    az postgres server firewall-rule create \
        --resource-group abc1110rg \
        --server ${DB_SERVER_NAME} \
        --name "AllowAllAzureIps" \
        --start-ip-address 0.0.0.0 \
        --end-ip-address 0.0.0.0
    
  3. 使用以下命令创建数据库:

    az postgres db create \
        --resource-group abc1110rg \
        --server ${DB_SERVER_NAME} \
        --name testdb
    

安装驱动程序

使用以下步骤通过 JBoss 管理 CLI 安装 JDBC 驱动程序。 有关 Red Hat JBoss EAP 上的 JDBC 驱动程序的详细信息,请参阅 安装 JDBC 驱动程序作为 JAR 部署

  1. 使用以下命令通过 SSH 连接到 adminVM 。 如果已打开连接,则可以跳过此步骤。

    ssh azureuser@$ADMIN_VM_PUBLIC_IP
    
  2. 使用以下命令下载 JDBC 驱动程序。 此处使用 postgresql-42.5.2.jar。 有关 JDBC 驱动程序下载位置的详细信息,请参阅 Red Hat 提供的 JDBC 驱动程序下载位置

    jdbcDriverName=postgresql-42.5.2.jar
    sudo curl --retry 5 -Lo /tmp/${jdbcDriverName} https://jdbc.postgresql.org/download/${jdbcDriverName}
    
  3. 使用以下 JBoss CLI 命令部署 JDBC 驱动程序:

    sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --connect --controller=$(hostname -I) --echo-command \
    "deploy /tmp/${jdbcDriverName} --server-groups=main-server-group"
    

    服务器日志位于和mspVM1mspVM2位置/var/opt/rh/eap7/lib/wildfly/domain/servers/mspvm1-server0/log/server.log。 如果部署失败,请检查此日志文件并解决问题,然后再继续。

配置 Red Hat JBoss EAP 群集的数据库连接

你已启动数据库服务器,获取了所需的资源 ID,并安装了 JDBC 驱动程序。 接下来,本部分中的步骤说明如何使用 JBoss CLI 配置与之前创建的 PostgreSQL 实例的数据源连接。

  1. 使用以下命令打开终端并通过 SSH 连接到 adminVM

    ssh azureuser@$ADMIN_VM_PUBLIC_IP
    
  2. 使用以下命令创建数据源:

    # Replace the following values with your own
    export DATA_SOURCE_CONNECTION_STRING=jdbc:postgresql://<database-fully-qualified-domain-name>:5432/testdb
    export DATA_BASE_USER=jboss@<database-server-name>
    export JDBC_DATA_SOURCE_NAME=dataSource-postgresql
    export JDBC_JNDI_NAME=java:jboss/datasources/JavaEECafeDB
    export DATA_BASE_PASSWORD=Secret123456
    export JDBC_DRIVER_NAME=postgresql-42.5.2.jar
    
    sudo -u jboss $EAP_HOME/wildfly/bin/jboss-cli.sh --connect --controller=$(hostname -I) --echo-command \
    "data-source add --driver-name=${JDBC_DRIVER_NAME} --profile=ha --name=${JDBC_DATA_SOURCE_NAME} --jndi-name=${JDBC_JNDI_NAME} --connection-url=${DATA_SOURCE_CONNECTION_STRING} --user-name=${DATA_BASE_USER} --password=${DATA_BASE_PASSWORD}"
    

执行这些步骤后,已成功配置名为 的 java:jboss/datasources/JavaEECafeDB数据源。

部署 Java 企业版 Cafe 示例应用程序

使用以下步骤将 Java 企业版 Cafe 示例应用程序部署到 Red Hat JBoss EAP 群集:

  1. 使用以下步骤生成 Java 企业版 Cafe。 以下步骤假定你安装了 Git 和 Maven 的本地环境:

    1. 使用以下命令从 GitHub 克隆源代码:

      git clone https://github.com/Azure/rhel-jboss-templates.git
      
    2. 使用以下命令生成源代码:

      mvn clean install --file rhel-jboss-templates/eap-coffee-app/pom.xml
      

      此命令创建文件 eap-coffee-app/target/javaee-café.war。 在下一步中上传此文件。

  2. 打开 Web 浏览器,转到管理控制台,http://<adminVM-public-IP>:9990然后使用用户名和密码jbossadminSecret123456登录。

  3. 使用以下步骤将 javaee-café.war 上传到 内容存储库

    1. 在 Red Hat JBoss EAP 管理控制台的“部署”选项卡中,选择导航窗格中的内容存储库

    2. 选择“ 添加 ”按钮,然后选择“ 上传内容”。

      Red Hat JBoss Enterprise Application Platform Deployments 选项卡的屏幕截图,其中突出显示了“上传内容”菜单选项。

    3. 使用浏览器文件选择器选择 javaee-café.war 文件。

    4. 选择下一步

    5. 接受下一个屏幕上的默认值,然后选择“ 完成”。

    6. 选择“ 查看内容”。

  4. 使用以下步骤将应用程序部署到 main-server-group

    1. 内容存储库中,选择 javaee-café.war

    2. 在下拉菜单中,选择“ 部署”。

    3. 选择 main-server-group 为部署 javaee-café.war 的服务器组。

    4. 选择“部署”以启动部署。 应会看到类似于以下屏幕截图的通知:

      成功部署通知的屏幕截图。

测试 Red Hat JBoss EAP 群集配置

现已完成 Red Hat JBoss EAP 群集的配置,并将 Java 企业版 应用程序部署到该群集。 使用以下步骤访问应用程序以验证所有设置:

  1. 使用以下命令获取Azure 应用程序网关的公共 IP 地址:

    az network public-ip show \
        --resource-group abc1110rg \
        --name myAGPublicIPAddress \
        --query '[ipAddress]' \
        --output tsv
    
  2. 打开 Web 浏览器。

  3. 使用 URL http://<gateway-public-ip-address>/javaee-cafe/导航到应用程序。 不要忘记尾部斜杠。

  4. 尝试添加和删除咖啡。

清理资源

若要避免 Azure 费用,应清除不需要的资源。 如果不再需要在 Azure VM 上部署的 Red Hat JBoss EAP 群集,请注销 Red Hat JBoss EAP 服务器并删除 Azure 资源。

使用以下命令从 Red Hat 订阅管理中注销 Red Hat JBoss EAP 服务器和 VM:

# Unregister domain controller
az vm run-command invoke \
    --resource-group abc1110rg \
    --name adminVM \
    --command-id RunShellScript \
    --scripts "sudo subscription-manager unregister"

# Unregister host controllers
az vm run-command invoke \
    --resource-group abc1110rg \
    --name mspVM1 \
    --command-id RunShellScript \
    --scripts "sudo subscription-manager unregister"
az vm run-command invoke \
    --resource-group abc1110rg \
    --name mspVM2 \
    --command-id RunShellScript \
    --scripts "sudo subscription-manager unregister"

使用以下命令删除资源组 abc1110rg

az group delete --name abc1110rg --yes --no-wait

后续步骤

继续探索在 Azure 上运行 Red Hat JBoss EAP 的选项。