アーカイブ

Archive for 2012年6月

Connecting JMX on JBoss AS7 – 1

今回は JMX 経由で JBoss AS7 に接続してみよう!のエントリです。

JMX connector (JSR-160 connector) on JBoss AS7

CLI の接続先となる AS7 の Native I/F (デフォルトでは 9999 ポートを使用します。) は JBoss Remoting (Remoting Connector)により実装されています。JBoss Remoting は JSR-160 に準拠しているため、 Native I/F 経由の JMX のリモートアクセスが可能です。

JBoss Remoting の起動は AS7 の起動ログの以下の部分から確認できます。

01:46:42,899 INFO  [org.jboss.as.remoting] (MSC service thread 1-10) JBAS017100: Listening on 127.0.0.1:9999
01:46:42,899 INFO  [org.jboss.as.remoting] (MSC service thread 1-15) JBAS017100: Listening on 127.0.0.1:4447

前者のログは管理用の Native I/F で後者のログはリモート EJB で使用されるポートになります。

※ JSR-160 は JMX によるリモート管理・監視のための API 仕様です。

※ JSR-160 準拠のコネクタが実装されているのは JBoss AS 7.1.0.Final 以降のリリースです。

Using jconsole to connect to JMX on JBoss AS7

jconsole を使用して AS7 上の JMX connector に接続する場合 $JBOSS_HOME/bin/jconsole.sh を使用しましょう。 jconsole.sh は jconsole をラッピングするスクリプトで、 CLASSPATH に JBoss Remoting 等のライブラリを設定しています。

$JBOSS_HOME/bin/jconsole.sh を使用して jconsole を起動するとウィンドウ中に CLI GUI が表示されます。 を起動すると jconsole ウィンドウ中に CLI GUI が表示されます。

ローカルで起動する AS7 への JConsole 接続手順は以下の通り。

※ 下記の手順はローカル接続の手順になります。リモート接続を行う場合は “Remote Process” に service:jmx:remoting-jmx://{host_name}:{port}  を設定しましょう。

1. $JBOSS_HOME/bin/jconsole.sh の実行
2. JConsole : New Connection 画面にて AS7 プロセス (jboss-module.jar) を選択し Connect ボタンをクリック

JConsole: New Connection

3. 以下の jconsole 画面が表示されます。

Java Monitering & Management Console

CLI GUI では Command Builder 画面で特定のリソースを参照・変更する

際の CLI コマンドが画面上部 (cmd>) に出力されます。下図の例では web サブシステムの http コネクタの max-connections を 500 に設定しています。

CLI GUI - selecting write/attribute context menu

CLI GUI - writing attribute

CLI GUI - cmd

JBoss AS 7 Admin Guide – Management tasks – Interfaces and ports

Interface declarations 

AS7 は名前付きインターフェースを使用し、論理名を与えられたインターフェースは設定 (ファイル) 内で参照されます。 

ネットワークインターフェースは論理名と物理インターフェースへのクライテリアにより宣言されます。:

[standalone@localhost:9999 /] :read-children-resources(child-type=interface)
{
    “outcome” => “success”,
    “result” => {
         “management” => {
            “any” => undefined,
            “any-address” => undefined,
            “any-ipv4-address” => undefined,
            “any-ipv6-address” => undefined,
            “inet-address” => expression “${jboss.bind.address.management:127.0.0.1}”,
            “link-local-address” => undefined,
            “loopback” => undefined,
            “loopback-address” => undefined,
            “multicast” => undefined,
            “name” => “management”,
            “nic” => undefined,
            “nic-match” => undefined,
            “not” => undefined,
            “point-to-point” => undefined,
            “public-address” => undefined,
            “site-local-address” => undefined,
            “subnet-match” => undefined,
            “up” => undefined,
            “virtual” => undefined
         },
         “public” => {
            “any” => undefined,
            “any-address” => undefined,
            “any-ipv4-address” => undefined,
            “any-ipv6-address” => undefined,
            “inet-address” => expression “${jboss.bind.address:127.0.0.1}”,
            “link-local-address” => undefined,
            “loopback” => undefined,
            “loopback-address” => undefined,
            “multicast” => undefined,
            “name” => “public”,
            “nic” => undefined,
            “nic-match” => undefined,
            “not” => undefined,
            “point-to-point” => undefined,
            “public-address” => undefined,
            “site-local-address” => undefined,
            “subnet-match” => undefined,
            “up” => undefined,
            “virtual” => undefined
         },
         “unsecure” => {
            “any” => undefined,
            “any-address” => undefined,
            “any-ipv4-address” => undefined,
            “any-ipv6-address” => undefined,
            “inet-address” => expression “${jboss.bind.address.unsecure:127.0.0.1}”,
            “link-local-address” => undefined,
            “loopback” => undefined,
            “loopback-address” => undefined,
            “multicast” => undefined,
            “name” => “unsecure”,
            “nic” => undefined,
            “nic-match” => undefined,
            “not” => undefined,
            “point-to-point” => undefined,
            “public-address” => undefined,
            “site-local-address” => undefined,
            “subnet-match” => undefined,
            “up” => undefined,
            “virtual” => undefined
         }
      }
}

