CLOVER🍀

That was when it all began.

WildFlyをsystemdで起動できるようにする

これは、なにをしたくて書いたもの?

WildFlyにsystemd用の設定ファイルが含まれているのに気づきまして、ちょっと試してみようかなと。

WildFlyのサービス起動用スクリプト

WildFlyのdocs/contrib/scriptsに、以下の3種類の起動スクリプトのサンプルが含まれています。

  • init.d(System V)
  • systemd
  • Windowsサービス

GitHub上だと、こちらですね。

https://github.com/wildfly/wildfly-core/tree/16.0.0.Final/core-feature-pack/common/src/main/resources/content/docs/contrib/scripts

説明はREADME.mdにあります。

https://github.com/wildfly/wildfly-core/blob/16.0.0.Final/core-feature-pack/common/src/main/resources/content/docs/contrib/scripts/README.md

各ディレクトリ内のスクリプトや設定ファイルのうち、READMEが付属しているのはsystemdだけのようですね。

https://github.com/wildfly/wildfly-core/blob/16.0.0.Final/core-feature-pack/common/src/main/resources/content/docs/contrib/scripts/systemd/README

今回はこの中のうちで、systemd用のものを使ってみます。

環境

今回の環境は、こちらです。Ubuntu Linux 20.04 LTSです。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:    20.04
Codename:   focal


$ uname -srvmpio
Linux 5.4.0-80-generic #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Javaのバージョンは、こちら。

$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)

WildFlyは24.0.0.Finalを使います。

$ curl -OL https://download.jboss.org/wildfly/24.0.0.Final/wildfly-24.0.0.Final.zip
$ unzip wildfly-24.0.0.Final.zip

WildFlyをsystemdのサービスユニットとして登録する

まずは、docs/contrib/scriptsディレクトリ内にあるREADME.mdに目を通してみます。

wildfly-24.0.0.Final/docs/contrib/scripts/README.md

User contributed init scripts
=============================

 ____      ____  _       _______     ____  _____  _____  ____  _____   ______    _  
|_  _|    |_  _|/ \     |_   __ \   |_   \|_   _||_   _||_   \|_   _|.' ___  |  | | 
  \ \  /\  / / / _ \      | |__) |    |   \ | |    | |    |   \ | | / .'   \_|  | | 
   \ \/  \/ / / ___ \     |  __ /     | |\ \| |    | |    | |\ \| | | |   ____  | | 
    \  /\  /_/ /   \ \_  _| |  \ \_  _| |_\   |_  _| |_  _| |_\   |_\ `.___]  | |_| 
     \/  \/|____| |____||____| |___||_____|\____||_____||_____|\____|`._____.'  (_) 


In this folder you can find user contributed scripts & services for running WildFly as a service on various operating systems.

This scripts are user contributions and are here as example and/or reference.  

init.d
------

System V init.d scripts.

+ `wildfly-init-redhat.sh` for RHEL/CentOS 6.* and below
+ `wildfly-init-debian.sh` for Debian based distributions that do not use Systemd

Both scripts use `wildfly.conf` as reference configuration file and expect that file is present in proper location.

Selected script should be copied and renamed to proper directory before usage.

systemd
-------

Systemd scripts for Linux distributions that use systemd. Use this script for RHEL 7 and above.

See systemd/README on how to use it.

service
-------

Windows service files, to enable installing wildfly as service on Windows.

See service.bat on how to use it.

サンプルであることがすごく強調されています。

This scripts are user contributions and are here as example and/or reference.

WildFlyのドキュメントにも、このあたりのスクリプト群の説明ってないんですよね。利用は自己責任というか、
中身をちゃんと見て使いましょうという感じですね。

systemdのREADMEには、インストール方法が書いてあります。

wildfly-24.0.0.Final/docs/contrib/scripts/systemd/README

= How to configure WildFly as a systemd service

== Create a wildfly user

    # groupadd -r wildfly
    # useradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly

== Install WildFly

    # tar xvzf wildfly-10.0.0.Final.tar.gz -C /opt
    # ln -s /opt/wildfly-10.0.0.Final /opt/wildfly
    # chown -R wildfly:wildfly /opt/wildfly

== Configure systemd

    # mkdir /etc/wildfly
    # cp wildfly.conf /etc/wildfly/
    # cp wildfly.service /etc/systemd/system/
    # cp launch.sh /opt/wildfly/bin/
    # chmod +x /opt/wildfly/bin/launch.sh

