EAP7のインストールとパッチ適用

仕事でredhat社のEnterprise Application Server7(EAP7)を扱うことが多いので備忘録として記載します。

なお、このサイトでWebアプリを公開したいと考えていますが、EAP7は実運用環境で使うためにはライセンス購入が必要になると思うのでWildflyを使おうと思います。
Red Hat Developer Program Benefits

概要

現時点で最新版であるEAP7.1.3を構築するまでの手順を記載する。
大枠の手順として、まずEAP7.1.0をインストールし、7.1.1/7.1.2/7.1.3パッチを適用していく。
構築するEAP7サーバの設定方針は次の通り。

  • EAP7.1.0のインストール方法としてインストーラを使う方法と、zipファイルを解凍する方法がある。サーバ構築で意図しない設定がされる可能性があるので、自身で設定を行うzip版を使う。
  • EAP7を実行するためにJDKが必要である。Oracle JDKまたはOpen JDKを選択できるが、ここではOpen JDK(1.8)を使用する。
  • インストール先ディレクトリは、次の理由で/opt/jboss-eap-7.1とする。
    • Filesystem Hierarchy Standardではアプリのインストール先は/opt。RPM版の既定のインストール先は/opt/rh/eap7/root/usr/share/wildfly/であることもあり、/opt配下に配置するものとする。
    • インストーラではEAP-7.1.0という名前でインストールするようだが、zip版を解凍した際に作成されるjboss-eap-7.1の方が分かりやすい。あと、パッチを適用すると実際のバージョンは7.1.1, 7.1.2等のようになるので、7.1.0というディレクトリだと誤解を招くので、jboss-eap-7.1が良い。
    • /opt/rh/eap7/root/usr/share/wildfly/だとちょと長い…上記を踏まえ切りよく、/opt/jboss-eap-7.1とする。
  • EAP7では複数のインスタンスを纏めて管理するためのdomainモードと、インスタンス毎の管理となるstandaloneモードがある。今回はdomainモードの必要性がないのでstandaloneモードを使用する。
  • EAP7への侵入時のリスクを低減するために、サービス実行用の一般ユーザ(jboss)を使用する。
  • EAP7の関連のファイルは可能な限り/opt/jboss-eap-7.1に纏める。設定ファイルは、”/etc/default/jboss-eap.conf”ではなく、”/opt/jboss-eap-7.1/bin/init.d/jboss-eap.conf”とする。

手順を実施する上での前提条件は次の通り。

  1. 手順の検証はCentOS7で行った。
  2. 後述のファイルダウンロードや資料参照のために、Redhatアカウント(少なくともRed Hat Developer Program, Red Hat Customer Portal, OpenShift Online等のいずれか)の登録が必要である。
  3. 7.1.1/7.1.2/7.1.3パッチは一般には公開されておらず、カスタマーポータルでEAP7のサブスクリプションを登録したユーザがダウンロードできる。今回は、評価版のEAP7のサブスクリプションを使ってパッチをダウンロードした。なお、評価版の期限は90日であるが、90日を過ぎてもカスタマーポータルから参照できなくなるだけで、実働に影響はない。

その他、参考にした情報は次の通り。

構築手順

パッケージとパッチのダウンロード

EAP7本体のダウンロード:
redhat developerのページからダウンロードします。

  1. redhat developerページを開く。
    Red Hat Developer

    An application platform for hosting your apps that provides …

  2. “Zip File”(右下)のリンクをクリックするとダウンロードが開始される。
    (Redhatアカウントでログインしていないとログイン画面が表示されるのでログインしてください。)

EAP7のパッチのダウンロード:
redhatのカスタマーポータルからダウンロードします。
パッチはEAP7のサブスクリプション(使用権)を登録した人しかダウンロードできません。
購入した人しか利用できないようにも思えますが、実際には評価版の申請者も利用できるので、ここでは後者の方法でダウンロードします。

  1. カスタマーポータルページを開く。
    Red Hat Customer Portal

    Access Red Hat’s knowledge, guidance, and support through yo…

  2. 画面下の”Downloads”をクリックする。
  3. JBOSS DEVELOPMENT AND MANAGEMENT欄の”Red Hat JBoss Enterprise Application Platform”行の”Request an Evaluation”をクリックする。
  4. 評価版の説明ページが開くので”Continue”をクリックする。
    (Redhatアカウントでログインしていないとログイン画面が表示されるのでログインしてください。)
  5. ダウンロードページが開くので、”Patches”をクリックし、Update 03, 02, 01をダウンロードする。