これは 2 つのインターフェースを宣言することを意味しています。 1 つは “management” として参照され、他方は “public” として参照されます。

“management” インターフェースは管理レイヤから必要とされる全てのコンポーネントやサービス( HTTP I/F, Native  管理 I/F )から使用されます。

[standalone@localhost:9999 /] /core-service=management:read-children-resources(child-type=management-interface)
{
    “outcome” => “success”,
    “result” => {
         “http-interface” => {
             “console-enabled” => true,
             “interface” => undefined,
             “port” => undefined,
             “secure-port” => undefined,
             “secure-socket-binding” => undefined,
             “security-realm” => “ManagementRealm”,
             “socket-binding” => “management-http”
         },
         “native-interface” => {
             “interface” => undefined,
             “port” => undefined,
             “security-realm” => “ManagementRealm”,
             “socket-binding” => “management-native”
         }
    }
}

“public” インターフェースはネットワーク通信に関連するいくつかのアプリケーション( Web, Messaging 等)から使用されます。

これらの名前は特別なものではなく、インターフェースはどんな名前でも宣言可能です。設定ファイルの他のセクションはこれらのインターフェースの(物理的な)全ての詳細を含むよりも論理名で参照します(管理ドメイン内の server は別のマシンで動作する可能性があります)。

domain.xml, host.xml, standalone.xml の設定ファイルは全てインターフェースを宣言可能なセクションを含みます。

インターフェースに関する XML 宣言を見ると、いくつかのインターフェース/アドレスの指定にいくつかの記述方式があることが分ります。

記述方式には 2 つのタイプがあり、単一の要素を用いてインターフェースをワイルドカードアドレスにバインドする方式 または、 1 つ以上の特徴を指定してインターフェースもしくはアドレスを完全にマッチさせる方式です。

次のサンプルでは各々のインターフェースに特定の IP アドレスを指定しています。:

<interfaces>
    <interface name=”management“>
        <inet-address value=”127.0.0.1″/>
    </interface>
    <interface name=”public“>
        <inet-address value=”127.0.0.1″/>
    </interface>
</interfaces>

他の指定方式は以下の通りです。:

<interface name=”global”>
    <!– ワイルドカードアドレスの使用 –>
    <any-address/>
</interface>
<interface name=”ipv4-global”>
    <!– IPv4 ワイルドカードアドレスの使用 –>
    <any-ipv4-address/>
</interface>
<interface name=”ipv6-global”>
    <!– IPv6 ワイルドカードアドレスの使用 –>
    <any-ipv6-address/>
</interface>
<interface name=”external”>
    <nic name=”eth0″/>
</interface>
<interface name=”default”>
    <!– 指定されたサブネットの全てのアドレスにマッチします。ポイント・ツー・ポイントではなくマルチキャストをサポートします。 –>
    <subnet-match value=”192.168.0.0/16″/>
    <up/>
    <multicast/>
    <not>
        <point-to-point/>
    </not>
</interface>

Socket Binding Groups

AS7 におけるソケット設定はインターフェース宣言に似ています。ソケットは論理名を使用して宣言され、論理名は他の設定から参照されます。

