Webアプリケーションの開発・運用時に発生する以下のトラブルについて対処方法を説明します。
JSPのコンパイルに失敗した場合
以下の可能性が考えられます。
JSPに誤りがある
使用できるのはJSP 2.3に準拠したJSPです。
JSPの文法に誤りがないか確認してください。
JSP 2.3の文法についてはJSP 2.3の仕様を参照してください。
JSPの文字コードを正しく指定していない
JSPファイルの文字コードを正しく指定していないためにJSPをコンパイルする際に文字化けが発生している可能性があります。
JSPの文字コードを正しく指定してください。
文字コードの指定方法についてはJSP 2.3の仕様を参照してください。
JSPから使用しているクラスが存在しない
JSPから使用するクラスは、Webクラスローダから参照できる必要があります。
詳細は、「2.22 クラスローダ」を参照してください。
無名パッケージのクラスを使用している
JSPからは無名パッケージのクラスを使用することはできません。
JSPから使用するクラスにはパッケージ名を指定してください。
JSPファイルのサイズが上限値を超えている
JSPファイルのサイズが大きすぎます。
ファイルサイズの設定変更はできません。
以下の対処を行ってください。
タグ(アクションやスクリプティング要素)の間の不要な記載(スペース、コメント、改行など)がある場合は削除してください。
JSPファイルを分割し、動的にincludeしてください。
JSPまたはJSPから静的includeされているファイルを更新しても実行時に反映されない
以下の可能性が考えられます。
JSPコンパイル中にJSPまたはJSPから静的includeされているファイルの更新を行った。
JSPまたはJSPから静的includeされているファイルの置き換えを行ったが、ファイルのタイムスタンプが前回JSPのコンパイルを行った時刻よりも過去であった。
以下の対処を行ってください。
JSPまたはJSPから静的includeされているファイルのタイムスタンプをマシンの現在時刻に更新してください。
エラーページとして指定したページがWebブラウザに表示されない場合
「1.4.3 Webアプリケーションの注意事項」の「エラーページについて」の「Webブラウザの設定」を参照してください。
日本語などのマルチバイト文字を含むURIにアクセスすると、Webブラウザにステータスコード「404 Not Found」や「400 Bad Request」が通知される
ネットワーク設定の定義項目の「リクエストURIの解析に使用するエンコーディング(uri-encoding)」と、Webブラウザから送信されたリクエストURIのエンコードが一致しているか確認してください。また、Webブラウザがどのエンコード方式でリクエストURIをエンコードするかを確認してください。
運用資産のリストア後、Webブラウザにステータスコード「404 Not Found」が通知される
GlassFish運用資産をリストアした場合、isprintbackuprscコマンドで表示されたバックアップ対象サービスの運用資産もリストアしているか確認してください。特に、Webサーバー連携をしている場合は、Interstage HTTP Server 2.4運用資産、Webサーバコネクタ(Interstage HTTP Server 2.4用)の運用資産のリストアを実施するようにしてください。
GlassFish Serverクラスターへの接続ができていない場合
以下の可能性があります。
クライアントからのリクエストが、Webコンテナの同時処理数を超えている。かつ
Webアプリケーションの処理に時間がかかっており、レスポンスが遅延している。
以下の対処を行ってください。
「Webコンテナのチューニング」の「同時処理数」を増やしてください。
Webアプリケーションからの応答がない場合
サーバーとの通信がタイムアウトしている可能性があります。
Webアプリケーションの処理が遅延しているか確認のうえ、Webアプリケーションの処理時間が想定内だった場合は、Webサーバコネクタの送受信タイムアウトの値を増やすよう変更してください。送受信タイムアウトの変更については、WebサーバーとGlassFish Serverクラスターの連携設定に応じて以下のサブコマンドを使用してください。
同じマシン(同一筐体)で運用する場合:11.1.10.7 update-web-server-connector-configサブコマンド
別のマシン(別筐体)で運用する場合:11.15.3 update-cluster-configサブコマンド
送受信タイムアウトの詳細は、「6.16.1 HTTP通信」を参照してください。
WebサーバーとGlassFish Serverクラスターを別のマシンで運用する場合には、WebサーバーとGlassFish Serverクラスター間でネットワーク接続に異常がないか確認してください。
Webアプリケーションの処理に時間がかかっている場合、チューニングにより改善する場合があります。「6.4 Webコンテナのチューニング」を参照して、Webコンテナをチューニングしてください。
本エラーメッセージが慢性的に出力される場合には、GlassFish Serverインスタンスを追加したり、システム構成(ハードウェア、ソフトウェア)を見直して、負荷に対して十分なシステムを構築してください。必要であればCPUのアップグレードも検討してください。また、ログを参照し、Java VMのメモリ不足(OutOfMemoryError)が発生している場合には、「チューニングガイド」の「OpenJDK 8のチューニング」-「異常発生時の原因振り分け」-「java.lang.OutOfMemoryErrorがスローされた場合」を参照して対処してください。
DASに配備したWebアプリケーションとの通信に失敗する場合
以下の可能性があります。
配備したWebアプリケーションに対して大量のリクエストを送信している。
以下の対処を行ってください。
DASに配備したWebアプリケーションの実行は、開発環境でのみ実施してください。大量のリクエストを送信する場合、運用環境に構築したGlassFish Serverクラスター上で実施してください。
Webブラウザにステータスコード「400 Bad Request」が通知される
Webコンテナで受信したリクエストと、ネットワーク設定の定義項目「Webコンテナへアクセスする運用形態(request-check)」が一致していない可能性があります。詳細は、「4.7 Webサーバーを経由する場合の運用準備」、「9.8.3 ネットワーク設定の定義項目」を参照し、運用形態の見直しを実施してください。
サイズの上限に関する以下の定義項目の設定値を超過したリクエストが来たため、リクエスト処理が実行されなかった可能性があります。「9.8.3 ネットワーク設定の定義項目」を参照して、これらの定義項目の設定値を超えるリクエストが送られることが無いか確認してください。
受信バッファーサイズ
リクエストヘッダ数の上限値
Webサーバー連携の設定に不整合が生じている可能性があります。「Webアプリケーションにアクセスできない」を参照し、設定内容の確認と対処を行ってください。
Webサーバー連携している場合、ブラウザ等のHTTPクライアントから送信されたデータを、Webサーバーがタイムアウト時間経過しても読み込むことができなかった可能性が考えられます。ブラウザ等のHTTPクライアントから送信されたデータがWebサーバーで受信可能な状態になっているか、確認してください。また、ネットワーク経路で異常が発生していないか、確認してください。
Webブラウザにステータスコード「403 Forbidden」が通知される
Webコンテナが受信したリクエストの送信元が、Webコンテナに許可されていない可能性があります。
HTTPサービスの定義項目「要求を受け付けるIPアドレス」を参照し、要求を受け付けるIPアドレスの設定を確認してください。
なお、リクエストの送信元IPアドレスは、HTTPアクセスログの出力フォーマット「%webserver.name%」に出力されます。
Webブラウザにステータスコード「404 Not Found」が通知される
Webサーバコネクタを使用してWebサーバーと連携している場合は、以下に示す操作を行ったあとにWebサーバーの再起動をしていない可能性があります。
Webサーバーと、GlassFish ServerクラスターまたはDASとの連携設定を変更したとき
GlassFish Serverクラスターに対するWebサーバコネクタの環境設定を更新したとき
GlassFish Serverインスタンスを追加または削除したとき
アプリケーションを配備または解除したとき
以下の定義項目を変更したとき
「Webアプリケーションの定義項目」の「コンテキストルート」
「ネットワーク設定の定義項目」の「ネットワークアドレス」、「ポート番号」または「HTTPリスナーの有効化」
システムプロパティの「HTTP_LISTENER_PORT」の値を変更したとき
これらの操作を行ったあとはWebサーバーを再起動する必要があります。設定を反映させるために、Webサーバーを再起動してください。
Webサーバーを経由する場合の運用準備については、「4.7 Webサーバーを経由する場合の運用準備」を参照してください。
Webサーバー連携の設定に不整合が生じている可能性があります。「Webアプリケーションにアクセスできない」を参照し、設定内容の確認と対処を行ってください。
Webブラウザにステータスコード「500 Internal Server Error」が通知される
Webアプリケーションの処理に失敗している可能性があります。サーバーログにエラーが出力されていないか確認してください。
また、Webアプリケーションからの応答待ちで、サーバーとの通信がタイムアウトしている可能性があります。
Webアプリケーションの処理が遅延しているか確認のうえ、Webアプリケーションの処理時間が想定内だった場合は、Webサーバコネクタのタイムアウト時間を増やすよう変更してください。
Webアプリケーションからの応答がない場合の詳細は、「Webアプリケーションからの応答がない場合」を参照してください。
Webブラウザにステータスコード「502 Proxy Error」が通知される
GlassFish ServerクラスターとWebサーバーが連携している場合、以下の設定値を超過したリクエストやレスポンスを処理しようとしたため、GlassFish Serverクラスターによって接続が切断されている可能性があります。
設定値が妥当か確認し、必要に応じて以下をチューニングしてください。
Webアプリケーションからの応答待ちで、サーバーとの通信がタイムアウトしている可能性があります。
Webアプリケーションの処理が遅延しているか確認のうえ、Webアプリケーションの処理時間が想定内だった場合は、Webサーバコネクタの送受信タイムアウトの設定値を増やすよう変更してください。
Webアプリケーションからの応答がない場合の詳細は、「Webアプリケーションからの応答がない場合」を参照してください。
Webブラウザにステータスコード「503 Service Unavailable」が通知される
GlassFish Serverクラスター配下のGlassFish Serverインスタンスがすべて停止している可能性があります。pcmilistprocessesコマンドを実行し、GlassFish Serverクラスター配下のGlassFish Serverインスタンスがすべて停止していないかを確認してください。
Webサーバー連携の設定に不整合が生じている可能性があります。「Webアプリケーションにアクセスできない」を参照し、設定内容の確認と対処を行ってください。
Webアプリケーションにアクセスできない
Webサーバー連携の設定に不整合が生じている可能性があります。wscadmin list-web-serversサブコマンドに--detailオプションを指定して実行し、Webアプリケーションを配備しているGlassFish ServerクラスターのAddressに表示されているIPアドレスとポート番号が正しいか確認をしてください。正しくない値が設定されている場合は、以下の手順で再設定を行ってください。
WebサーバーとGlassFish Serverクラスターを同じマシンで運用する場合
asadmin delete-web-server-refサブコマンドを使用し、Webサーバーとの連携をいったん解除します。
asadmin create-web-server-refサブコマンドを使用し、Webサーバーと再度連携させます。
必要に応じて、asadmin update-web-server-connector-configサブコマンドを使用し、Webサーバコネクタの環境設定を更新してください。
対象のWebサーバーを再起動します。
WebサーバーとGlassFish Serverクラスターを異なるマシンで運用する場合
wscadmin delete-instance-ref サブコマンドのオペランドにallを指定し、Webサーバーとの連携をいったん解除します。
wscadmin add-instance-refサブコマンドやadd-application-refサブコマンドを使用し、Webサーバーと再度連携させます。
必要に応じて、wscadmin update-cluster-configサブコマンドを使用し、Webサーバコネクタの環境設定を更新してください。
対象のWebサーバーを再起動します。
ネットワーク設定の定義項目「リクエストURIの解析に使用するエンコーディング」の設定値に不正な値が指定されている可能性があります。「リクエストURIの解析に使用するエンコーディング」の値が、Javaでサポートされているエンコーディングかどうか確認してください。
ネットワーク設定の定義項目「Webコンテナへアクセスする運用形態」が、実際の運用形態と異なる設定となっている可能性があります。Webサーバーを経由する運用と、Webサーバーを経由しない運用の両方を許可する場合は、“nocheck”を設定してください。
Servletのファイルアップロードで、送信するファイルが2GByteを超えると、アップロードに失敗する
送信するファイルのサイズが2GByteを超えると、ブラウザがContent-Lengthヘッダーに実際のファイルのバイト数とは異なる値を設定する場合があります。この場合、WebコンテナはIOExceptionをスローします。なお、巨大なファイルを送信するとネットワークが過負荷になるため、適切にサイズ制限をすることをお勧めします。
Servletのファイルアップロードで、javax.servlet.http.HttpServletRequest#getPart(String)やgetParts()を実行すると、例外が発生する
ServletExceptionがスローされる場合
HTTPヘッダーのContent-Typeに不正なMIMEタイプが指定されている可能性があります。ファイルアップロード機能を利用する場合は、multipart/form-dataを指定する必要があります。Content-Typeヘッダーの指定が正しいか、確認してください。
IllegalStateExceptionがスローされる場合
アノテーションのmaxRequestSizeやweb.xmlのmax-request-sizeで指定した値を超えてファイルがアップロードされた可能性があり、正しくサイズ制限ができています。アプリケーションにIllegalStateExceptionを捕捉(catch)する処理を追加してください。
IOExceptionがスローされる場合
ネットワーク設定の定義項目の受信タイムアウトを超過した場合に、IOExceptionがスローされます。WebブラウザやWebサーバコネクタなどから、アップロードデータを受信できなかったことを意味しています。そのため、受信タイムアウトを長くして問題が解決するか、確認してください。
Webアプリケーションにアクセスすると白紙のページが返却される
以下の可能性があります。
glassfish-web.xmlのparameter-encoding、またはweb.xml(Servlet4.0以降)のrequest-character-encodingにサポートしない不正な値が指定されている。
以下の対処を行ってください。
glassfish-web.xmlのparameter-encoding、またはweb.xml(Servlet4.0以降)のrequest-character-encodingの値が、Javaでサポートされているエンコーディングかどうか確認してください。
glassfish-web.xmlの詳細は、「3.2.1.2 GlassFish Web application deployment descriptor (glassfish-web.xml)」を参照してください。
HTTPセッションが継続されない
Webサーバコネクタを使用してWebサーバーと連携している場合、Webサーバー連携の設定に不整合が生じている可能性があります。「13.2 コマンド実行時の異常」の「asadminコマンド実行時、メッセージOM2120が出力される場合」を参照し、設定内容の確認と対処を行ってください。
WebSocket接続に失敗する
Webサーバーを経由する運用形態で、バーチャルホスト利用時にWebSocket接続の確立に失敗する場合、バーチャルホストに必要な設定が実施されていない可能性があります。詳細については、「1.4.22 Webサーバコネクタの注意事項」の「バーチャルホストとWebSocketを使用する場合の注意」を参照してください。
WebサーバコネクタとGlassFish間の接続がHTTP/2にならない
WebサーバコネクタとGlassFish間の接続に使用するプロトコルに「http2」を指定しているにも関わらず、実際の接続がHTTP/2にならない場合には、以下の可能性が考えられます。
WebサーバーでHTTP/2を有効にしていない可能性があります。WebサーバーでHTTP/2を有効にする方法については、「Interstage HTTP Server 2.4運用ガイド」の「環境設定」-「HTTP/2の環境設定」を参照してください。
クライアント(ブラウザ)とWebサーバー間のプロトコルがHTTP/2でない可能性があります。WebサーバコネクタとGlassFish間の接続に使用するプロトコルは、クライアント(ブラウザ)とWebサーバー間のプロトコルによって動的に切り換えられるため、対処は不要です。詳細は「11.15.3 update-cluster-configサブコマンド」を参照してください。
バーチャルホスト利用時に接続がHTTP/2にならない場合は、バーチャルホストに必要な設定が実施されていない可能性があります。詳細については、「1.4.22 Webサーバコネクタの注意事項」の「バーチャルホストとHTTP/2を使用する場合の注意」を参照してください。
ヘッダの異常について
リクエストヘッダの値をWebアプリケーションから取得できない場合、他のリクエストヘッダの値が取得できるのであれば、取得できないヘッダはGlassFishによって予約されている可能性があります。他のヘッダの使用を検討してください。
Webサーバコネクタの動作環境を作成したWebサーバーでは、振り分け対象のWebアプリケーション以外へのリクエストについて、以下の現象となる場合があります。
この現象となるヘッダを使用している場合には、他のヘッダの使用を検討してください。
Webサーバコネクタが予約している固有のヘッダがリクエストヘッダに追加される。
Webサーバコネクタが予約している固有のヘッダがリクエストに含まれる場合、当該ヘッダが変更または削除される。
HTTP/2 通信時、サーバーログに「The thread pool's task queue is full」が出力されている場合
サーバーログに以下のメッセージが出力されている場合は、キューサイズを拡張してください。
The thread pool's task queue is full, limit: <数字>
キューサイズを拡張する場合は、以下の目安でキューサイズを設定してください。
最大接続数 × 100 の値を設定してください。
キューサイズは、asadminコマンドを使用して変更できます。詳細は、以下を参照してください。
HTTP/2 通信では、HTTP/2のリクエスト・レスポンスは多重化されます。そのため、GlassFishで同時発生するリクエスト・レスポンス数はHTTP/1.x通信時より多く発生する場合があります。最大同時ストリーム(多重化)数はクライアント側の設定であり、GlassFishでは制御することはできません。
WebサーバーのエラーログにAH00940メッセージが出力される場合
Webサーバーを経由する運用形態において、WebサーバーのエラーログにAH00940メッセージが出力される場合があります。このメッセージは、WebサーバーがGlassFishに接続できない場合や、GlassFishから応答が返らない場合に出力されます。原因として考えられる以下の項目を確認し、該当する項目の対処を実施してください。
ネットワークに異常がある
ネットワークの異常によりGlassFishに接続できていない可能性があります。ネットワーク経路で異常が発生していないか確認してください。
Webアプリケーションの処理時間が長い
HTTPアクセスログにおいて、リクエストの処理開始からWebアプリケーションの処理終了までの時間が長い場合は、Webアプリケーションの処理に時間が掛かっています。Webアプリケーションの処理に問題がないか見直してください。HTTPアクセスログの詳細については、「4.17.3 HTTPアクセスログ」を参照してください。
キューにリクエストが滞留している
モニタロギングのHTTP接続キュー情報において、キュー内に同時に存在していたHTTPリクエストの最大数の値が大きい場合は、キューにリクエストが滞留していてGlassFishの応答が遅延している可能性があります。スレッドプールの定義項目「最大プールサイズ」をチューニングするか、GlassFish Serverインスタンスを増やしてリクエストを分散させてください。モニタロギングの詳細については、「6.17 モニタロギング」を参照してください。
ガーベジコレクション(GC)が影響している
モニタロギングのJava VM情報において、Full GCおよびGCの発生回数や処理トータル時間の値が大きい場合は、GCの影響でGlassFishの応答が遅延している可能性があります。Java VMのヒープ領域サイズに余裕を持たせるため、「6.1.2 Java VMのヒープ領域サイズ/メタスペースサイズ」および「6.3.2 Java VMのヒープ領域サイズ/メタスペースサイズ」を参照し、Java VMのヒープ領域サイズをチューニングしてください。モニタロギングの詳細については、「6.17 モニタロギング」を参照してください。
システムの負荷が高まっている
システムの負荷が高まっている(CPU使用率高騰やメモリ枯渇などが発生している)可能性があります。システムの性能情報を取得して、システムの負荷が高い場合は、運用環境に合わせてシステムのリソースをチューニングしてください。
リクエストボディを取得できない、またはIOExceptionが発生する場合
Webアプリケーションからリクエストボディを取得できない場合、または、リクエストボディ取得時にIOExceptionが発生する場合、ネットワークの定義項目の「受信タイムアウト」までにリクエストボディを受信できていない可能性があります。以下の対処を実施してください。
ネットワークに異常がないか確認してください。
リクエストボディの受信に時間が掛かることが想定通りである場合は、受信タイムアウトの値を大きくしてください。
現象が多発する場合は、受信タイムアウトの値を小さくして、Webアプリケーション側で例外処理を実施することを検討してください。受信タイムアウトの値を小さくすることで、Webコンテナの処理がスレッドを占有する時間が短くなり、処理待ちのリクエストの数が減少してシステムの負荷が抑えられることで、結果として現象が解消する場合があります。
HTTP/2で通信している場合、HTTP接続キューにリクエストが滞留していて現象が発生する場合があります。 現象が頻発する場合は、キューへのリクエストの滞留を軽減するために、同時処理数またはGlassFish Serverインスタンスを増やしてください。詳細は「6.4.2 同時処理数」を参照してください。
ネットワーク設定の定義項目「HTTP接続のタイムアウト」によるタイムアウトの影響で現象が発生する場合があります。現象が頻発する場合は、HTTP接続のタイムアウトを十分に大きな値に設定してください。詳細は「6.4.4 キープアライブ」を参照してください。
Webアプリケーションの処理に時間がかかっていて、サーバーとの通信がタイムアウトしている可能性があります。Webアプリケーションの処理が遅延しているか確認のうえ、Webアプリケーションの処理時間が想定内だった場合は、Webサーバコネクタの送受信タイムアウトの値を増やすよう変更してください。 送受信タイムアウトの変更については、WebサーバーとGlassFish Serverクラスターの連携設定に応じて 以下のサブコマンドを使用してください。
同じマシン(同一筐体)で運用する場合:11.1.10.7 update-web-server-connector-configサブコマンド
別のマシン(別筐体)で運用する場合:11.15.3 update-cluster-configサブコマンド
送受信タイムアウトの詳細は、「6.16.1 HTTP通信」を参照してください。
ネットワークの輻輳により現象が発生する場合があります。上記の対処を実施しても現象が発生する場合は、クライアント側で時間間隔を空けてリクエストを再送してください。