== Start and enable

    # systemctl start wildfly.service
    # systemctl enable wildfly.service

ざっくり、WildFly用のグループとユーザーの作成、WildFlyを/opt/wildflyに配置、systemdの設定、起動といった
流れですね。

systemd用のディレクトリに含まれているファイルは、こんな感じです。

$ ll wildfly-24.0.0.Final/docs/contrib/scripts/systemd
合計 24
drwxr-xr-x 2 xxxxx xxxxx 4096  6月 16 16:47 ./
drwxr-xr-x 5 xxxxx xxxxx 4096  6月 16 16:47 ../
-rw-r--r-- 1 xxxxx xxxxx  645  6月 16 16:47 README
-rwxr-xr-x 1 xxxxx xxxxx  217  6月 16 16:47 launch.sh*
-rw-r--r-- 1 xxxxx xxxxx  165  6月 16 16:47 wildfly.conf
-rw-r--r-- 1 xxxxx xxxxx  409  6月 16 16:47 wildfly.service

なんとなく、読み替えながら設定していってみます。

ユーザーの作成。

$ sudo adduser --shell /usr/sbin/nologin --disabled-password --no-create-home --gecos '' wildfly

確認。

$ sudo -u wildfly id
uid=1001(wildfly) gid=1001(wildfly) groups=1001(wildfly)

ダウンロードしておいたWildFlyを/optディレクトリに移動して、/opt/wildflyとなるようにシンボリックリンクを作成。

$ sudo mv wildfly-24.0.0.Final /opt
$ sudo ln -s /opt/wildfly-24.0.0.Final /opt/wildfly
$ sudo chown -R wildfly:wildfly /opt/wildfly /opt/wildfly-24.0.0.Final

systemdで使う、環境変数の定義ファイルを/etc/wildflyにコピー。

$ sudo mkdir /etc/wildfly
$ sudo cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.conf /etc/wildfly

systemdのユニット定義ファイルをコピー。

$ sudo cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.service /etc/systemd/system

起動スクリプトをコピーして実行権限を付与。

$ sudo cp /opt/wildfly/docs/contrib/scripts/systemd/launch.sh /opt/wildfly/bin
$ sudo chmod +x /opt/wildfly/bin/launch

あとは、systemdのサービスとして有効化して、起動。

$ sudo systemctl enable wildfly
$ sudo systemctl start wildfly

確認。

$ curl -i localhost:8080
HTTP/1.1 200 OK
Connection: keep-alive
Last-Modified: Wed, 16 Jun 2021 07:47:30 GMT
Content-Length: 1504
Content-Type: text/html
Accept-Ranges: bytes
Date: Sat, 24 Jul 2021 12:58:46 GMT

<!DOCTYPE html>

<html>
<head>
    <!-- proper charset -->
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

    <title>Welcome to WildFly</title>
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <link rel="StyleSheet" href="wildfly.css" type="text/css">
</head>

<body>
<div class="wrapper">
    <div class="content">
        <div class="logo">
                <img src="wildfly_logo.png" alt="WildFly" border="0" />
        </div>
        <h1>Welcome to WildFly</h1>

        <h3>Your WildFly instance is running.</h3>

        <p><a href="https://docs.wildfly.org">Documentation</a> | <a href="https://github.com/wildfly/quickstart">Quickstarts</a> | <a href="/console">Administration
            Console</a> </p>

        <p><a href="https://wildfly.org">WildFly Project</a> |
            <a href="https://community.jboss.org/en/wildfly">User Forum</a> |
            <a href="https://issues.jboss.org/browse/WFLY">Report an issue</a></p>
        <p class="logos"><a href="https://www.jboss.org"><img src="jbosscommunity_logo_hori_white.png" alt="JBoss and JBoss Community" width=
                "195" height="37" border="0"></a></p>

        <p class="note">To replace this page simply deploy your own war with / as its context path.<br />
            To disable it, remove the "welcome-content" handler for location / in the undertow subsystem.</p>
    </div>
</div>
</body>
</html>

OKですね。

ステータスを確認して