ソケットの宣言は特定の名前でグルーピング(ソケットバインディンググループ)されます。これによりサーバグループ(ドメイン管理)を設定する際に特定のソケットバインディンググループを容易に参照することができます。

ソケットバインディンググループは論理名を使用してインターフェースを参照します。

<socket-binding-group name=”standard-sockets” default-interface=”public”>
    <socket-binding name=”jndi”port=”1099″/>
    <socket-binding name=”jmx-connector-registry”port=”1090″/>
    <socket-binding name=”jmx-connector-server”port=”1091″/>
    <socket-binding name=”http”port=”8080″/>
    <socket-binding name=”https”port=”8443″/>
    <socket-binding name=”jacorb”port=”3528″/>
    <socket-binding name=”jacorb-ssl”port=”3529″/>
    <socket-binding name=”osgi-http”port=”8090″/>
    <socket-binding name=”remoting”port=”4447″/>
    <socket-binding name=”txn-recovery-environment”port=”4712″/>
    <socket-binding name=”txn-status-manager”port=”4713″/>
    <socket-binding name=”messaging”port=”5445″/>
    <socket-binding name=”messaging-throughput”port=”5455″/>
</socket-binding-group>

ソケットバインディングは以下の情報を含みます:

  • name – 他の設定から参照する際に使用されるソケット設定の論理名
  • port – この設定をベースにしたソケットがバインドされるベース(基本)ポート番号( server はこのベースポート番号を上書きできることに注意して下さい。)
  • interface (optional) – この設定をベースにしたソケットがバインドされるインターフェースの論理名
  • multicast-address (optional) – ソケットがマルチキャストに使用される場合のマルチキャストアドレス
  • multicast-port (optional) – ソケットがマルチキャストに使用される場合のマルチキャストポート番号
  • fixed-port (optional, defaults to false) – true の場合、指定されたソケット番号を必ず使用し上書きさせないことを宣言します。

IPv4 versus IPv6

AS7 は IPv4 と IPv6 の両アドレスをサポートします。デフォルトでは IPv4 を使用した設定が有効化されるため IPv4 ネットワーク上で AS7 を稼働させる場合、設定変更は不要です。AS7 を IPv6 ネットワークで稼働させる場合、JVM ネットワークプロパティの変更と設定ファイル中 (standalone.xml もしくは domain.xml) の IP アドレス値の変更が必要です。

Stack and address preference

java.net.preferIPv4Stack および java.net.preferIPv6Addresses システムプロパティは JVM が IPv4 または IPv6 のどちらを使用するかを設定するために使用します。 AS7 では IPv4 を使用する場合 java.net.preferIPv4Stack=true を指定し、 IPv6 を使用する場合 java.net.preferIPv4Stack=false (JVM デフォルト) および java.net.preferIPv6Addresses=true を指定します。

※ JVM のネットワークシステムプロパティについての詳細は Java SE Document を参照して下さい。

システムプロパティは JAVA_OPTS 環境変数により設定するのが適切です。 JAVA_OPTS は standalone.conf または domain.conf ファイル中で定義されています。JVM システムプロパティの IP スタック設定を IPv4 から IPv6 に変更するには standalone.conf または domain.conf ファイルの以下のデフォルト設定を編集します。

if [ "x$JAVA_OPTS" = "x" ]; then
    JAVA_OPTS=" ... -Djava.net.preferIPv4Stack=true ..."
...

IPv6 に対応させるにはシステムプロパティを以下の通りに変更します。

if [ "x$JAVA_OPTS" = "x" ]; then
    JAVA_OPTS=" ... -Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true ..."
...

IP address literals

standalone.xml または domain.xml 中の IP アドレス設定を変更するには interface 宣言において妥当な IPv6 アドレスを指定する必要があります。デフォルトで指定されているループバックインターフェース設定を IPv4 から変更する場合、変更対象個所は以下の通りです。

<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>

上記の設定の IPv6 への設定変更例は以下の通りです。

<interfaces>
   <interface name=”management”>
       <inet-address value=”${jboss.bind.address.management:[::1]}”/>
   </interface>
   <interface name=”public”>
       <inet-address value=”${jboss.bind.address:[::1]}”/>
   </interface>
</interfaces>

