この記事では、Azure App Service での Java アプリの最も一般的なデプロイとランタイム構成について説明します。 Azure App Service を初めて使用する場合は、まず Java クイック スタートを読む必要があります。 Java 開発に固有ではない App Service の使用に関する一般的な質問に対する回答については、 App Service の FAQ を参照してください。
Azure App Service は、以下の 3 つのバリエーションのフル マネージド サービス上で Java Web アプリケーションを実行します。
- Java Standard Edition (SE): 埋め込みサーバー (Spring Boot、Quarkus、Dropwizard、埋め込み Tomcat または Jetty サーバーを含むアプリなど) を含む Java アーカイブ (JAR) パッケージとしてデプロイされたアプリを実行できます。
- Tomcat: 組み込みの Tomcat サーバーは、Web アプリケーション アーカイブ (WAR) パッケージとしてデプロイされたアプリを実行できます。
- JBoss Enterprise Application Platform (EAP): 組み込みの JBoss EAP サーバーは、WAR またはエンタープライズ アーカイブ (EAR) パッケージとしてデプロイされたアプリを実行できます。 Free、Premium v3、Isolated v2.gti を含む一連の価格レベルの Linux アプリでサポートされます
Java のバージョンを表示する
現在の Java バージョンを表示するには、 Azure Cloud Shell で次のコマンドを実行します。
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
サポートされているすべての Java バージョンを表示するには、 Cloud Shell で次のコマンドを実行します。
az webapp list-runtimes --os linux | grep "JAVA\|TOMCAT\|JBOSSEAP"
Linux コンテナーで Java バージョンを取得する
Linux コンテナーのバージョン情報の詳細については、コンテナー との SSH セッションを開きます。 実行できる内容の例をいくつか次に示します。
SSH セッションで Java バージョンを表示するには:
java -version
SSH セッションで Tomcat サーバーのバージョンを表示するには:
sh /usr/local/tomcat/version.sh
または、Tomcat サーバーがカスタムの場所にある場合は、以下で version.sh
を検索します:
find / -name "version.sh"
SSH セッションで JBoss EAP サーバーのバージョンを表示するには:
$JBOSS_HOME/bin/jboss-cli.sh --connect --commands=:product-info
バージョンサポートの詳細については、 App Service 言語ランタイムのサポート ポリシーを参照してください。
App Service の古いランタイムはどうなりますか?
古いランタイムは、保守組織によって非推奨になったり、重大な脆弱性が見つかったりします。 そのため、ポータルの作成ページと構成ページから削除されます。 古いランタイムがポータルから非表示になっている場合、そのランタイムをまだ使用しているアプリは引き続き実行されます。
ポータルに表示されなくなった古いランタイム バージョンのアプリを作成する場合は、Azure CLI、ARM テンプレート、または Bicep を使用します。 これらのデプロイの代替手段を使用すると、ポータルで削除されたが、引き続きサポートされている非推奨のランタイムを作成できます。
ランタイムが App Service プラットフォームから完全に削除された場合、Azure サブスクリプション所有者は削除前に電子メール通知を受け取ります。
アプリのデプロイ
ビルド ツール
メイヴン
Azure Web Apps 用の Maven プラグインを使用すると、プロジェクト ルートで 1 つのコマンドを使用してプロジェクトを簡単に準備できます。
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config
このコマンドは、既存の Azure Web アプリを選択するか、新しい Azure Web アプリを作成するように求めることで、 azure-webapp-maven-plugin
プラグインと関連する構成を追加します。 構成時に、これはアプリケーションを Java SE、Tomcat、JBoss EAP (Linux のみ) の内のどれにデプロイするべきかの検出を試みます。 その後、次のコマンドを使用して、Java アプリを Azure にデプロイできます。
mvn package azure-webapp:deploy
pom.xml
の構成例を次に示します。
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>2.11.0</version>
<configuration>
<subscriptionId>111111-11111-11111-1111111</subscriptionId>
<resourceGroup>spring-boot-xxxxxxxxxx-rg</resourceGroup>
<appName>spring-boot-xxxxxxxxxx</appName>
<pricingTier>B2</pricingTier>
<region>westus</region>
<runtime>
<os>Linux</os>
<webContainer>Java SE</webContainer>
<javaVersion>Java 17</javaVersion>
</runtime>
<deployment>
<resources>
<resource>
<type>jar</type>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
Gradle
にプラグインを追加して
build.gradle
プラグインを設定します。plugins { id "com.microsoft.azure.azurewebapp" version "1.10.0" }
Web アプリの詳細を構成します。 対応する Azure リソースが、存在しない場合、作成されます。 構成の例を次に示します。 詳細については、 このドキュメントを参照してください。
azurewebapp { subscription = '<your subscription id>' resourceGroup = '<your resource group>' appName = '<your app name>' pricingTier = '<price tier like 'P1v2'>' region = '<region like 'westus'>' runtime { os = 'Linux' webContainer = 'Tomcat 10.0' // or 'Java SE' if you want to run an executable jar javaVersion = 'Java 17' } appSettings { <key> = <value> } auth { type = 'azure_cli' // support azure_cli, oauth2, device_code and service_principal } }
1 つのコマンドでデプロイします。
gradle azureWebAppDeploy
IDE
Azure では、次のような一般的な Java 統合開発環境 (IDE) でシームレスな Java App Service 開発エクスペリエンスが提供されます。
- VS Code: Visual Studio Code を使用した Java Web Apps。
- IntelliJ IDEA: IntelliJ を使用して Azure App Service 用の Hello World Web アプリを作成します。
- Eclipse IDE: Eclipse を使用して Azure App Service 用の Hello World Web アプリを作成します。
Kudu API と OneDeploy API
Maven プラグイン、azure/webapps-deploy@v3
以降を使用した GitHub Actions、az webapp deploy コマンドなどのデプロイ クライアントは OneDeploy を使用します。これは、Kudu サイトの /api/publish
エンドポイントを内部で呼び出すことによって呼び出されます。 この API の詳細については、 このドキュメントを参照してください。
これらのデプロイ方法を使用すると、デプロイ プロセス中に指定された JAR ファイルの名前が自動的に app.jar
に変更されます。 これは /home/site/wwwwroot
の下に配置されます。 JAR ファイルを Java SE にデプロイするには、 このドキュメントを参照してください。
注
FTP や古い ZipDeploy API などの代替メソッドを使用する場合、指定された JAR ファイルの名前を変更するこのメソッドは呼び出されません。 ポータルの [構成] セクションの [スタートアップ ファイル] テキスト ボックスを使用して JAR ファイルを明示的に呼び出す場合は、この点に注意してください。
このドキュメントに従って、WAR ファイルを Tomcat アプリケーションにデプロイできます。 上記のデプロイ方法を使用すると、展開プロセス中に、提供された War ファイルの名前が自動的に app.war
に変更されます。 これは /home/site/wwwwroot
の下に配置され、既定では、 wwwroot
の下に 1 つの WAR ファイルのデプロイのみがサポートされます。 これは、WarDeploy などのデプロイ API を使用する場合のように、 ディレクトリの下/home/site/wwwroot/webapps
。 ファイル構造の競合に関する問題を回避するには、一方または他の展開の種類のみを使用することをお勧めします。
WAR ファイルを JBoss EAP にデプロイするには、 このドキュメントを参照してください。 OneDeploy を使用すると、WAR ファイルの名前が自動的に app.war
に変更され、 /home/site/wwwroot
の下に配置されます。
EAR ファイルをデプロイするには、 FTP を使用します。 EAR アプリケーションは、アプリケーションの構成で定義されているコンテキスト・ルートにデプロイされます。 Web アプリがルート パスで提供されるようにするには、アプリでコンテキスト ルートがルート パスに設定されていることを確認します (<context-root>/</context-root>
)。 詳細については、「 Web アプリケーションのコンテキスト ルートの設定」を参照してください。
FTP を使用して WAR または JAR をデプロイしないでください。 FTP ツールは、スタートアップ スクリプト、依存関係、またはその他のランタイム ファイルをアップロードするために設計されています。 これは、Web アプリをデプロイするための最適な選択肢ではありません。
URL の書き換えまたはリダイレクト
URL を書き換えたりリダイレクトしたりするには、 UrlRewriteFilter などの使用可能な URL リライターのいずれかを使用します。
Tomcat には 書き換えバルブも用意されています。
JBoss EAP には 書き換えバルブも用意されています。
アプリのログ記録とデバッグ
パフォーマンス レポート、トラフィックの視覚エフェクト、および正常性検査は、Azure portal を介して各アプリに対して使用できます。 詳細については、 Azure App Service 診断の概要に関するページを参照してください。
診断ログをストリーミングする
コンテナー内から生成されたコンソール ログにアクセスできます。
コンテナーのログを有効にするには、次のコマンドを実行します。
az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem
<app-name>
と <resource-group-name>
は、Web アプリに適した名前に置き換えます。
コンテナー ログがオンになったら、次のコマンドを実行して、ログのストリームを確認します。
az webapp log tail --name <app-name> --resource-group <resource-group-name>
コンソール ログがすぐに表示されない場合は、30 秒後にもう一度確認してください。
ログ ストリーミングをいつでも停止するには、Ctrl+ キーを押します。
詳細については、「Cloud Shell でのログのストリーム配信」を参照してください。
Linux での SSH コンソール アクセス
コンテナーとの直接 SSH セッションを開くには、アプリが実行されている必要があります。
az webapp ssh コマンドを使用します。
まだ認証されていない場合、接続するには Azure サブスクリプションで認証する必要があります。 認証されると、ブラウザー内シェルが表示され、コンテナー内でコマンドを実行することができます。
注
/home
ディレクトリの外部で行った変更はコンテナー自体に格納され、アプリの再起動後も保持されません。
ローカル コンピューターからリモート SSH セッションを開くには、「 リモート シェルから SSH セッションを開く」を参照してください。
Linux のトラブルシューティング ツール
組み込みの Java イメージは、 Alpine Linux オペレーティング システムに基づいています。
apk
パッケージ マネージャーを使用し、トラブルシューティングのツールやコマンドをインストールします。
Java プロファイラー
Azure App Service 上のすべての Java ランタイムには、Java ワークロードをプロファイリングするための Java Development Kit (JDK) Flight Recorder が付属しています。 これを使用して、Java 仮想マシン (JVM)、システム、およびアプリケーションのイベントを記録し、アプリケーションの問題のトラブルシューティングを行うことができます。
Java プロファイラーの詳細については、 Azure Application Insights のドキュメントを参照してください。
Javaフライトレコーダー
App Service 上のすべての Java ランタイムには、Java Flight Recorder が付属しています。 これを使用して、JVM、システム、およびアプリケーションのイベントを記録し、Java アプリケーションの問題のトラブルシューティングを行うことができます。
App Service に SSH 接続し、 jcmd
コマンドを実行して、実行中のすべての Java プロセスの一覧を表示します。
jcmd
自体に加えて、プロセス ID (PID) 番号を使用して Java アプリケーションが実行されていることがわかります。
078990bbcd11:/home# jcmd
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true
147 sun.tools.jcmd.JCmd
116 /home/site/wwwroot/app.jar
JVM の 30 秒間の記録を開始するには、次のコマンドを実行します。 JVM をプロファイルし、ホーム ディレクトリに jfr_example.jfr
という名前の Java Flight Recorder (JFR) ファイルを作成します。
116
を Java アプリの PID に置き換えます。
jcmd 116 JFR.start name=MyRecording settings=profile duration=30s filename="/home/jfr_example.jfr"
30 秒の期間中には、jcmd 116 JFR.check
を実行することで、記録が取得されていることを確認できます。 コマンドにより、特定の Java プロセスに対するすべての記録が表示されます。
継続的な記録
Java Flight Recorder を使うと、ランタイムのパフォーマンスに対する影響を最小限にして、Java アプリケーションを継続的にプロファイリングできます。 これを行うには、次の Azure CLI コマンドを実行して、必要な構成で JAVA_OPTS
という名前のアプリ設定を作成します。
JAVA_OPTS
アプリ設定の内容は、アプリの起動時に java
コマンドに渡されます。
az webapp config appsettings set -g <your_resource_group> -n <your_app_name> --settings JAVA_OPTS=-XX:StartFlightRecording=disk=true,name=continuous_recording,dumponexit=true,maxsize=1024m,maxage=1d
記録が開始されたら、 JFR.dump
コマンドを使用して、現在の記録データをいつでもダンプできます。
jcmd <pid> JFR.dump name=continuous_recording filename="/home/recording1.jfr"
JFR ファイルの分析
FTPS を使用して、JFR ファイルをローカル コンピューターにダウンロードします。 JFR ファイルを分析するには、 Java Mission Control (JMC) をダウンロードしてインストールします。 Java Mission Control の使用方法については、 JMC のドキュメント と インストール手順を参照してください。
アプリのログ記録
アプリケーションの標準コンソール出力と標準コンソール エラー ストリームをローカル ファイル システムまたは Azure Blob Storage に書き込むよう App Service を構成するには、次の手順を実行します。 Azure portal または Azure CLI でアプリケーション ログを有効にします。 保持期間を長くする必要がある場合は、Blob Storage コンテナーに出力を書き込むようアプリケーションを構成します。
Java と Tomcat アプリのログは、 /home/LogFiles/Application/
ディレクトリにあります。
Linux ベースのアプリの Azure Blob Storage ログは、 Azure Monitor を使用してのみ構成できます。
アプリケーションでトレースに Logback または Log4j を使用している場合は、これらのトレースを Azure Application Insights に転送して確認できます。 「Application Insights を使用した Java トレース ログの探索」にあるログ記録フレームワークの構成手順を使用します。
注
既知の脆弱性 CVE-2021-44228
があるため、必ず Log4j バージョン 2.16 以降を使用してください。
カスタマイズとチューニング
Azure App Service では、Azure portal と Azure CLI を使用したすぐに使用できるチューニングとカスタマイズがサポートされています。 Java 以外の特定の Web アプリの構成については、次の記事を確認してください。
アプリのコンテンツをローカルにコピーする
アプリの設定 JAVA_COPY_ALL
を true
に設定して、共有ファイル システムからローカル worker にアプリ コンテンツをコピーします。 この設定は、ファイル ロックの問題に対処するのに役立ちます。
Java ランタイム オプションを設定する
割り当てられたメモリまたはその他の JVM ランタイム オプションを設定するには、オプションを使用して という名前のJAVA_OPTS
を作成します。 App Service では、開始時にこの設定が環境変数として Java ランタイムに渡されます。
Azure portal の Web アプリの [アプリケーション設定] で、JAVA_OPTS
などの他の設定を含む -Xms512m -Xmx1204m
という名前の新しいアプリ設定を作成します。
Azure portal の Web アプリの [アプリケーション設定] で、CATALINA_OPTS
などの他の設定を含む -Xms512m -Xmx1204m
という名前の新しいアプリ設定を作成します。
Maven プラグインからアプリ設定を構成するには、Azure プラグイン セクションで設定/値のタグを追加します。 次の例では、特定の最小および最大の Java ヒープ サイズを設定します。
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Xms1024m -Xmx1024m</value>
</property>
</appSettings>
注
Windows App Service で Tomcat を使う場合は、Web.config ファイルを作成する必要はありません。
既定では、App Service では、App Service プランで使用可能な合計メモリの 70% に JVM の最大ヒープ サイズが設定されます。 既定の設定を無効にするには、アプリ設定 WEBSITE_DISABLE_JAVA_HEAP_CONFIGURATION="true" を使用できます。
プラットフォームでアプリケーションのパフォーマンスを向上させるには、特定のニーズに合わせてヒープ サイズを調整することが必要になる場合があります。 アプリケーション ヒープ設定をチューニングする場合は、App Service プランの詳細を確認し、最適なメモリ割り当てを見つけるために複数のアプリケーションとデプロイ スロットの要件を検討してください。
Web ソケットを有効にする
アプリケーションのアプリケーション 設定 で、Azure portal で Web ソケットのサポートを有効にします。 設定を有効にするには、アプリケーションを再起動する必要があります。
次のコマンドを使用して、Azure CLI を使用して Web ソケットのサポートを有効にします。
az webapp config set --name <app-name> --resource-group <resource-group-name> --web-sockets-enabled true
その後、アプリケーションを再起動します。
az webapp stop --name <app-name> --resource-group <resource-group-name>
az webapp start --name <app-name> --resource-group <resource-group-name>
既定の文字エンコーディングを設定する
Azure portal の Web アプリの [アプリケーション設定] で、値がJAVA_OPTS
-Dfile.encoding=UTF-8
という名前の新しいアプリ設定を作成します。
または、App Service Maven プラグインを使用してアプリ設定を構成することもできます。 プラグイン構成で、設定名および値のタグを追加します。
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Dfile.encoding=UTF-8</value>
</property>
</appSettings>
JSP ファイルをプリコンパイルする
Tomcat アプリケーションのパフォーマンスを向上させるには、App Service にデプロイする前に、JSP ファイルをコンパイルします。 Apache Sling によって提供される Maven プラグイン を使用することも、 この Ant ビルド ファイルを使用することもできます。
ログ内の robots933456 メッセージを無視する
コンテナー ログで次のメッセージが表示されることがあります。
2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"
このメッセージは無視してかまいません。
/robots933456.txt
は、コンテナーが要求を処理できるかどうかを調べるために App Service が使用するダミーの URL パスです。 404 応答は、パスが存在しないことを示し、コンテナーが正常であり、要求に応答できる状態であることを App Service に知らせます。
Java ランタイム バージョンを選択する
App Service を使用すると、Java 8 や Java 11 などの JVM のメジャー バージョンと、1.8.0_232 や 11.0.5 などのパッチ バージョンを選択できます。 新しいマイナー バージョンが使用可能になったときに、パッチ バージョンを自動的に更新するように選択することもできます。 ほとんどの場合、運用アプリでは固定されたパッチ JVM バージョンを使用する必要があります。これにより、パッチ バージョンの自動更新中に予期しない停止が発生するのを防ぐことができます。 すべての Java Web アプリは、64 ビットの JVM を使用します。これは構成できません。
Tomcat を使用している場合は、Tomcat のパッチ バージョンを固定することができます。 Windows では、JVM のパッチ バージョンと Tomcat のパッチ バージョンを個別に固定できます。 Linux では、Tomcat のパッチ バージョンをピン留めできます。 JVM のパッチ バージョンもピン留めされていますが、個別に構成することはできません。
マイナー バージョンの固定を選択した場合は、アプリの JVM のマイナー バージョンを定期的に更新する必要があります。 アプリケーションが新しいマイナー バージョンで確実に実行されるようにするには、ステージング スロットを作成し、ステージング スロットでマイナー バージョンをインクリメントします。 新しいマイナー バージョンでアプリケーションが正しく実行されていることを確認したら、ステージング スロットと運用スロットをスワップできます。
JBoss CLI を実行する
JBoss EAP アプリの SSH セッションでは、次のコマンドを使用して JBoss CLI を実行できます。
$JBOSS_HOME/bin/jboss-cli.sh --connect
JBoss EAP がサーバー ライフサイクル内のどこにあるかによっては、接続できない場合があります。 しばらく待ってから再試行してください。 このアプローチは、現在のサーバーの状態をすばやく確認する場合に便利です (データ ソースが適切に構成されているかどうかを確認する場合など)。
また、SSH セッションで JBoss CLI を使用してサーバーに加えた変更は、アプリの再起動後も保持されません。 アプリが起動するたびに、JBoss EAP サーバーはクリーン インストールで始まります。 スタートアップ ライフサイクル中、App Service は必要なサーバー構成を作成し、アプリをデプロイします。 JBoss EAP サーバーで永続的な変更を行うには、 カスタム スタートアップ スクリプトまたはスタートアップ コマンドを使用します。 エンド ツー エンドの例については、「 Azure App Service で Java SE、Tomcat、または JBoss EAP アプリのデータ ソースを構成する」を参照してください。
また、スタートアップ時に任意のファイルを実行するように App Service を手動で構成することもできます。 次に例を示します。
az webapp config set --resource-group <group-name> --name <app-name> --startup-file /home/site/scripts/foo.sh
実行できる CLI コマンドの詳細については、以下を参照してください。
クラスタリング
App Service では、JBoss EAP バージョン 7.4.1 以上でのクラスタリングがサポートされています。 クラスタリングを有効にするには、Web アプリを 仮想ネットワークと統合する必要があります。 Web アプリは、仮想ネットワークに統合されている場合、再起動し、JBoss EAP インストールがクラスター化構成で自動的に起動します。
自動スケールを使用して複数のインスタンスを実行すると、JBoss EAP インスタンスは仮想ネットワーク統合で指定されたサブネットを介して相互に通信します。 任意の値を持つ WEBSITE_DISABLE_CLUSTERING
という名前のアプリ設定を作成することによって、クラスタリングを無効にすることができます。
注
ARM テンプレートを使用して仮想ネットワーク統合を有効にする場合は、プロパティ vnetPrivatePorts
を 2
の値に手動で設定する必要があります。 CLI またはポータルから仮想ネットワーク統合を有効にした場合、このプロパティは自動的に設定されます。
クラスタリングが有効になっている場合、JBoss EAP インスタンスは、 FILE_PING
JGroups 検出プロトコルを使用して新しいインスタンスを検出し、クラスター情報 (クラスター メンバー、識別子、IP アドレスなど) を保持します。 App Service では、これらのファイルは /home/clusterinfo/
の下にあります。 起動する最初の EAP インスタンスは、クラスター メンバーシップ ファイルに対する読み取り/書き込みアクセス許可を取得します。 その他のインスタンスは、このファイルを読み取ってプライマリ ノードを見つけた後、クラスターに含まれ、このファイルに追加されるようにそのノードと調整します。
注
アプリの起動時に古い検出ファイルをクリーンアップすることで、JBoss EAP クラスタリングのタイムアウトを回避できます。
Premium V3、Premium V4、Isolated V2 App Service プランの種類は、必要に応じて Availability Zones に分散して、ビジネスクリティカルなワークロードの回復性と信頼性を向上させることができます。 このアーキテクチャはゾーン 冗長とも呼ばれます。 JBoss EAP クラスタリング機能は、ゾーン冗長機能と互換性があります。
自動スケール ルール
水平スケーリング用に自動スケール ルールを構成する場合は、削除された各インスタンスがそのアクティビティ (データベース トランザクションの処理など) をクラスターの別のメンバーに確実に転送できるように、インスタンスを増分 (一度に 1 つずつ) 削除することが重要です。 スケールダウンするようにポータルで自動スケール ルールを構成する場合は、次のオプションを使用します。
- 操作: "カウントを減らす量"
- クールダウン: 「5分」以上
- インスタンス数: 1
インスタンスを段階的に追加する必要はありません (スケールアウト)。 一度に複数のインスタンスをクラスターに追加できます。
App Service プラン
JBoss EAP は、F1、P0v3、P1mv3、P2mv3、P3mv3、P4mv3、P0v4、P1mv4、P2mv4、P3mv4、P4mv4、P5mv4 の価格レベルで利用できます。
JBoss EAP サーバーのライフサイクル
App Service の JBoss EAP アプリは、サーバーを起動する前に 5 つの異なるフェーズを経ます。
カスタマイズの詳細と機会については、次のセクションを参照してください ( アプリの設定など)。
1. 環境のセットアップ フェーズ
- SSH サービスが開始され、コンテナーとの セキュリティで保護された SSH セッション が有効になります。
- Java ランタイム キーストアは、Azure portal で定義されているすべてのパブリック証明書とプライベート証明書で更新されます。
- パブリック証明書は、
/var/ssl/certs
ディレクトリ内のプラットフォームによって提供され、$JRE_HOME/lib/security/cacerts
に読み込まれます。 - プライベート証明書は、
/var/ssl/private
ディレクトリ内のプラットフォームによって提供され、$JRE_HOME/lib/security/client.jks
に読み込まれます。
- パブリック証明書は、
- この手順で Java キーストアに証明書が読み込まれると、プロパティ
javax.net.ssl.keyStore
、javax.net.ssl.keyStorePassword
、およびjavax.net.ssl.keyStoreType
がJAVA_OPTS
環境変数に追加されます。 - ログ ディレクトリや Java メモリ ヒープ パラメーターなど、いくつかの初期 JVM 構成が決定されます。
- アプリ設定
–Xms
でメモリに–Xmx
フラグまたはJAVA_OPTS
フラグを指定すると、プラットフォームによって提供されるフラグは、これらの値によってオーバーライドされます。 - アプリ設定を
WEBSITES_CONTAINER_STOP_TIME_LIMIT
構成した場合、この値はランタイム プロパティorg.wildfly.sigterm.suspend.timeout
に渡されます。このプロパティは、JBoss EAP が停止しているときの最大シャットダウン待機時間 (秒単位) を制御します。
- アプリ設定
- アプリが仮想ネットワークと統合されている場合、App Service ランタイムは環境変数
WEBSITE_PRIVATE_PORTS
でサーバー間通信に使用するポートの一覧を渡し、clustering
構成を使用して JBoss EAP を起動します。 それ以外の場合は、standalone
構成が使用されます。-
clustering
構成では、サーバー構成ファイルstandalone-azure-full-ha.xml
が使用されます。 -
standalone
構成では、サーバー構成ファイルstandalone-full.xml
が使用されます。
-
2. サーバー起動フェーズ
-
clustering
構成で JBoss EAP が起動した場合:- 各 JBoss EAP インスタンスは、0 からアプリがスケールアウトされるインスタンスの数までの内部識別子を受け取ります。
- (内部識別子を使用して) このサーバー インスタンスのトランザクション ストア パスに一部のファイルが見つかった場合は、このサーバー インスタンスが同じサービス インスタンスの代わりに使用されていることを意味します。 もう 1 つのサービス インスタンスは以前にクラッシュし、コミットされていないトランザクションを残しました。 サーバーは、これらのトランザクションの作業を再開するように構成されています。
- JBoss EAP が
clustering
またはstandalone
のどちらの構成で開始されるかに関係なく、サーバー バージョンが 7.4 以降で、ランタイムが Java 17 を使用している場合、構成は更新され、Elytron サブシステムのセキュリティが有効になります。 - アプリ設定
WEBSITE_JBOSS_OPTS
を構成すると、値は JBoss ランチャー スクリプトに渡されます。 この設定を使用すると、プロパティ ファイルへのパスや、JBoss EAP の起動に影響を与えるその他のフラグを指定できます。
3. サーバーの構成フェーズ
このフェーズの開始時に、App Service はまず、JBoss EAP サーバーと管理インターフェイスの両方が要求を受信する準備が整うのを待ってから続行します。 Application Insights が有効になっている場合、このプロセスには数秒かかることがあります。
JBoss EAP Server と管理インターフェイスの両方の準備ができたら、App Service は次のアクションを実行します。
- ログ記録と App Service との統合のためのユーティリティ クラスを提供する JBoss EAP モジュール
azure.appservice
を追加します。 - ログ ファイルがカラー エスケープ シーケンスでいっぱいにならないよう、コンソール ロガーを更新して無色モードを使用します。
- Azure Monitor ログとの統合を設定します。
- Web サービス記述言語 (WSDL) および管理インターフェイスのバインド IP アドレスを更新します。
-
azure.appservice.easyauth
と Microsoft Entra ID と統合するための JBoss EAP モジュール を追加します。 - アクセス ログのログ構成と、メイン サーバー ログ ファイルの名前とローテーションを更新します。
- ログ記録と App Service との統合のためのユーティリティ クラスを提供する JBoss EAP モジュール
アプリ設定
WEBSITE_SKIP_AUTOCONFIGURE_DATABASE
が定義されていない限り、App Service は App Service アプリ設定で Java Database Connectivity (JDBC) URL を自動検出します。 PostgreSQL、MySQL、MariaDB、Oracle、SQL Server、または Azure SQL Database に対して有効な JDBC URL が存在する場合は、サーバーに対応するドライバーを追加し、各 JDBC URL のデータ ソースを追加し、各データ ソースの Java 名前付けおよびディレクトリ インターフェイス (JNDI) 名をjava:jboss/env/jdbc/<app-setting-name>_DS
に設定します。ここで、<app-setting-name>
はアプリ設定の名前です。clustering
構成が有効になっている場合は、構成するコンソール ロガーがオンになっています。/home/site/libs
ディレクトリにデプロイされた JAR ファイルがある場合は、これらすべての JAR ファイルを使用して新しいグローバル モジュールが作成されます。フェーズの終了時、App Service によってカスタム スタートアップ スクリプトが実行されます (そのスクリプトが存在する場合)。 カスタム スタートアップ スクリプトの検索ロジックは、次のように定義されます。
- スタートアップ コマンドを構成した場合 (たとえば、Azure portal または Azure CLI を使用して)、それを実行します。然も無くば
- パス
/home/site/scripts/startup.sh
存在する場合は使用します。それ以外の場合は、 - パス
/home/startup.sh
存在する場合は、それを使用します。
カスタム スタートアップ コマンドまたはスクリプトはルート ユーザーとして実行されるため ( sudo
不要)、Linux パッケージをインストールしたり、JBoss CLI を起動して、データ ソースの作成やリソース アダプターのインストールなど、JBoss EAP のインストール/カスタマイズ コマンドを実行したりできます。 Ubuntu パッケージ管理コマンドの詳細については、 Ubuntu Server のドキュメントを参照してください。 JBoss CLI コマンドについては、 JBoss Management CLI ガイドを参照してください。
4. アプリ デプロイ フェーズ
スタートアップ スクリプトは、優先順位に従って次の場所を調べることで、JBoss EAP にアプリをデプロイします。
- アプリ設定
WEBSITE_JAVA_WAR_FILE_NAME
を構成した場合は、それによって指定されたファイルをデプロイします。 -
/home/site/wwwroot/app.war
存在する場合は、デプロイします。 - 他の EAR ファイルと WAR ファイルが
/home/site/wwwroot
に存在する場合は、それらをデプロイします。 -
/home/site/wwwroot/webapps
存在する場合は、その中にファイルとディレクトリをデプロイします。 WAR ファイルはアプリケーション自体として、ディレクトリは "展開済み" (圧縮されていない) Web アプリとしてデプロイされます。 -
/home/site/wwwroot
にスタンドアロン JSP ページが存在する場合は、Web サーバー のルートにコピーし、1 つの Web アプリとしてデプロイします。 - 配置可能なファイルが見つからない場合は、ルート コンテキストで既定のウェルカム ページ (パーキング ページ) を展開します。
5.サーバーの再読み込みフェーズ
- 展開手順が完了すると、JBoss EAP サーバーが再読み込みされ、サーバーの再読み込みが必要な変更が適用されます。
- サーバーが再読み込みされた後、JBoss EAP サーバーにデプロイされたアプリケーションは、要求に応答する準備ができている必要があります。
- サーバーは、App Service アプリが停止または再起動されるまで実行されます。 App Service アプリは手動で停止または再起動できます。または、ファイルのデプロイ時または App Service アプリ構成の変更時に再起動をトリガーします。
- JBoss EAP サーバーが
clustering
構成で異常終了した場合は、emit_alert_tx_store_not_empty
と呼ばれる最終的な関数が実行されます。 この関数は、JBoss EAP プロセスが空でないトランザクション ストア ファイルをディスクに残したかどうかを確認します。 その場合は、コンソールにエラーが記録されます:Error: finishing server with non-empty store for node XXXX
。 新しいサーバー インスタンスが起動されると、これらの空でないトランザクション ストア ファイルが検索され、作業が再開されます ( 2 を参照してください。サーバー起動フェーズ)。
Tomcat ベースライン構成
注
このセクションは Linux にのみ適用されます。
Java 開発者は、Tomcat の server.xml ファイルと構成の詳細がわかっている場合は、サーバー設定のカスタマイズ、問題のトラブルシューティング、Tomcat へのアプリケーションのデプロイを確実に行うことができます。 次のようなカスタマイズが可能です。
- Tomcat 構成のカスタマイズ: server.xml ファイルと Tomcat の構成の詳細を理解したら、アプリケーションのニーズに合わせてサーバー設定を微調整できます。
- デバッグ: アプリケーションが Tomcat サーバーにデプロイされるとき、開発者は発生する可能性のある問題をデバッグするためにサーバー構成を知る必要があります。 このプロセスには、サーバー ログの確認、構成ファイルの確認、発生している可能性のあるエラーの特定が含まれます。
- Tomcat の問題のトラブルシューティング: Java 開発者は、パフォーマンスの問題や構成エラーなど、Tomcat サーバーに関する問題に必然的に直面します。 server.xml ファイルと Tomcat の構成の詳細を理解すると、開発者はこれらの問題を迅速に診断してトラブルシューティングできるため、時間と労力を節約できます。
- Tomcat へのアプリケーションのデプロイ: Java Web アプリケーションを Tomcat にデプロイするには、開発者は server.xml ファイルとその他の Tomcat 設定を構成する方法を知る必要があります。 アプリケーションを正常にデプロイし、サーバー上で円滑に実行されるようにするには、これらの詳細を理解する必要があります。
Java ワークロード (WAR ファイルまたは JAR ファイル) をホストするために組み込みの Tomcat を使用してアプリを作成する場合、Tomcat の構成には、すぐに使用できる特定の設定があります。 Tomcat Web Server の既定の構成など、詳細については、 公式の Apache Tomcat ドキュメント を参照してください。
さらに、起動時に Tomcat ディストリビューションの server.xml の上に適用される特定の変換があります。 これらの変換には、 コネクタ、 ホスト、 バルブ の設定の変更が含まれます。
最新バージョンの Tomcat には server.xml が存在します (8.5.58 および 9.0.38 以降)。 以前のバージョンの Tomcat では変換が使用されず、結果として動作が異なる可能性があります。
コネクタ
<Connector port="${port.http}" address="127.0.0.1" maxHttpHeaderSize="16384" compression="on" URIEncoding="UTF-8" connectionTimeout="${site.connectionTimeout}" maxThreads="${catalina.maxThreads}" maxConnections="${catalina.maxConnections}" protocol="HTTP/1.1" redirectPort="8443"/>
-
maxHttpHeaderSize
は16384
に設定されます。 -
URIEncoding
はUTF-8
に設定されます。 -
connectionTimeout
はWEBSITE_TOMCAT_CONNECTION_TIMEOUT
に設定され、既定では240000
に設定されます。 -
maxThreads
はWEBSITE_CATALINA_MAXTHREADS
に設定され、既定では200
に設定されます。 -
maxConnections
はWEBSITE_CATALINA_MAXCONNECTIONS
に設定され、既定では10000
に設定されます。
注
connectionTimeout
、maxThreads
、およびmaxConnections
の設定は、アプリの設定で調整できます。
connectionTimeout
、maxThreads
、またはmaxConnections
の値を変更するために使用できる CLI コマンドの例を次に示します。
az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_TOMCAT_CONNECTION_TIMEOUT=120000
az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_CATALINA_MAXTHREADS=100
az webapp config appsettings set --resource-group myResourceGroup --name myApp --settings WEBSITE_CATALINA_MAXCONNECTIONS=5000
コネクタでは、127.0.0.1 ではなくコンテナーのアドレスが使用されます。
ホスト
<Host appBase="${site.appbase}" xmlBase="${site.xmlbase}" unpackWARs="${site.unpackwars}" workDir="${site.tempdir}" errorReportValveClass="com.microsoft.azure.appservice.AppServiceErrorReportValve" name="localhost" autoDeploy="true">
-
appBase
はAZURE_SITE_APP_BASE
に設定され、既定ではローカルWebappsLocalPath
に設定されます。 -
xmlBase
はAZURE_SITE_HOME
に設定され、既定では/site/wwwroot
に設定されます。 -
unpackWARs
はAZURE_UNPACK_WARS
に設定され、既定ではtrue
に設定されます。 -
workDir
はJAVA_TMP_DIR
に設定され、既定値はTMP
です。 -
errorReportValveClass
は、カスタムエラーレポートバルブを使用します。
バルブ
<Valve prefix="site_access_log.${catalina.instance.name}" pattern="%h %l %u %t "%r" %s %b %D %{x-arr-log-id}i" directory="${site.logdir}/http/RawLogs" maxDays="${site.logRetentionDays}" className="org.apache.catalina.valves.AccessLogValve" suffix=".txt"/>
-
directory
はAZURE_LOGGING_DIR
に設定され、既定ではhome\logFiles
に設定されます。 -
maxDays
はWEBSITE_HTTPLOGGING_RETENTION_DAYS
に設定され、既定では7
に設定されます。 この値は、アプリケーション ログ プラットフォームの既定値に合わせて調整されます。
Linux では、同じカスタマイズがすべて行われ、エラーとレポート ページがバルブに追加されます。
<xsl:attribute name="appServiceErrorPage">
<xsl:value-of select="'${appService.valves.appServiceErrorPage}'"/>
</xsl:attribute>
<xsl:attribute name="showReport">
<xsl:value-of select="'${catalina.valves.showReport}'"/>
</xsl:attribute>
<xsl:attribute name="showServerInfo">
<xsl:value-of select="'${catalina.valves.showServerInfo}'"/>
</xsl:attribute>
関連コンテンツ
Azure for Java Developers センターにアクセスして、Azure のクイック スタート、チュートリアル、Java リファレンス ドキュメントを確認してください。