はじめに
Azure の Web Apps には Apache Tomcat や JBoss EAP、 Spring Boot といった Java のランタイムスタックが用意されております。
Java でシステムを運用する場合、ヒープサイズのチューニングやシステムプロパティの指定といった用途で java のコマンドラインオプションを設定したいと思います。
そこで、本記事では App Service (Java) における java のコマンドラインオプションの設定方法と、一般に広まっていると思われるアンチパターンを解説します。
アプリケーション設定で java コマンドラインオプションを指定
Java のランタイムスタックでは「構成」ブレードの「アプリケーション設定」タブで java コマンドラインオプションを指定できます。
アプリケーション設定で、名前に「JAVA_OPTS」もしくは「CATALINA_OPTS」、値に java コマンドラインオプションを記述することで、java プロセスに値で記載したコマンドラインオプションを渡すことができます。
なお、Java SE スタック (Spring Boot に使います) では「JAVA_OPTS」、Tomcat スタックでは「CATALINA_OPTS」を名前に使うというすみ分けがあります。
実際に java コマンドラインオプションをアプリケーション設定から指定してみましょう。
例えば、Tomcat で最大ヒープサイズを 1 GB に指定し、Java Flight Recorder (JFR) を有効にしてみましょう。
下図では、ランタイムスタックは Tomcat なので名前は「CATALINA_OPTS」を使い、最大ヒープサイズ (-Xmx) を 1GB 、 Java Flight Recorder を -XX:StartFlightRecording にて有効にしております。
JFR データを採取し、JDK Mission Control の GC Configuration で GC 設定を見ると、最大ヒープサイズが 1 GB に無事設定されていることが分かります。
また、「高度なツール」のコンソールから jcmd にて JFR の状況を取得すると、JFR データを採取できているので当然ですが、JFR のレコーディングがされていることも分かります。
PS C:\home> jcmd 1552 JFR.check
jcmd 1552 JFR.check
1552:
Recording 1: name=1 maxsize=250.0MB (running)
このようにアプリケーション設定から java コマンドラインオプションを指定することで、java のチューニングや便利機能の有効化を Web Apps で実施することができます。
アンチパターン - web.config での java コマンドラインオプション指定
アプリケーション設定の他に、Windows の Web Apps (Java) では web.config を使って java コマンドラインオプションを指定できる、といった情報を見かけたことがあります。
web.config を使った java コマンドラインオプションの指定方法は、HTTP リクエストを java プロセスにフォワードする基盤側が用意したハンドラー (httpPlatformHandler) を、自分で定義した tomcat の起動スクリプトで上書きする方法です。
ただ、高度なツールのプロセスエクスプローラのスクリーンショットから分かる通り、Web Apps (Java) の java プロセスは JavaBootstrapper と呼ばれる基盤側が用意したプロセスから起動されています。
Tomcat 等の java プロセスの起動は Web Apps のプラットフォーム側が担当する箇所です。
プラットフォーム側が用意した起動処理を無視してまで web.config で java コマンドラインオプションを指定するのは、予期せぬトラブルを招く恐れもありますので、アプリケーション設定を使った方法に切り替えましょう。
おわりに
本記事では App Service (Java) における java コマンドラインオプションの設定方法と、巷に広がっている web.config を使った方法の問題点を指摘しました。
本記事が皆さまのお役に立てれば幸いです。