トップ «前の日記(2024年04月27日) 最新 次の日記(2024年06月22日)» 編集

xiphioの備忘録


2024年05月17日

_ [computer] OpenJDK+Tomcatで、Tomcatの起動に凄く時間がかかる問題

WindowsTerminalを入れてみたその次に、このターミナルソフトでsshからLinuxサーバーのインストール練習とかを、久々にやってみる気になリました。まぁ、周期的に(年に1回ぐらいか)そういう気になりますね。もちろんその先には、HPのメンテナンスやサーバーの移設などを自分で出来る様なスキルを身につけたい、という希望があるのですが、遅々として進みません。

Linuxのディストリビューションは、亡きCentOS8の後継であるRockyLinux8です。Almaでも別に良いのですが、以前GCPを試したときに、Rocky8のバイナリがあった事に依ります。もう9も出ているのに、未だにCentOS8系にするのは、当時各種出ていたCentOS8用の分厚い解説書を何種類も買ってあるからです。特定のディストリビューション向けのこれだけ詳しい解説書は、最近のセキュリティ重視のOSにあまり知識が無い私などには、なかなか貴重です。

Tomcatの事を書いてある本自体あまり無いのですが、apacheとの連携まで解説してくれている本があったので、それを参考にします。大昔のFedoraとか、VineLinuxとかで、ネットでの情報を参考に入れてみた事は有りますが、昔と今ではセキュリティ関係がかなり違っており、あまり簡単に動かなくなった印象が有ります。

少し前、dockerの練習の為に、古いPCにRockyLinux8を入れたパソコンがあったので、その上に入れてみました。当然SELinuxは切ってあります。

apacheは簡単です。昔みたいに設定ファイルを書き換えなくても、今ではパッケージソフト(最近はdnf)でインストールしただけでテストページが出てきます。ただし、ファイヤーウォールは開けておきます。

次のjavaのインストールで、何だか以前と変わっている事に気がつきました。昔は、JAVA EEとか言うのをインストールした気がしますが、OpenJDKとか言うのになっています。「この"OpenJDK"ってなんだ?」と思い、検索して少し調べました。暫く見ない間に、どんどん変わりますね(出来る事は結局あまり変わっていないと思うのですが)。概ね状況が理解できたら、やはりdnfでインストールです。簡単に終わり、javaの動作確認も出来ました。

次はTomcatです。解説本ではパッケージではなくダウンロードしていますので、その通り最新のをダウンロード。tomcatは配置するだけでjavaの上で動くので、簡単に動くはず、、、なのですが、テストページが出てきません。"systemctl status"で見てもちゃんと動いてる様に見えます。本の通り、8080のポートも開けてある筈ですし、その他セキュリティ関係を色々当たってみましたが、問題は無いようです、、ここで詰まってしまいました。

日を変えて、色々試してみましたがダメで、tomcatのログを見てみる事にしました。もう既に忘れましたが、tomcatの立ち上がりでワーニングみたいのが出ていて、それが原因と思い、それを消すべく調べたりパッケージやライブラリをインストールしてみたりして、結局どうにかして確かワーニングが消えたのですが、やはりテストページが出てきません。もう諦めかけて暫くほっておいて、その後ふと見るとテストページが出ているではありませんか!。

一度テストページが出ると、後は普通に作動している様に見えます。ただしtomcatをリスタートするとまた駄目で、テストページが出て来るまでに10分程かかります。何度かリスタートしまして、再現性があるのを確かめましたが、ただその理由が全く分かりません。

ともかく此処までの手順は間違えていない様なので、もう仕方ないのでOSから入れ直して、動作確認出来ているヴァージョンをインストールしてみる事にしました。OSは変わらずRockyLinux8ですが、OpenJDKはヴァージョン1.8で、tomcatはヴァージョン9です。インストールするアプリのメジャーなヴァージョンを、現使用しているHPと同じにしてみました。ちなみにtomcat9は、パッケージが有りましたのでdnfで入れました。それでも、状況は同じでした。もしかしたら使用している古いSSDなどのハードウエアの問題か、もしかしたらハブなどのネットワーク問題かも、とも思いましたが違うようです。ここで更に暫く停滞していました。

結局状況は一番最初と同じで、tomcatを立ち上げても接続できず、その後10分くらい置いておくと何故か正常に動作し始めるようです。そこで、今回はその後にtomcatのログを見てみますと、
------------
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom セッション ID を生成するための SecureRandom インスタンスの作成に [689,904] ミリ秒かかりました。アルゴリズムは [SHA1PRNG] です。
------------

と警告メッセージが出ています、689秒=約10分です。これでやっと原因らしきものが分かりました。今までは、テストページが出る前に、動かない接続できないと言って、ログを見ていたので、今まで気がつかなかったのです。やっと問題点が判ったので、次にこの"createSecureRandom"を検索しますと、簡単に原因と解決法が分かりました。

実のところ私などには、何でそんなのが必要なのかも分かりませんが、そのSecureRandomの作成がこれほど時間がかかるのは、何とjavaのバグなんだそうです。ホント「なんだぁ此奴!」って思ってしまいました。回避方法は、tomcat立ち上げ時にオプションを追加すれば良い様で、具体的にはJAVA_OPTSに、"-Djava.security.egd=file:/dev/./urandom"を追加しておけば良いようです。とりあえず、tomcat.confの内容を、そのパラメータを含む様に書き換えてリスタートすると、問題なくテストページがすぐ出てきました。

しかし、過去の経験からtomcatのテストページ位までは何度もやっていまして、環境が変わっても、そのくらいは簡単に進むはずと思っていましたが、甘かった様です。まぁとにかくこの様な最近のLinuxサーバ環境では、セキュリティとか、ソフトのヴァージョン問題とかが、本当に面倒くさいです。今回の「SecureRandom インスタンスの作成」の問題も、セキュリティ関係ですよね。