Share via


教學課程:手動在 Azure 虛擬機器 上安裝 Red Hat JBoss EAP

本教學課程說明在 Red Hat Enterprise Linux 上安裝 Red Hat JBoss EAP 並在 Azure 虛擬機器 (VM)上設定叢集的步驟。

在本教學課程中,您將瞭解如何執行下列工作:

  • 建立自定義虛擬網路,並在網路中建立 VM。
  • 手動使用命令行在 VM 上安裝所需的 JDK 和 Red Hat JBoss EAP。
  • 使用命令行介面 (CLI) 在網域模式中設定 Red Hat JBoss EAP 叢集。
  • 在叢集中設定 PostgreSQL 數據源連線。
  • 在叢集中部署和執行範例 Java EE 應用程式。
  • 透過 Azure 應用程式閘道 將應用程式公開至公用因特網。
  • 驗證成功的設定。

如果您偏好使用完全自動化的解決方案,代表 GNU/Linux VM 執行上述所有步驟,請直接從 Azure 入口網站,請參閱快速入門:使用 Azure 入口網站 在 Azure 虛擬機上部署 JBoss EAP Server。

注意

本文包含「從屬」一詞的參考,Microsoft 已不再使用該字詞。 從軟體中移除該字詞時,我們也會將其從本文中移除。

必要條件

  • 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

  • 安裝 Azure CLI 2.51.0 版 或更高版本以執行 Azure CLI 命令。

    • 出現提示時,請在第一次使用時安裝 Azure CLI 擴充功能。 如需延伸模組詳細資訊,請參閱使用 Azure CLI 延伸模組
    • 執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade
  • 請確定您擁有必要的 Red Hat 授權。 您必須具備 Red Hat 訂用帳戶管理 (RHSM) Red Hat JBoss EAP 的 Red Hat 帳戶。 此權利可讓先前所述的完全自動化解決方案(使用 Azure 入口網站Azure 虛擬機上部署 JBoss EAP 伺服器中),以安裝經過測試和認證的 JBoss EAP 版本。

    注意

    如果您沒有 EAP 權利,您可以透過個人版 Red Hat 開發人員訂用帳戶註冊免費的開發人員訂用帳戶。 將帳戶詳細數據儲存在一邊,在下一節中做為 RHSM 用戶名稱和RHSM 密碼

  • 如果您已註冊,或在完成註冊之後,您可以使用下列步驟找出必要的認證(集區標識符)。 這些 集區標識碼 也會作為後續步驟中的 RHSM 集區標識碼與 EAP 權利

    1. 登入您的 Red Hat 帳戶

    2. 第一次登入時,系統會提示您完成配置檔。 根據您的使用量,選取 [個人 ] 或 [公司 帳戶 類型],如下列螢幕快照所示:

      Red Hat 帳戶視窗的螢幕快照,其中顯示已選取 [個人] 的 [帳戶類型] 選項。

    3. 開啟 個人版的 Red Hat 開發人員訂用帳戶。 此連結會帶您前往帳戶中適用於適當 SKU 的所有訂用帳戶。

    4. 在 [所有已購買的訂閱] 數據表底下的控件數據列中,選取 [作用中]。 這可確保只會顯示作用中的訂用帳戶。

    5. 選取 [結束日期] 的可排序數據行標頭,直到未來最遠的值顯示為第一個數據列為止。

    6. 選取第一個數據列。 然後,從集區標識符複製並儲存下列主要集區的值。

  • Java JDK 版本 11。 在本指南中,我們建議 使用 Red Hat Build of OpenJDK。 請確定您已在命令執行所在的殼層中正確設定 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 叢集的資源必須使用虛擬網路彼此通訊,以及公用因特網。 如需規劃虛擬網路的完整指南,請參閱 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_APPGWALLOW_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 的 Marketplace 映像為 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、在上面安裝所有必要的工具、建立快照集,然後根據快照集建立複本。

使用 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. 使用下列指令取得 的 adminVM公用IP:

    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. 輸入 exit 以結束 SSH 連線。

建立受管理伺服器的機器

您已在 上安裝 adminVMOpenJDK 11 和 Red Hat JBoss EAP 7.4,其會以域控制器伺服器的形式執行。 您仍然需要準備機器以執行兩部主機控制器伺服器。 接下來,您會建立的 adminVM 快照集,併為兩個受控分機 mspVM1mspVM2準備機器。

本節介紹使用 快照 adminVM集準備機器的方法。 返回已登入 Azure CLI 的終端機,然後使用下列步驟:

  1. 使用下列命令來停止 adminVM

    az vm stop --resource-group abc1110rg --name adminVM
    
  2. 使用 az snapshot 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. 您已使用已安裝 OpenJDK 11 和 Red Hat JBoss EAP 7.4 來建立 mspVM1 。 由於 VM 是從 OS 磁碟的 adminVM 快照集建立,因此這兩個 VM 具有相同的主機名。 使用 az vm run-command invoke 將主機名變更為 值 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 叢集。