IPv6 アドレスの省略表現では [] を使用し曖昧さを避けるようにして下さい。これは URL 中で使用させる IPv6 表現の慣例に従います。

interface 定義に上述の変更を行った場合、設定ファイルの他の部分の IP アドレスを IPv4 から IPv6 に変更して下さい。

タグ: ,

JBoss AS7 – add-user.sh による管理ユーザの追加

かなり間があいちゃいましたが、しばらくぶりのエントリです。 ここからは心を入れ替えて頑張っていきたいと思います。

今回はリハビリのエントリとなるので、軽めの話題を書きま〜す。

AS7 をダウンロードして解凍して起動して、管理コンソール(http://localhost:8080/console)にアクセスしようとすると以下の画面が表示されます。

この画面は、『あなたの JBoss AS 7 はちゃんと動いてるけど管理コンソールにアクセスするためのユーザがまだ登録されてないぞ!管理ユーザの登録には $JBOSS_HOME/bin/add-user.sh を使用してね!デフォルトでは “ManagementRealm” というセキュリティレルムが 管理コンソールのアクセス制限には使用されていてそれは登録済みだぞ!』と主張しています。

セキュリティレルムとは、直訳すると『セキュリティ領域』あるいは『セキュリティ範囲』といった感じでしょうかね。具体的には名前付きの認証データのセットです。認証データとはユーザ ID とパスワードの定義です。
セキュリティレルムの定義と管理コンソール(および CLI )へのセキュリティレルムの定義は設定ファイル( standalone.xml, host.xml )で行われています。

<management>
<security-realms>
<security-realm name=”ManagementRealm“>
<authentication>
<properties path=”mgmt-users.properties” relative-to=”jboss.domain.config.dir“/>
</authentication>
</security-realm>

</security-realms>
<management-interfaces>
<native-interface security-realm=”ManagementRealm“>
<socket interface=”management” port=”${jboss.management.native.port:9999}”/>
</native-interface>
<http-interface security-realm=”ManagementRealm“>
<socket interface=”management” port=”${jboss.management.http.port:9990}”/>
</http-interface>
</management-interfaces>
</management>

設定ファイルでは <security-realm> タグで “ManagementRealm” を定義しています。このセキュリティレルムではシステムプロパティ “jboss.domain.config.dir” (もしくは “jboss.server.config.dir” )が指すディレクトリ中の “mgmt-users.properties” ファイルで認証データ( ID=PASSWORD )を定義しています。

インストール直後の $JBOSS_HOME/standalone/configuration/mgmt-users.properties ファイルもしくは $JBOSS_HOME/domain/configuration/mgmt-users.properties ファイルでは以下の定義が行われています。

#admin=2a0923285184943425d1f53ddd58ec7a

インストール直後のユーザ定義プロパティファイルでは admin ユーザがコメントアウトされているためコメントを外すか新規ユーザを追加してやる必要があります。

新規ユーザの追加には $JBOSS_HOME/bin/add-user.sh を使用します。同スクリプトを使って新規ユーザを追加する手順は以下の通りです。

# $JBOSS_HOME/bin/add-user.sh
What type of user do you wish to add?
a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a): a
Enter the details of the new user to add.
Realm (ManagementRealm) :
Username : admin
Password :
Re-enter Password :
The username ‘admin’ is easy to guess
Are you sure you want to add user ‘admin’ yes/no? yes
About to add user ‘admin’ for realm ‘ManagementRealm’
Is this correct yes/no? yes
Added user ‘admin’ to file ‘/Users/yoshikazu/java/as/7.1.1/standalone/configuration/mgmt-users.properties’
Added user ‘admin’ to file ‘/Users/yoshikazu/java/as/7.1.1/domain/configuration/mgmt-users.properties’

以上の手順が成功すると mgmt-users.properties ファイルにユーザが追加されているはずです。(パスワードは暗号化されてます。)管理コンソールに再度アクセスして作成したユーザで管理コンソールにアクセスできることを確認してみて下さい。

ちなみに、 add-user.sh のユーザタイプ選択画面で登場する Application User はセキュリティレルム ApplicationRealm のユーザです。 ApplicationRealm はリモーティングサブシステムで使用されます。

タグ: ,