GlassFishを構築してみる

この記事は、オープンソフトウェアとして広く利用されているアプリケーションサーバのGlassFish 5.1.0を構築する機会があったので、手順とハマった点について備忘録として書いています。

GlassFishは、Javaエンタープライズエディション(Java EE)のリファレンス実装として知られるオープンソースのアプリケーションサーバーです。

Sun Microsystemsが、Java EE 5の開発に併せてGlassFishプロジェクトを立ち上げ、2006年にGlassFish v1をリリースしました。その後、2009年にJava EE 6のリファレンス実装であるGlassFish v3をリリースしています。

OracleがSun Microsystemsを買収した2010年以降、GlassFishはOracleの管理下で開発がすすめられ、2013年にOracleがJava EE 7のリファレンス実装であるGlassFish v4をリリースしています。

2017年にOracleがGlassFishの商用サポートと開発の終了を発表し、GlassFishの開発権利がEclipse Foundationに寄贈されたことで、新たにEclipse GlassFishプロジェクトがスタートすることになりました。

そして、2018年にEclipse Foundationは、Java EE 8と互換性のあるJakarta EE 8のリファレンス実装であるGlassFish 5.1.0をリリースし、現在もオープンソースのアプリケーションサーバーとして開発が続けられています。

Glassfishを構築してみる

今回のGlassFish 5.1.0の構築テストで利用した環境は、以下の通りです。

cat /etc/redhat-release
Red Hat Enterprise Linux release 8.5 (Ootpa)

GlassFish 5.1.0は、Eclipse GlassFish Downloadsから取得することができます。ダウンロードしたglassfish-5.1.0.zipをサーバにアプロードしてrootユーザで作業していきます。

GlassFishのユーザ追加とソース展開

GlassFishの管理と最小特権によるセキュリティ対策のため、「glassfish」というユーザと同名のグループを作成します。

$ useradd -m -d /opt/glassfish5 -U -s /bin/false glassfish

ユーザとグループを追加したら、glassfish-5.1.0.zipを展開して所有者を変更します。

$ unzip -d /opt ./glassfish-5.1.0.zip

$ cd /opt

$ ls -l
drwxr-xr-x  7 root root   92  1月 28  2019 glassfish5

$ chown -R glassfish:glassfish ./glassfish5

$ ls -l
drwxr-xr-x  7 glassfish glassfish   92  1月 28  2019 glassfish5

自動起動設定する

GlassFishを自動起動するための設定を作成します。

$ vi /lib/systemd/system/glassfish.service

# 以下を追記して保存
[Unit]
Description = GlassFish Server v5.1.0
After = syslog.target network.target

[Service]
User=glassfish
ExecStart=/opt/glassfish5/bin/asadmin start-domain
ExecReload=/opt/glassfish5/bin/asadmin restart-domain
ExecStop=/opt/glassfish5/bin/asadmin stop-domain
Type = forking

[Install]
WantedBy = multi-user.target

デーモンの起動設定をします。

$ systemctl daemon-reload

$ systemctl enable glassfish

Java SE 8 OpenJDKのバージョンを確認

GlassFish 5.1.0を起動するためには、Java SE 8 OpenJDKが必要であるため、インストール状況とバージョンを確認します。

$ java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (build 25.372-b07, mixed mode)

Java SE 8 OpenJDK 8u372のパッチバージョンが適用されています。もし、Java 8以外のバージョンが返ってきたら、alternativeコマンドで切り替えます。

$ java -version
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.19.0.7-2) (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.19.0.7-2) (build 11.0.19+7-LTS, mixed mode, sharing)

$ alternatives --config java
2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
 + 1           java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.19.0.7-4.el8.x86_64/bin/java)
*  2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-4.el8.x86_64/jre/bin/java)

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2

$ java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (build 25.372-b07, mixed mode)

ポートを開ける

GlassFishは、管理画面(ポート:4848)、HTTP(ポート:8080)及びHTTPS(ポート:8181)の3つのポートをデフォルトで利用するため、ポートを開放していきます。

$ firewall-cmd --permanent --zone=public --add-port=4848/tcp

$ firewall-cmd --permanent --zone=public --add-port=8080/tcp

$ firewall-cmd --permanent --zone=public --add-port=8181/tcp

$ firewall-cmd --reload

$ firewall-cmd --list-all

ここまでの設定が完了すればGlassFish 5.1.0を起動することができます。

GlassFishを起動する