設定受控網域和叢集

設定已啟用會話復寫的叢集。 如需詳細資訊,請參閱 會話複寫

若要啟用會話複寫,請使用叢集的 Red Hat JBoss EAP 高可用性。 Microsoft Azure 不支援以 UDP 多播為基礎的 JGroups 探索通訊協定。 雖然您可以使用其他 JGroups 探索通訊協定(例如靜態組態)、共用資料庫 (TCPPINGJDBC_PING)、共用文件系統型 Ping (FILE_PING), 或 TCPGOSSIP),但強烈建議您使用專為 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 。 回想一下,先前已將的 adminVM 公用IP位址擷取到 ADMIN_VM_PUBLIC_IP 環境變數中。

ssh azureuser@$ADMIN_VM_PUBLIC_IP

首先,使用下列命令來使用 AZURE_PING 通訊協議來設定HA設定檔和 JGroups:

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 以結束呼叫器。 輸入 exit 以結束 SSH 連線。

啟動 Red Hat JBoss EAP 服務之後,您可以在網頁瀏覽器中透過 http://$ADMIN_VM_PUBLIC_IP:9990 存取管理主控台。 使用已設定的使用者 jbossadmin 名稱和密碼 Secret123456登入。

Red Hat JBoss Enterprise Application Platform 域控制器管理控制台的螢幕快照。

選取 [運行時間] 索引標籤。在瀏覽窗格中,選取 [拓撲]。 您現在應該會看到叢集只包含一個域控制器:

Red Hat JBoss 企業應用程式平台的螢幕快照,其中僅顯示 [運行時間] 索引卷標和 [拓撲] 窗格與域控制器。

設定主機控制器 (背景工作節點)

使用 SSH 以使用者身azureuser分連線至 mspVM1 。 使用下列指令取得 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 以結束呼叫器。 輸入 exit 以結束 SSH 連線。

使用 SSH 以使用者身azureuser分連線至 mspVM2 。 使用下列指令取得 VM 的公用 IP 位址:

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

在上 mspVM2重複上述步驟,然後輸入 exit以結束 SSH 連線。

線上到 adminVM兩個主機控制器之後,您應該可以看到叢集拓撲,如下列螢幕快照所示:

Red Hat JBoss 企業應用程式平台的螢幕快照,其中顯示 [運行時間] 索引卷標和具有所有主機的 [拓撲] 窗格。

使用 Azure 應用程式閘道 公開 Red Hat JBoss EAP 叢集

既然您已在 Azure 虛擬機上建立 Red Hat JBoss EAP 叢集,本節將逐步引導您完成使用 Azure 應用程式閘道 將 Red Hat JBoss EAP 公開至因特網的程式。

建立 Azure 應用程式閘道

若要將 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 公開主機控制器。 您可以在後續步驟中,使用資料庫連線至叢集部署範例應用程式。

連線 適用於 PostgreSQL 的 Azure 資料庫

本節說明如何在 Azure 上建立 PostgreSQL 實例,並在您的 Red Hat JBoss EAP 叢集上設定 PostgreSQL 的連線。

建立 適用於 PostgreSQL 的 Azure 資料庫 實例

使用下列步驟來建立資料庫實例:

  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"
    

    伺服器記錄位於和 mspVM2mspVM1/var/opt/rh/eap7/lib/wildfly/domain/servers/mspvm1-server0/log/server.log。 如果部署失敗,請檢查此記錄檔並解決問題,然後再繼續。

設定 Red Hat JBoss EAP 叢集的資料庫連線

您已啟動資料庫伺服器、取得必要的資源識別碼,並安裝 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 EE Cafe 範例應用程式

使用下列步驟將 Java EE Cafe 範例應用程式部署至 Red Hat JBoss EAP 叢集:

  1. 使用下列步驟來建置 Java EE 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. 開啟網頁瀏覽器,然後移至的 http://<adminVM-public-IP>:9990管理主控台,然後使用使用者 jbossadmin 名稱和密碼 Secret123456登入。

  3. 使用下列步驟將javaee-café.war 上傳內容存放庫

    1. 從 Red Hat JBoss EAP 管理控制台的 [部署] 索引卷標中,選取瀏覽窗格中的內容存放庫

    2. 選取 [ 新增] 按鈕,然後選取 [ 上傳內容]。

      Red Hat JBoss 企業應用程式平臺部署索引標籤的螢幕快照,其中已醒目提示 [上傳內容] 功能表選項。

    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 EE 應用程式部署至該叢集。 使用下列步驟來存取應用程式,以驗證所有設定:

  1. 使用下列命令來取得 Azure 應用程式閘道 的公用 IP 位址:

    az network public-ip show \
        --resource-group abc1110rg \
        --name myAGPublicIPAddress \
        --query '[ipAddress]' \
        --output tsv
    
  2. 開啟網頁瀏覽器。

  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 的選項。