前提ソフトウェアのインストール

前提となるソフトウェアはインストールガイドの”JBoss EAP Installation Prerequisites”を参照のこと。本来であれば詳細な条件の確認は必要だが、実行に必要なソフトウェアとしては、Java JDKのみ。
yumでopenjdk, openjdk-develをインストールします。
OracleのJDKは、javac等の開発ツールと実行環境(jre)を含んでいるが、openjdkはjreしか含んでいないので、追加でopenjdk-develをインストールします。
もしunzipコマンドがない場合は同様にyum install unzipします。

# yum install java-1.8.0-openjdk
...
# yum install java-1.8.0-openjdk-devel
...
# yum install zip
...
# java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
# java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
# ls -l /usr/lib/jvm
合計 0
lrwxrwxrwx. 1 root root 26  7月 15 18:20 java -> /etc/alternatives/java_sdk
lrwxrwxrwx. 1 root root 32  7月 15 18:20 java-1.8.0 -> /etc/alternatives/java_sdk_1.8.0
lrwxrwxrwx. 1 root root 40  7月 15 18:20 java-1.8.0-openjdk -> /etc/alternatives/java_sdk_1.8.0_openjdk
drwxr-xr-x. 7 root root 68  7月 15 18:20 java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64
lrwxrwxrwx. 1 root root 34  7月 15 18:20 java-openjdk -> /etc/alternatives/java_sdk_openjdk
lrwxrwxrwx. 1 root root 21  7月 15 15:14 jre -> /etc/alternatives/jre
lrwxrwxrwx. 1 root root 27  7月 15 15:14 jre-1.8.0 -> /etc/alternatives/jre_1.8.0
lrwxrwxrwx. 1 root root 35  7月 15 15:14 jre-1.8.0-openjdk -> /etc/alternatives/jre_1.8.0_openjdk
lrwxrwxrwx. 1 root root 51  7月 15 15:14 jre-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64 -> java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre
lrwxrwxrwx. 1 root root 29  7月 15 15:14 jre-openjdk -> /etc/alternatives/jre_openjdk