GlassFish 5.1.0の起動設定が一通り完了したので、実際に動かしてみます。

$ systemctl start glassfish

$systemctl status glassfish

● glassfish.service - GlassFish Server v5.1.0
   Loaded: loaded (/usr/lib/systemd/system/glassfish.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-06-10 05:24:51 UTC; 8s ago
  Process: 387814 ExecStart=/opt/glassfish5/bin/asadmin start-domain (code=exited, status=0/SUCCESS)
 Main PID: 387841 (java)
    Tasks: 101 (limit: 24301)
   Memory: 417.3M
   CGroup: /system.slice/glassfish.service
           mq387841 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-4.el8.x86_64/bin/java -cp /opt/glassfish5/glassfi>

 6月 10 05:24:20 rhel8.reafnex.net systemd[1]: Starting GlassFish Server v5.1.0...
 6月 10 05:24:51 rhel8.reafnex.net asadmin[387814]: Waiting for domain1 to start ............................
 6月 10 05:24:51 rhel8.reafnex.net asadmin[387814]: Successfully started the domain : domain1
 6月 10 05:24:51 rhel8.reafnex.net asadmin[387814]: domain  Location: /opt/glassfish5/glassfish/domains/domain1
 6月 10 05:24:51 rhel8.reafnex.net asadmin[387814]: Log File: /opt/glassfish5/glassfish/domains/domain1/logs/server>
 6月 10 05:24:51 rhel8.reafnex.net asadmin[387814]: Admin Port: 4848
 6月 10 05:24:51 rhel8.reafnex.net asadmin[387814]: Command start-domain executed successfully.
 6月 10 05:24:51 rhel8.reafnex.net systemd[1]: Started GlassFish Server v5.1.0.

Glassfishを正常に起動することができました。

管理画面にリモートアクセスする

PCのブラウザからGlassFishをインストールしたサーバ(http://<サーバのアドレス>:4848)にアクセスすると、以下のような画面が表示されます。

ドメイン管理サーバ(DAS)にリモートからアクセスして利用するためには、Secure Adminを有効化する必要があります。

はじめに管理者のパスワードを設定します。

$ /opt/glassfish5/bin/asadmin --port 4848 change-admin-password

Enter admin user name [default: admin]> ← そのままエンター
Enter the admin password> ← そのままエンター
Enter the new admin password> ← 任意のパスワードを入力
Enter the new admin password again> ← 任意のパスワードを入力
Command change-admin-password executed successfully.

次にSecure Adminを有効化します。

$ /opt/glassfish5/bin/asadmin --host localhost --port 4848 enable-secure-admin

/opt/glassfish5/bin/asadmin --host localhost --port 4848 enable-secure-admin
Enter admin user name>  admin
Enter admin password for user "admin">
You must restart all running servers for the change in secure admin to take effect.
Command enable-secure-admin executed successfully. 

Secure Adminを有効化するために、GlassFishを再起動します。

$ systemctl restart glassfish

PCのブラウザからドメイン管理サーバ(DAS)に再度アクセスします。すると、ドメイン管理サーバ(DAS)の画面が表示されなくなってしまいました。

ハマったこと

GlassFishのログを確認してみます。

$ cd /opt/glassfish5/glassfish/domains/domain1/logs/
$ ls
server  server.log

$ vi server.log

[2023-06-10T05:53:02.392+0000] [glassfish 5.1] [WARNING] [] [org.glassfish.grizzly.filterchain.DefaultFilterChain] [tid: _ThreadID=50 _ThreadName=admin-listener(4)] [timeMillis: 1686376382392] [levelValue: 900] [[
  GRIZZLY0013: Exception during FilterChain execution
java.lang.NoClassDefFoundError: Could not initialize class sun.security.ssl.SSLEngineImpl
        at sun.security.ssl.SSLContextImpl$AbstractTLSContext.createSSLEngineImpl(SSLContextImpl.java:629)
        at sun.security.ssl.SSLContextImpl.engineCreateSSLEngine(SSLContextImpl.java:203)
        at javax.net.ssl.SSLContext.createSSLEngine(SSLContext.java:361)
・・・<省略>・・・

sun.security.ssl.SSLEngineImplクラスの初期化に失敗しているメッセージが記録されています。SSLEngineImplクラスは、Javaの標準ライブラリであるJava Secure Socket Extension(JSSE)の一部として提供され、SSL/TLSのエンジンを実装するために利用されるクラスです。

Secure Adminを有効化したことにより、ドメイン管理サーバ(DAS)画面へのリモートアクセスはHTTPSになるのですが、SSLEngineImplクラスの初期化が失敗したことによってドメイン管理サーバ(DAS)画面が表示できないことがわかりました。

OpenJDKのバージョンが原因か?

Java SE 8 OpenJDKが疑わしいので、バージョンを変更して検証してみます。利用可能なJava SE 8 OpenJDKのパッチバージョンを検索します。

$ dnf --showduplicates search java-1.8.0-openjdk

・・・<省略>・・・
java-1.8.0-openjdk-devel-1:1.8.0.372.b07-4.el8.x86_64 : OpenJDK 8 Development Environment
java-1.8.0-openjdk-devel-1:1.8.0.201.b09-2.el8.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-1:1.8.0.222.b10-0.el8_0.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-1:1.8.0.212.b04-1.el8_0.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-1:1.8.0.232.b09-0.el8_0.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-1:1.8.0.222.b10-1.el8.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-1:1.8.0.232.b09-2.el8_1.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-1:1.8.0.252.b09-2.el8_1.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-1:1.8.0.242.b08-0.el8_1.x86_64 : OpenJDK Development Environment 8
・・・<省略>・・・

最も古そうなJava SE 8 OpenJDKのパッチバージョンは8u201のようですので、これをインストールしていきます。

$ dnf -y install java-1.8.0-openjdk-devel-1:1.8.0.201.b09-2.el8.x86_64

$ java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)

GlassFishを再起動します。

$ systemctl restart glassfish

再起動が完了したら、ドメイン管理サーバ(DAS)画面にアクセスしてみます。

Java SE 8 OpenJDKのパッチバージョンを古いもの(8u201)に変更したことによって、リモートからドメイン管理サーバ(DAS)画面を表示できるようになりました。

先ほど登録した管理者のアカウントとパスワードを使ってドメイン管理サーバ(DAS)にログインすると、以下のような画面が表示されます。

Secure Adminを有効化すると、HTTPはHTTPSにリダイレクトされます。これにより画面とサーバ間通信が暗号化されるため、セキュリティが強化されます。

どのOpenJDKのバージョンまで適合するのか?

GlassFish 5.1.0のSecure Adminに適合するJava SE 8 OpenJDKのパッチバージョンの範囲を探るため、古いバージョンから順にインストールして動作確認してみると、java-1.8.0-openjdk(8u242)までは問題ないことがわかりました。

これより新しいバージョンでは、Secure Adminを有効化した場合に、リモートからドメイン管理サーバ(DAS)画面を表示することができませんでした。

$ dnf -y install java-1.8.0-openjdk-devel-1:1.8.0.242.b08-4.el8.x86_64

・・・<省略>・・・

====================================================================================================================================
 パッケージ                          Arch           バージョン                       リポジトリー                             サイズ
====================================================================================================================================
アップグレード:
 java-1.8.0-openjdk                  x86_64         1:1.8.0.242.b08-4.el8            rhel-8-for-x86_64-appstream-rpms         318 k
 java-1.8.0-openjdk-devel            x86_64         1:1.8.0.242.b08-4.el8            rhel-8-for-x86_64-appstream-rpms         9.8 M
 java-1.8.0-openjdk-headless         x86_64         1:1.8.0.242.b08-4.el8            rhel-8-for-x86_64-appstream-rpms          33 M

トランザクションの概要
====================================================================================================================================
アップグレード  3 パッケージ

・・・<省略>・・・


$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

まとめ

いかがでしたでしょうか。

今回は、GlassFish 5.1.0の構築テストをする機会があったので、手順と作業を進めていく中でハマった点がありましたので紹介しました。

この事象は、GlassFish 5.1.0のSecure Adminに関する問題であり、java-1.8.0-openjdk(8u242)よりも新しいOpenJDKを利用した場合に発生するものでした。そのため、ドメイン管理サーバ(DAS)画面にリモートアクセスしない(Secure Adminを有効化していない)場合は全く影響はありません。

また、アプリケーションサーバとしての動作にも直接影響はないため、ドメイン管理サーバ(DAS)画面にリモートアクセスする必要がなければ、最新のJava SE 8 OpenJDKで運用することは可能です。システムの利用条件に応じて検討してみてください。

参考になれば幸いです。

システムのお悩みについてご相談ください

本サイトの掲載内容に関するお問い合わせは、こちらから承ります。
SOHOのシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。