$ sudo systemctl status wildfly
● wildfly.service - The WildFly Application Server
     Loaded: loaded (/etc/systemd/system/wildfly.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-07-24 21:57:57 JST; 1min 12s ago
   Main PID: 13141 (launch.sh)
      Tasks: 52 (limit: 2278)
     Memory: 295.2M
     CGroup: /system.slice/wildfly.service
             ├─13141 /bin/bash /opt/wildfly/bin/launch.sh standalone standalone.xml 0.0.0.0
             ├─13142 /bin/sh /opt/wildfly/bin/standalone.sh -c standalone.xml -b 0.0.0.0
             └─13249 java -D[Standalone] -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jbos>

 7月 24 21:57:57 ubuntu2004.localdomain systemd[1]: Started The WildFly Application Server.

停止。

$ sudo systemctl stop wildfly

確認できました。

もう少し、ファイルの中身を見てみる

これで終わってもなんなので、もう少しファイルの中身を見てみましょう。

まずは、ユニット定義ファイル。

/etc/systemd/system/wildfly.service

[Unit]
Description=The WildFly Application Server
After=syslog.target network.target
Before=httpd.service

[Service]
Environment=LAUNCH_JBOSS_IN_BACKGROUND=1
EnvironmentFile=-/etc/wildfly/wildfly.conf
User=wildfly
LimitNOFILE=102642
PIDFile=/var/run/wildfly/wildfly.pid
ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND
StandardOutput=null

[Install]
WantedBy=multi-user.target

/opt/wildfly/bin/launch.shを呼び出して起動するようになっています。

ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND

/etc/wildfly/wildfly.confファイルは、環境変数の定義ファイルとして扱われます。

Environment=LAUNCH_JBOSS_IN_BACKGROUND=1
EnvironmentFile=-/etc/wildfly/wildfly.conf

LAUNCH_JBOSS_IN_BACKGROUNDというのは、起動スクリプトに送ったシグナルをWildFlyのJavaプロセスにも
渡すためのものですね。

ところでこのユニットの後に起動するべきサービスとしてhttpdが書かれているのですが、Ubuntu Linuxの場合は
これはapache2にしないといけない気がしますね。

Before=httpd.service

環境変数の定義を見てみましょう。

/etc/wildfly/wildfly.conf

# The configuration you want to run
WILDFLY_CONFIG=standalone.xml

# The mode you want to run
WILDFLY_MODE=standalone

# The address to bind to
WILDFLY_BIND=0.0.0.0

これは、ユニット定義ファイルのExecStartを見ると関係がわかりますね。

ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND

launch.shを見ると、WILDFLY_MODEをdomainにするかどうかでドメインモードで起動するのかスタンドアロンモードで
起動するのかが変わるようです。

/opt/wildfly/bin/launch.sh
#!/bin/bash

if [ "x$WILDFLY_HOME" = "x" ]; then
    WILDFLY_HOME="/opt/wildfly"
fi

if [[ "$1" == "domain" ]]; then
    $WILDFLY_HOME/bin/domain.sh -c $2 -b $3
else
    $WILDFLY_HOME/bin/standalone.sh -c $2 -b $3
fi

少し設定を変えてみる

例として、環境変数に設定を追加してみましょう。JBOSS_JAVA_SIZINGを使って、ヒープサイズをデフォルト値から
変更してみます。

/etc/wildfly/wildfly.conf

# The configuration you want to run
WILDFLY_CONFIG=standalone.xml

# The mode you want to run
WILDFLY_MODE=standalone

# The address to bind to
WILDFLY_BIND=0.0.0.0

JBOSS_JAVA_SIZING='-Xms1G -Xmx1G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m'

WildFlyを起動。

$ sudo systemctl start wildfly

確認。

$ sudo systemctl status wildfly
● wildfly.service - The WildFly Application Server
     Loaded: loaded (/etc/systemd/system/wildfly.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-07-24 22:45:16 JST; 2min 22s ago
   Main PID: 13614 (launch.sh)
      Tasks: 52 (limit: 2278)
     Memory: 309.9M
     CGroup: /system.slice/wildfly.service
             ├─13614 /bin/bash /opt/wildfly/bin/launch.sh standalone standalone.xml 0.0.0.0
             ├─13624 /bin/sh /opt/wildfly/bin/standalone.sh -c standalone.xml -b 0.0.0.0
             └─13718 java -D[Standalone] -server -Xms1G -Xmx1G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.b>

 7月 24 22:45:16 ubuntu2004.localdomain systemd[1]: Started The WildFly Application Server.

反映されていることが確認できました。

ソースコード上の変遷

今回、WildFly 24.0.0.Finalで確認したわけですが。

https://github.com/wildfly/wildfly-core/tree/16.0.0.Final/core-feature-pack/common/src/main/resources/content/docs/contrib/scripts

このスクリプト、いつからあるんでしょう?

WildFly 10.0.0.Finalの頃には、こちらにあったようです。

https://github.com/wildfly/wildfly-core/tree/2.0.10.Final/core-feature-pack/src/main/resources/content/docs/contrib/scripts

さらに、WildFly 9.0.0.Finalの時にはdocsの配下でもなかったようです。

https://github.com/wildfly/wildfly-core/tree/1.0.0.Final/core-feature-pack/src/main/resources/content/bin

WildFly 8.0.0.Finalの時にも含まれていたようですが、こちらは探すのは諦めました…。
そもそもJBoss ASの頃からあったみたいですね。

まとめ

WildFlyをsystemdのサービスユニットとして使うスクリプトを、ちょっと試してみました。

あくまでサンプルという位置づけのようなので、使う時には中身をちゃんと確認しないと、ですね。

まあ、実際に使うなら似たようなものは作ると思うので、そのベースとして。

WildFlyのドメインモードで、サーバーグループとサーバーを追加する

これは、なにをしたくて書いたもの?

WildFlyのドメインモードで、自分でサーバーグループとサーバーを追加しようとして、適当にやっていたらちょっと
ハマったのでちゃんと確認しておこうかなと思いまして。

WildFlyのドメインモード

WildFlyには、2つの動作モードがありスタンドアロンモードとドメインモードがあります。

ふだんはスタンドアロンモードしか使っていないんですけどね。

ドメインモードについては、こちら。

Domain Setup

ドメインモードには、以下の構成要素があります。

これらが、各ホスト上で動作します。

この用語の説明は、JBoss EAPのドキュメントを見た方がわかりやすい気がしますね。

第8章 ドメイン管理 7.4 | Red Hat Customer Portal

管理対象ドメイン

今回は、ドメインモードで動作するWildFlyに自分でサーバーグループやサーバーを追加してみたいと思います。

環境

今回の環境は、こちらです。

$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.11, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-80-generic", arch: "amd64", family: "unix"

WildFlyは、24.0.0.Finalを使います。

$ curl -OL https://download.jboss.org/wildfly/24.0.0.Final/wildfly-24.0.0.Final.zip
$ unzip wildfly-24.0.0.Final.zip
$ cd wildfly-24.0.0.Final

デフォルトの構成ファイルでドメインモードを起動する

ドメインモードで起動する際にはbin/domain.shでWildFlyを起動するのですが、この時に--host-configオプションで
ホストの構成ファイルを指定する必要があります。

Managed Domain Configuration Files

デフォルト(未指定)の場合は、host.xmlが選択されます。

$ bin/domain.sh

管理CLIでログインすると

$ bin/jboss-cli.sh -c
[domain@localhost:9990 /] 

2つのサーバーグループと3つのサーバーがあります。

[domain@localhost:9990 /] ls -l /server-group
main-server-group
other-server-group


[domain@localhost:9990 /] ls -l /host=master/server-config
server-one
server-three
server-two

いったん、全部削除してみましょう。最初にサーバーを止めて(server-threeはデフォルトでは起動しないようです)、
削除。

[domain@localhost:9990 /] /host=master/server=server-one:stop()
[domain@localhost:9990 /] /host=master/server-config=server-one:remove()

[domain@localhost:9990 /] /host=master/server=server-two:stop()
[domain@localhost:9990 /] /host=master/server-config=server-two:remove()

[domain@localhost:9990 /] /host=master/server-config=server-three:remove()

サーバーを削除すると、サーバーグループも削除できるようになります。

[domain@localhost:9990 /] /server-group=main-server-group:remove()
[domain@localhost:9990 /] /server-group=other-server-group:remove()

次に、自分でサーバーグループを追加してみます。

[domain@localhost:9990 /] /server-group=server-group1:add(profile=default,socket-binding-group=standard-sockets)

[domain@localhost:9990 /] /server-group=server-group2:add(profile=default,socket-binding-group=standard-sockets)

追加したサーバーグループに、サーバーを作成して割り当てます。ポートのオフセットは、2つ目以降は100ずつ
ずらしていきます。

[domain@localhost:9990 /] /host=master/server-config=server1-1:add(group=server-group1)
[domain@localhost:9990 /] /host=master/server-config=server1-2:add(group=server-group1,socket-binding-port-offset=100)

[domain@localhost:9990 /] /host=master/server-config=server2-1:add(group=server-group2,socket-binding-port-offset=200)

サーバーを起動。

[domain@localhost:9990 /] /host=master/server=server1-1:start()
[domain@localhost:9990 /] /host=master/server=server1-2:start()
[domain@localhost:9990 /] /host=master/server=server2-1:start()

アプリケーションをデプロイしてみます。両方のサーバーグループにデプロイしようと思うので--all-server-groupsを
使ってもいいのですが、今回は最初にひとつのサーバーグループにデプロイして、次に別のサーバーグループにも
デプロイメントを割り当てる、という方法でやってみます。

[domain@localhost:9990 /] deploy /path/to/target/ROOT.war --server-groups=server-group1
[domain@localhost:9990 /] deployment enable ROOT.war --server-groups=server-group2

デプロイしたアプリケーション自体は、最後に簡単に載せます。ここでは、/helloにHTTP GETでアクセスすると
Hello World!!と返ってくるものが動作するものとしてください。

確認。

$ curl localhost:8080/hello
Hello World!!

$ curl localhost:8180/hello
Hello World!!

$ curl localhost:8280/hello
Hello World!!

OKですね。

host-master.xmlを使う

次に、ちょっと試しにとhost-master.xmlを使ってみます。
※ここまでの操作の内容は、いったん削除してまっさらなWildFlyでやり直しています

host-master.xmlの説明を見ると、実環境のマスターとなるドメインコントローラーを想定した設定ファイルのようです。

Managed Domain Configuration Files

とりあえず、起動してみます。

$ bin/domain.sh --host-config=host-master.xml

管理CLIで接続。

$ bin/jboss-cli.sh -c
[domain@localhost:9990 /] 

サーバーグループはありますが、サーバーの定義はありません。

[domain@localhost:9990 /] ls -l /server-group
main-server-group
other-server-group


[domain@localhost:9990 /] ls -l /host=master/server-config

先ほどのhost.xmlを使った時と、同じことをしてみましょう。

今のサーバーグループを削除。

[domain@localhost:9990 /] /server-group=main-server-group:remove()
[domain@localhost:9990 /] /server-group=other-server-group:remove()

サーバーとサーバーグループを追加。

[domain@localhost:9990 /] /server-group=server-group1:add(profile=default,socket-binding-group=standard-sockets)
[domain@localhost:9990 /] /server-group=server-group2:add(profile=default,socket-binding-group=standard-sockets)

[domain@localhost:9990 /] /host=master/server-config=server1-1:add(group=server-group1)
[domain@localhost:9990 /] /host=master/server-config=server1-2:add(group=server-group1,socket-binding-port-offset=100)
[domain@localhost:9990 /] /host=master/server-config=server2-1:add(group=server-group2,socket-binding-port-offset=200)

これで、サーバーを起動しようとすると

[domain@localhost:9990 /] /host=master/server=server1-1:start()

サーバーの起動に失敗します。ログファイル(domain/servers/server1-1/log/server.log)を見ると、こんな感じに。

2021-07-23 22:25:06,379 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([("socket-binding-group" => "standard-sockets")]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["org.wildfly.network.interface.public"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => ["org.wildfly.management.socket-binding-manager is missing [org.wildfly.network.interface.public]"]
}
2021-07-23 22:25:06,380 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([
    ("subsystem" => "remoting"),
    ("http-connector" => "http-remoting-connector")
]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["jboss.http-upgrade-registry.default"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.remoting.remoting-http-upgrade-service.http-remoting-connector is missing [jboss.http-upgrade-registry.default]"]
}
2021-07-23 22:25:06,382 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([("subsystem" => "jca")]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["org.wildfly.transactions.global-default-local-provider"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => ["org.wildfly.jca.transaction-integration is missing [org.wildfly.transactions.global-default-local-provider]"]
}
2021-07-23 22:25:06,384 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([
    ("subsystem" => "ejb3"),
    ("service" => "timer-service"),
    ("file-data-store" => "default-file-store")
]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["org.wildfly.transactions.global-default-local-provider"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => ["org.wildfly.ejb3.timer-service.timer-persistence-service.default-file-store is missing [org.wildfly.transactions.global-default-local-provider]"]
}
2021-07-23 22:25:06,502 INFO  [org.jboss.as.controller] (Controller Boot Thread) WFLYCTL0183: Service status report
WFLYCTL0184:    New missing/unsatisfied dependencies:
      service jboss.http-upgrade-registry.default (missing) dependents: [service jboss.remoting.remoting-http-upgrade-service.http-remoting-connector] 
      service org.wildfly.network.interface.public (missing) dependents: [service org.wildfly.management.socket-binding-manager] 
      service org.wildfly.transactions.global-default-local-provider (missing) dependents: [service org.wildfly.jca.transaction-integration, service org.wildfly.ejb3.timer-service.timer-persistence-service.default-file-store] 
WFLYCTL0448: 24 additional services are down due to their dependencies being missing or failed

依存関係が足りないようです。

ここで、host.xmlとhost-master.xmlを比較してみます。

$ diff domain/configuration/host.xml domain/configuration/host-master.xml
68,70d67
<         <interface name="public">
<             <inet-address value="${jboss.bind.address:127.0.0.1}"/>
<         </interface>
82,92d78
<     <servers>
<         <server name="server-one" group="main-server-group"/>
<         <server name="server-two" group="main-server-group" auto-start="true">
<             <jvm name="default"/>
<             <socket-bindings port-offset="150"/>
<         </server>
<         <server name="server-three" group="other-server-group" auto-start="false">
<             <jvm name="default"/>
<             <socket-bindings port-offset="250"/>
<         </server>
<     </servers>

サーバーの定義がないのはいいとして、interfaceの定義からpublicとされているもの(のinet-addressの定義)がありません。

確かにないようなので

[domain@localhost:9990 /] ls -l /interface=public
ATTRIBUTE          VALUE     TYPE    
any                undefined OBJECT  
any-address        undefined BOOLEAN 
inet-address       undefined STRING  
link-local-address undefined BOOLEAN 
loopback           undefined BOOLEAN 
loopback-address   undefined STRING  
multicast          undefined BOOLEAN 
name               public    STRING  
nic                undefined STRING  
nic-match          undefined STRING  
not                undefined OBJECT  
point-to-point     undefined BOOLEAN 
public-address     undefined BOOLEAN 
site-local-address undefined BOOLEAN 
subnet-match       undefined STRING  
up                 undefined BOOLEAN 
virtual            undefined BOOLEAN 

ものは試しとinet-addressを追加してみます。

[domain@localhost:9990 /] /interface=public:write-attribute(name=inet-address,value="${jboss.bind.address:127.0.0.1}")

ホストを再起動。

[domain@localhost:9990 /] reload --host=master

すると、今度はサーバーが起動するようになります。今の設定だと、auto-startがtrueになっているので、全サーバーが
起動してきますが…。

デプロイと

[domain@localhost:9990 /] deploy /path/to/target/ROOT.war --server-groups=server-group1
[domain@localhost:9990 /] deployment enable ROOT.war --server-groups=server-group2

動作確認。

$ curl localhost:8080/hello
Hello World!!

$ curl localhost:8180/hello
Hello World!!

$ curl localhost:8280/hello
Hello World!!

OKですね。

さて、設定を変えたら動いたわけですが、やったことが設定ファイルの意図と反している気がします。

こちらの説明を見ていると、ドメインコントローラーはホストコントローラーでもあるようなので、サーバーグループと
サーバーを追加したら動くと思っていたのですが。

管理対象ドメイン

host-master.xmlの説明を見ても、ドメインコントローラーであることと、サーバーが起動するように構成されていない
という感じで書かれているだけな気がします。

Managed Domain Configuration Files

管理対象ドメイン設定ファイル

ここで、host-slave.xmlとの差分を見てみましょう。

$ diff domain/configuration/host-master.xml domain/configuration/host-slave.xml 
3c3
< <host xmlns="urn:jboss:domain:17.0" name="master">
---
> <host xmlns="urn:jboss:domain:17.0">
11a12,14
>                 <server-identities>
>                     <secret value="c2xhdmVfdXMzcl9wYXNzd29yZA=="/>
>                 </server-identities>
62c65,69
<         <local/>
---
>         <remote security-realm="ManagementRealm">
>             <discovery-options>
>                 <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote+http}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9990}"/>
>             </discovery-options>
>         </remote>
67a75,77
>         <interface name="public">
>             <inet-address value="${jboss.bind.address:127.0.0.1}"/>
>         </interface>
78a89,94
>     <servers>
>         <server name="server-one" group="main-server-group"/>
>         <server name="server-two" group="other-server-group">
>             <socket-bindings port-offset="150"/>
>         </server>
>     </servers>

こちらにはサーバーの定義があり、publicにもinet-addressの定義があります。

ということは、リクエストをハンドリングするのは、host-slave.xmlで定義されているホストコントローラー管理下の
サーバーで行うことを想定している気がしますね。

そしてサーバーを追加するのも、host-slave.xmlで管理されているホストコントローラー側であるべきなのでしょう。

こちらの説明を読んでいて、ドメイン内のホストコントローラーのひとつがドメインコントローラーとなるという
イメージだったのですが。

管理対象ドメイン

こうなると、ドメインコントローラーはドメイン内でも独立して扱った方が良さそうな感じでしょうか。

参考までに、host.xmlとhost-slave.xmlの差分を見てみましょう。

$ diff domain/configuration/host.xml domain/configuration/host-slave.xml 
3c3
< <host xmlns="urn:jboss:domain:17.0" name="master">
---
> <host xmlns="urn:jboss:domain:17.0">
11a12,14
>                 <server-identities>
>                     <secret value="c2xhdmVfdXMzcl9wYXNzd29yZA=="/>
>                 </server-identities>
62c65,69
<         <local/>
---
>         <remote security-realm="ManagementRealm">
>             <discovery-options>
>                 <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote+http}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9990}"/>
>             </discovery-options>
>         </remote>
84,85c91
<         <server name="server-two" group="main-server-group" auto-start="true">
<             <jvm name="default"/>
---
>         <server name="server-two" group="other-server-group">
87,90d92
<         </server>
<         <server name="server-three" group="other-server-group" auto-start="false">
<             <jvm name="default"/>
<             <socket-bindings port-offset="250"/>

host-slave.xmlにはドメインコントローラーを参照しにいく定義があり、またサーバーの定義が少々異なりますね。

また、ドメイン自体の設定ファイルはdomain.xmlで管理されており、これはdomain.shの引数で指定することもできます。

    -c <config>, -c=<config>            Name of the domain configuration file 
                                        to use (default is "domain.xml") (Same 
                                        as --domain-config)


    --domain-config=<config>            Name of the domain configuration file 
                                        to use (default is "domain.xml") (Same 
                                        as -c)

このファイルは、マスターとなるドメインコントローラーが参照するようです。

Domain Wide Configuration – domain.xml

domain/configuration/domain.xmlでのinterfaceの定義を見ると以下のようになっており、publicとmanagementが空です。

    <interfaces>
        <interface name="management"/>
        <interface name="private">
            <inet-address value="${jboss.bind.address.private:127.0.0.1}"/>
        </interface>
        <interface name="public"/>
        <interface name="unsecure">
            <inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/>
        </interface>
    </interfaces>

一方でhost-master.xmlではinterfacesはこうなっており

    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
    </interfaces>

host.xmlおよびhost-slave.xmlではこのようになっています。

    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:127.0.0.1}"/>
        </interface>
    </interfaces>

domain.xmlはドメインコントローラーでしか読み込まないということですが、この差分を上書きできる仕組みにでも
なっているんでしょうか?

なお、ホストコントローラーはひとつのホストにつきひとつを想定しているようで、それでもその構成を行ってみたい場合は
こちらを見るとよさそうです。

1 台のマシンで管理対象ドメインを設定

反対に、2つのホストでドメインを構成したい場合(host-master.xml、host-slave.xmlを使う場合)は、こちらを見ると
よさそうです。

2 台のマシンで管理対象ドメインを設定

まとめ

WildFlyのドメインモードで、サーバーグループとサーバーを自分で追加してみたいなと思い、そして気軽にhost-master.xmlを
扱ってみるといろいろハマり。

結果として、各種役割だったり2つのhost-xxxxx.xmlの役割の違いなどを調べることになり、意外と理解が進んだような
気がします。

まあ、単一のホストで実行する場合は、素直にhost.xmlを使うのが良さそうですね。

2つ以上のホストで構成する場合は、サーバーが動作するのはhost-slave.xmlになるんでしょうね。