EAP7のインストール

  1. 上記でダウンロードしたファイルを任意のディレクトリに配置する。
    以降では~root/work直下に配置する前提で手順を記載する。

    # ls -l ~root/work/
    合計 506884
    -rw-r--r--. 1 root root 183793648  7月  1 23:34 jboss-eap-7.1.0.zip
    -rw-r--r--. 1 root root  85702880  7月 15 13:02 jboss-eap-7.1.1-patch.zip
    -rw-r--r--. 1 root root 124064551  7月 15 13:02 jboss-eap-7.1.2-patch.zip
    -rw-r--r--. 1 root root 125478149  7月 15 13:02 jboss-eap-7.1.3-patch.zip
  2. eapパッケージを展開
    # cd /opt/
    # unzip ~/work/jboss-eap-7.1.0.zip
    Archive:  /root/work/jboss-eap-7.1.0.zip
       creating: jboss-eap-7.1/
       creating: jboss-eap-7.1/bin/
    ...
  3. 基本的な設定
    /opt/jboss-eap-7.1/bin/init.d/に起動用のスクリプトや設定ファイルが存在する。
    jboss-eap-rhel.shが起動スクリプトで、このスクリプトから設定ファイルjboss-eap.confを参照する設計になっている。そのため、環境依存の設定は基本的にはjboss-eap.confに定義する。

    # cd /opt/jboss-eap-7.1/bin/init.d/
    # cp jboss-eap.conf jboss-eap.conf.org
    # vi jboss-eap.conf    ※下記を参照

    jboss-eap.confの設定内容は次の通り。
    JAVA_HOMEの指定に関して、alternativesから動的に取得できるが、サーバ用途の場合は安易に変更できてはいけないものなので、固定で指定した。既定ではサービス開始・終了の待機時間が60秒になっているが、デプロイするアプリによって開始/終了時間が変わるので最大で600秒(10分)待機するようにする。

    # General configuration for the init.d scripts,
    # not necessarily for JBoss EAP itself.
    # default location: /etc/default/jboss-eap
    
    ## Location of JDK
    # JAVA_HOME="/usr/lib/jvm/default-java"
    JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64"
    
    ## Location of JBoss EAP
    # JBOSS_HOME="/opt/jboss-eap"
    JBOSS_HOME="/opt/jboss-eap-7.1"
    
    ## The username who should own the process.
    # JBOSS_USER=jboss-eap
    JBOSS_USER=jboss
    
    ## The mode JBoss EAP should start, standalone or domain
    # JBOSS_MODE=standalone
    
    ## Configuration for standalone mode
    # JBOSS_CONFIG=standalone.xml
    
    ## Configuration for domain mode
    # JBOSS_DOMAIN_CONFIG=domain.xml
    # JBOSS_HOST_CONFIG=host-master.xml
    
    ## The amount of time to wait for startup
    # STARTUP_WAIT=60
    STARTUP_WAIT=600
    
    ## The amount of time to wait for shutdown
    # SHUTDOWN_WAIT=60
    SHUTDOWN_WAIT=600
    
    ## Location to keep the console log
    # JBOSS_CONSOLE_LOG="/var/log/jboss-eap/console.log"
    
    ## Additionals args to include in startup
    # JBOSS_OPTS="--admin-only -b 127.0.0.1"
  4. 起動スクリプトの訂正
    jboss-eap-rhel.shは、既定では/etc/default/jboss-eap.conf”を参照するので訂正する。
    (rootの.bashrcでJBOSS_CONFを宣言する方法も考えられる。なお、弊害として、パッチ適用時に競合が発生してしまうが、それは手動で対応する。)

    # cd /opt/jboss-eap-7.1/bin/init.d/
    # vi jboss-eap-rhel.sh    ←変更点をマージ
    ...
    # Load JBoss EAP init.d configuration.
    if [ -z "$JBOSS_CONF" ]; then
            #JBOSS_CONF="/etc/default/$JBOSS_NAME.conf"
            JBOSS_CONF="/opt/jboss-eap-7.1/bin/init.d/$JBOSS_NAME.conf"
    fi
  5. 実行ユーザjbossの作成と権限変更
    ホームディレクトリはEAP7のディレクトリとする。
    セキュリティを高めるために、ログインできないシェル(/sbin/nologin)を指定する。
    同様の理由でパスワードを指定しない。(指定しないとロックされた状態になるがrootからsuは可。)

    # useradd -d /opt/jboss-eap-7.1 -s /sbin/nologin jboss
    useradd: 警告: ホームディレクトリが既に存在します。
    skel ディレクトリからのコピーは行いません。
    # cd /opt
    # chown -R jboss.jboss ./jboss-eap-7.1
    # cd /var/log
    # mkdir jboss-eap
    # chown -R jboss.jboss ./jboss-eap
  6. 単体での実行確認
    サービス化する前にjboss-eap-rhel.shコマンド単体で正常に起動できるか確認する。
    コマンド実行終了後、console.logで「開始しました」が出力されていることを確認する。
    正常に開始できていない場合、コマンドが終了しないのでCtrl+c等で中断し、console.logを確認し問題を解決する。

    # cd /opt/jboss-eap-7.1/bin/init.d/
    # ./jboss-eap-rhel.sh start
    Starting jboss-eap: /opt/jboss-eap-7.1/bin/init.d
                                                               [  OK  ]
    # tail /var/log/jboss-eap/console.log
    ...
    18:35:10,558 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: JBoss EAP 7.1.0.GA (WildFly Core 3.0.10.Final-redhat-1) は 8756ms で開始しました -  サービス 553 個のうち 292 個を開始しました (347 のサービスはレイジー、パッシブ、またはオンデマンドです)。
    
    # ./jboss-eap-rhel.sh stop
    Stopping jboss-eap:                                        [  OK  ]
    # tail /var/log/jboss-eap/console.log
    ...
    18:41:19,061 INFO  [org.jboss.as] (MSC service thread 1-2) WFLYSRV0050: 151ms 以内に JBoss EAP 7.1.0.GA (WildFly Core 3.0.10.Final-redhat-1) が 停止されました。
    *** JBossAS process (10252) received TERM signal ***
    10252
  7. systemdサービスとして登録する。
    前提に記載した資料をカスタマイズして、sysmtedのファイルを作成し、動作確認や起動時の有効サービスとして登録する。起動や停止の正常性は、上記同様にconsole.logを確認する。

    # cd /etc/systemd/system/
    # vi jboss-eap.service    ※下記参照
    # chmod a+x jboss-eap.service
    # systemctl start jboss-eap.service
    # systemctl stop jboss-eap.service
    # systemctl restart jboss-eap.service
    # systemctl enable jboss-eap.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/jboss-eap.service to /etc/systemd/system/jboss-eap.service.
    [Unit]
    Description=JBoss EAP Systemctl script
    After=NetworkManager.service
    
    [Service]
    Type=forking
    ExecStart=/opt/jboss-eap-7.1/bin/init.d/jboss-eap-rhel.sh start
    ExecStop=/opt/jboss-eap-7.1/bin/init.d/jboss-eap-rhel.sh stop
    ExecReload=/opt/jboss-eap-7.1/bin/init.d/jboss-eap-rhel.sh restart
    PIDFile=/var/run/jboss-eap/jboss-eap.pid
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    TimeoutStartSec=600
    TimeoutStopSec=600

パッチの適用

jboss-cliを使ってパッチを適用する。
パッチ適用時は、EAP7を起動しておく必要がある。

7.1.1パッチ(jboss-eap-7.1.1-patch.zip)の適用:
独自に編集しているファイルがパッチ適用対象の場合、競合が発生する。
上書き(–override-all)するか保持するか(–preserve)を選択できるが、どちらも懸念があるので、一旦上書きしてから手動でマージする。

# cd /opt/jboss-eap-7.1/bin/
# ./jboss-cli.sh --connect "patch apply ~/work/jboss-eap-7.1.1-patch.zip"
競合が検出されました: bin/init.d/jboss-eap-rhel.sh
Use the --override-all, --override=[] or --preserve=[] arguments in order to resolve the conflict.
# vi /var/log/jboss-eap/console.log
...
21:22:03,325 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 3) WFLYCTL0013: 操作 ("patch") の失敗 - アドレス: ([("core-service" => "patching")]) - 問題の詳細: {
    "message" => "競合が検出されました",
    "conflicts" => {"misc" => ["bin/init.d/jboss-eap-rhel.sh"]}    ←競合の対象ファイル
}
...
# cd ./init.d
# cp -p jboss-eap-rhel.sh jboss-eap-rhel.sh.new
# cd ..
# ./jboss-cli.sh --connect "patch apply ~/work/jboss-eap-7.1.1-patch.zip --override-all"
{
    "outcome" : "success",
    "response-headers" : {
        "operation-requires-restart" : true,
        "process-state" : "restart-required"
    }
}
# cd ./init.d
# vi jboss-eap-rhel.sh    ←変更点をマージ
...
# Load JBoss EAP init.d configuration.
if [ -z "$JBOSS_CONF" ]; then
        #JBOSS_CONF="/etc/default/$JBOSS_NAME.conf"
        JBOSS_CONF="/opt/jboss-eap-7.1/bin/init.d/$JBOSS_NAME.conf"
fi
...
# systemctl restart jboss-eap.service

残りの7.1.2, 7.1.3パッチの適用
同様に残りのパッチを適用する。

# cd /opt/jboss-eap-7.1/bin/
# ./jboss-cli.sh --connect "patch apply ~/work/jboss-eap-7.1.2-patch.zip"
{
    "outcome" : "success",
    "response-headers" : {
        "operation-requires-restart" : true,
        "process-state" : "restart-required"
    }
}
# systemctl restart jboss-eap.service
# ./jboss-cli.sh --connect "patch apply ~/work/jboss-eap-7.1.3-patch.zip"
{
    "outcome" : "success",
    "response-headers" : {
        "operation-requires-restart" : true,
        "process-state" : "restart-required"
    }
}
# systemctl restart jboss-eap.service
# cat /opt/jboss-eap-7.1/version.txt
Red Hat JBoss Enterprise Application Platform - Version 7.1.3.GA