WebOTX運用編(TomcatからWebOTXへの移行ガイド)
5 Q&A
Tomcatからの移行時によく起きる問題やTomcatからの移行以外にもよくある質問に対するQ&Aをまとめました。
5.1. Webアプリケーションの実行エラーに関するQ&A
Q1 Webアプリケーションを実行するとClassCastExceptionが発生するのですが、どのような原因が考えられますか?
A1 対象となるクラスのロードが正しく行われていない可能性があります。nec-web.xmlの設定を変更して、クラスのロード処理を変えて、アプリケーションの動作を確認してください。
設定の変更については、本資料の「2.6.章 追加になった設定ファイル(nec-web.xml)の設定」を参照してください。
Q2 Webアプリケーションを実行するとセキュリティ例外が発生するのですが、どのような原因が考えられますか?
A2 セキュリティポリシーの追加が必要です。本資料の「2.7 セキュリティポリシーの設定」をご覧ください。
Q3 Webアプリケーションからのログが出力されないのですが、どのような原因が考えられますか?
A3 log4jの設定を変更してください。本資料の「2.5 log4jの設定」をご覧ください。
Q4 フィルタがうまく動作しないのですが、どのような原因が考えられますか?
A4 フィルタはServlet2.3仕様から追加された仕組みです。WebOTX V8 ではServlet2.4に準拠しているため、web.xml 先頭の DOCTYPE を 2.3または2.4 に変更してください。変更後のイメージは次のようになります。
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.4//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_4.dtd">
Q5 getParameterで取得したデータが文字化けするのですが、どのような原因が考えられますか?
A5 Tomcat 6.xでは、URIのエンコードの指定のために、server.xmlで URIEncoding と useBodyEncodingForURI が指定できますが、WebOTX では、server.http-service.http-listener.http-listener-name.property で指定します。
例として、内蔵 Web サーバの場合には運用管理コマンド(otxadminコマンド)を利用して、次のように指定します。
otxadmin> set server.http-service.http-listener.http-listener-1.property.URIEncoding=Windows-31J
otxadmin> set server.http-service.http-listener.http-listener-1.property.useBodyEncodingForURI=true
外部 Web サーバの場合には次のように指定します。
otxadmin> set server.http-service.http-listener.ajp-listener-1.property.URIEncoding=Windows-31J
otxadmin> set server.http-service.http-listener.ajp-listener-1.property.useBodyEncodingForURI=true
Q6 WebブラウザでJSPの出力を参照したとき、機種依存文字(鰍ネど)が文字化けするのですが、どのような原因が考えられますか?
A6 エンコードの指定をWindows-31Jにする必要があります。
JSPの場合には、web.xmlのの指定で次のように定義することができます。
【web.xml】
<web-app ....
<jsp-config>
<jsp-property-group>
....
<page-encoding>Windows-31J</page-encoding>
</jsp-property-group>
</jsp-config>
....
<servlet>
....
</servlet>
</web-app>
そのほかに、ServletでのContent-Typeによる設定、JSPでのpage ディレクティブのcontentTypeによる設定などに起因する文字化けがあります。 詳細については「WebOTX Webコンテナ チューニングとトラブルシューティング」−「3.1.5. Web アプリケーションで文字化けが発生する」をご覧ください。
また、WebOTX V8では文字コードを強制的に指定することができるようになりました。以下に、Servlet/JSPへの入出力、エンコーディングを強制設定する機能について説明します。
1) HTTPリクエスト
エンコーディングを指定してリクエストのデータをどの文字コードとしてJavaで扱うUnicodeにデコードするか、 の設定があります。
詳細は 01. HTTPリクエスト を参照してください。
2) HTTPレスポンス
レスポンス出力時、Javaで扱うUnicodeをどのエンコーディングを指定して、意図する文字コードにエンコード(レスポンス出力)するか の設定があります。
詳細は 02. HTTPレスポンス を参照してください。
3) jspファイルのコンパイル
jspファイルはどの文字コードで記述されているか(どのエンコーディングを指定してJavaで扱うUnicodeにデコードするか) の設定があります。
詳細は 03. jspファイルのコンパイル を参照してください。
4) jspファイルのレスポンス
JSPを実行した際、Javaで扱うUnicodeをどのエンコーディングを指定して、意図する文字コードにエンコード(レスポンス出力)するか の設定があります。
詳細は 04. jspファイルのレスポンス を参照してください。
5) ファイル入力/出力
ファイルにアクセスするInputStream、OutputStreamを作成する際ユーザが文字コードを指定します。WebOTX独自の設定機能は存在しませんがJava VMオプション(-Dfile.encoding=<MS932等>)指定によりデフォルトキャラセットを変更可能
6) データベースアクセス
JDBCドライバに依存します。
※各設定で指定した文字コードはJavaのコンバータにより処理されます。
01. HTTPリクエスト
リクエストのデータをどの文字コードとして扱うかは通常、以下の処理順で決定されます。(ここで決定された文字コードはリクエストからデータを取得する際のInputStreamに適用されます。)
1) Filter等でリクエストデータを参照する前に、ServletRequest.setCharcterEncoding()によりエンコーディングを設定した場合、そのエンコーディングでリクエストデータをデコードします。
2) HTTPリクエストのヘッダ情報にcharset指定がある場合、そのエンコーディングでリクエストデータをデコードします。
"Content-Type: application/x-www-form-urlencoded; charset=windows-31j" 等
3) HTTPリクエストのヘッダ情報にcharset指定が無い場合、nec-web.xmlファイルに<locale-charset-info>要素を設定し、warファイルに予めアーカイブすることでリクエストデータのデコードに用いるデフォルトのエンコーディングを指定することができます。
※nec-web.xmlの例
<locale-charset-info default-locale="ja">
<locale-charset-map locale="ja" charset="windows-31j" />
<parameter-encoding form-hint-field="penc" />
</locale-charset-info>
3-1) リクエストのパラメータ中に該当データ(この場合パラメータ名が(pencのデータpenc=x-IBM943C 等)があればそれをエンコーディングとして使用します。
3-2) 3-1)が無い場合、リクエスト中のAccept-Language: ja、無ければnec-web.xmlの<locale-charset-info default-locale="ja">を取得します。<locale-charset-map>よりlocaleが一致するmapを検索し、そのcharsetでリクエストパラメータをUnicodeに変換します。
4) 上記のいずれも無い場合、リクエストデータはデフォルトのエンコーディング"ISO-8859-1"でデコードされます。
01. HTTPレスポンス
レスポンスにデータをどの文字コードとして出力するかは通常、以下の処理順で決定されます。(ここで決定された文字コードはHTTPレスポンスのヘッダ情報(Content-Typeのcharset)とデータを出力する際のOutputStreamに適用されます)
1) Servlet2.4の仕様でロケールおよび文字エンコードのマッピングをweb.xmlに指定できます。javax.servlet.ServletResponseのsetLocale()メソッドが呼ばれた時に参照され、指定したロケールに対応する文字コードが設定されます。
※web.xmlへの設定例
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>ja</locale>
<encoding>windows-31j</encoding>
</locale-encoding-mapping>
<locale-encoding-mapping>
<locale>ko_KR</locale>
<encoding>EUC-KR</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>
2) ServletResponse.setContentType()にてcharsetが指定された場合、そのエンコーディングでエンコード(レスポンス出力)します。
3) 上記の指定が無い場合、デフォルトのエンコーディング"ISO-8859-1"でエンコード(レスポンス出力)します。
03. jspファイルのコンパイル
jspファイルがどの文字コードで記述されているか(読み込み時どのエンコーディングでデコードするか)は通常、以下の処理で決定されます。(ここで決定されたエンコーディングはjspファイルを読み込む際のInputStremに適用されます)
1) jspにpageEncoding指定が記述されている場合、そのエンコーディングでjspファイルをデコード(読み込み)します。
2) jspにpageEncoding指定が無くcontentType指定(charset指定)が記述されている場合、そのエンコーディングでjspファイルをデコード(読み込み)します。
3) JSP2.0の仕様でjspのエンコーディングをweb.xmlに指定できます。contentType指定(charset指定)が無い場合、web.xmlで指定したエンコーディングが適用されます。
※web.xmlへの設定例
<jsp-config>
<jsp-property-group>
<uri-pattern>/jsp/*</uri-pattern>
<page-encoding>Shift_JIS</page-encoding>
</jsp-property-group>
</jsp-config>
4) pageEncoding指定、contentType指定が共に無い、web.xmlの指定も無い場合、otxadminコマンドにてデフォルトのエンコーディングを指定することができます。(要ドメイン再起動)
otxadmin> set server.web-container.property.default-encoding=Shift_JIS
5) 上記のいずれの指定も無い場合、jspファイルはデフォルトのエンコーディング"ISO-8859-1"でデコード(読み込み)されます。
※default-web.xmlのjavaEncodingはjsp->servletで変換したservletのjavaファイルをエンコード(出力)する際のエンコーディング指定します。
※実際のファイルの文字コードが、複数あり、個別のページでエンコーディングを指定している場合、priorityJspInEncodingを指定して特定の文字コードでエンコードするように設定すると、一部のページで文字化けが発生します。この場合は、該当のページのファイルの文字コード修正してください。
04. jspファイルのレスポンス
出力するレスポンスデータはどのエンコーディングエンコード(出力)するかは通常、以下の処理で決定されます。(ここで決定されたエンコーディングはレスポンスのヘッダ情報(Content-Typeのcharset)と出力する際OutputStreamに適用されます)
1) jspにcontentType指定(charset指定)が記述されている場合、そのエンコーディングでレスポンスデータをエンコード(出力)します。
2) JSP2.0の仕様でjspのエンコーディングをweb.xmlに指定できます。contentType指定(charset指定)が無い場合、web.xmlで指定したエンコーディングが適用されます。
※web.xmlへの設定例
<jsp-config>
<jsp-property-group>
<uri-pattern>/jsp/*</uri-pattern>
<page-encoding>Shift_JIS</page-encoding>
</jsp-property-group>
</jsp-config>
3) contentType指定、web.xmlの指定共に無い場合、otxadminコマンドにてデフォルトのエンコーディングを指定することができます。(要ドメイン再起動)
otxadmin> set server.web-container.property.default-encoding=Shift_JIS
4) 上記のいずれの指定も無い場合、jspのレスポンスはデフォルトのエンコーディング"ISO-8859-1"でエンコード出力されます。
※1 この機能の指定方法は2パターンあります、全Webアプリケーション共通の指定と、Webアプリケーション毎に指定するものです。それぞれdomain.xmlの要素のpropertyとwarファイルにアーカイブするnec-web.xmlに定義されます。
全アプリケーション共通の設定、Webアプリケーション毎の設定の両方が指定された場合、Webアプリケーション毎の設定が優先されます。nec-web.xmlに指定する場合は、エンコーディングを1つ設定する指定か、localeとエンコーディングをマッピングさせてエンコーディングを決定する指定の2パターンを可能とします。両方が指定された場合、localeとエンコーディングのマッピング指定が優先されます。以下、各設定例を記述します。
=====設定例=====
1.レスポンスエンコーディングの優先設定
・Webアプリケーション毎に有効なLocaleに対応したエンコーディング指定のnec-web.xmlへの記述(a1)
例)<nec-web-app>
<property name="priorityResponseEncoding-map:ja" value="EUC_JP" />
</nec-web-app>
※ "priorityResponseEncoding"に"-map"を付加し、":"で区切ってLocaleを記述します LocaleはHttpResponseのgetLocale()で取得できる文字列と同じである必要があります。
・Webアプリケーション毎に有効なnec-web.xmlへの記述 (a2)
例)<nec-web-app>
<property name="priorityResponseEncoding" value="EUC_JP" />
</nec-web-app>
・全Webアプリケーションに有効なdomain.xmlへの指定 (b)
例) otxadmin> set server.web-container.property.priority-response-encoding=EUC_JP
※要ドメイン再起動
2.JSPファイル読み込みエンコーディングの優先指定
・Webアプリケーション毎に有効なnec-web.xmlへの記述(c)
例)<nec-web-app>
<jsp-config />
<property name="priorityJspInEncoding" value="EUC_JP" />
</jsp-config>
</nec-web-app>
・全Webアプリケーションに有効なdomain.xmlへの指定(d)
例) otxadmin> set server.web-container.property.priority-jsp-in-encoding=EUC_JP
※要ドメイン再起動
3.JSPファイル出力時エンコーディングの優先指定
JSP出力時とはコンパイルしたjavaソースでHttpServletResponseにsetContentType()する際に指定する"charset=XXX"部分に相当します。
・Webアプリケーション毎に有効なLocaleに対応したエンコーディング指定のnec-web.xmlへの記述(e1)
例)<nec-web-app>
<jsp-config />
<property name="priorityJspOutEncoding-map:ja" value="EUC_JP" />
</jsp-config>
</nec-web-app>
※ "priorityJspOutEncoding"に"-map"を付加し、":"で区切ってLocaleを記述します。
LocaleはHttpResponseのgetLocale()で取得できる文字列と同じである必要があります。
・Webアプリケーション毎に有効なnec-web.xmlへの記述 (e2)
例)<nec-web-app>
<jsp-config />
<property name="priorityJspOutEncoding" value="EUC_JP" />
</jsp-config>
</nec-web-app>
・全Webアプリケーションに有効なdomain.xmlへの指定 (f)
例) otxadmin> set server.web-container.property.priority-jsp-out-encoding=EUC_JP
※要ドメイン再起動
Q7 Tomcatからの移行時にJSPのコンパイルエラーになるのですが、原因は何が考えられるでしょうか?
A7 Java 1.6 で記述されたJSPをJava 1.5のソースとしてコンパイルした際にJava1,6で追加された未知のクラスが認識できないため、コンパイルエラーが発生します。WebOTX V8ではデフォルトでは、Java 5 (Java1.5)としてコンパイルするため、この問題が発生します。次の例のように、コンパイルする際に使用するJavaの バージョンを指定してください。<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>の定義に compilerTargetVM と compilerSourceVM のパラメータで 1.6 を指定する定義を追加し、ドメインを再起動してください。
対象ファイル:<WebOTXインストールディレクトリ>/domains/domain1/config/default-web.xml
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>compilerTargetVM</param-name>
<param-value>1.6</param-value>
</init-param>
<init-param>
<param-name>compilerSourceVM</param-name>
<param-value>1.6<<param-value>
</init-param>
</servlet>
エラー原因が上記ではない場合は、APでデータ型を明示的に指定することによりエラーを回避できる可能性があります。
AP修正例)
xxxxxxxx a = (xxxxxxxx)form.getViewList().get(idx);
↓
xxxxxxxx a = (xxxxxxxx)form.getViewList().get(idx.intValue());
Q8 Servletを実行する際にURLを"/<コンテキスト名>/servlet/サーブレットのクラス名"というように実行するとHTTP404エラーとなるのですが、設定により直接Servletを実行する方法はありますか?
A8 Tomcat4.1.12以降では、次のようにセキュリティの観点からデフォルトでは無効になっています。WebOTX V8では、同様にこの機能をデフォルトで無効としています。有効にするには次の部分2箇所をコメントアウトしているので、利用するように変更し、ドメインを再起動してください。
対象ファイル:<WebOTXインストールディレクトリ>/domains/domain1/config/default-web.xml
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
Q9 ServletのJavaプログラムから、ネットワークドライブにあるファイルを開きたいのですが、どのようにしたらよろしいでしょうか?
A9 ネットワークドライブは以下の条件で利用可能となります。
WebOTXがサービス起動の場合は、サービスのログオンユーザの設定と、共有フォルダへのログオンユーザのアクセス権が必要です。また、APでの共有フォルダの指定は、UNC表記(\\hostname\共有フォルダ名)で指定してください。
※ D:\xxxxx\xxxx の表記では、アクセスできません。
Q10 シンボリックリンクを使用したいのですが、どのようにしたらよろしいでしょうか?
A10 例) WebAPP1というWebアプリケーション内からリンクする例です
・Webモジュールのディレクトリ
/opt/WebOTX/domains/domain1/applications/j2ee-modules/WebAPP1
・リンク先の対象のファイル
/home/hoge/test.html
1) シンボリックリンクを有効にします。
運用管理コマンドで以下のコマンドを入力します。
./otxadmin set --user admin --password adminadmin server.http-service.virtual-server.server.property.allowLinking=true
./otxadmin set --user admin --password adminadmin server.http-service.virtual-server.server.property.caseSensitive=false
2) ドメインを再起動します。
3) 次のコマンドでハードリンクします。
cd /opt/WebOTX/domains/domain1/applications/j2ee-modules/WebAPP1
ln /home/hoge/test.html t1.html
4) 確認します。
cat ./t1.html
5) /WebAPP1/t1.htmlにアクセスすると、test.htmlの内容が表示され、シンボリックリンクを行えていることが確認できます。
※シンボリックリンクはWindows OSでは使用できません。Unix系OSで使用してください。
Q11 httpsの通信でCookieのセキュアオプションがついていないのですが、設定によりつけることはできますか?
A11 内蔵Webサーバを使用している場合はhttpsでの送受信時には自動的にsecure属性が付加されます。外部Webサーバを使用している場合は運用管理コマンドで下記を入力した後、ドメインを再起動することでsecure属性を付加することができます。
otxadmin> set server.http-service.http-listener.ajp-listener-1.security-enabled=True
また、以下の設定により、httpの通信でもsecure属性を付加させることができます。
設定内容:
nec-web.xmlに下記の記述を行い、Webアプリケーションを更新した後、アプリケーションを配備し直してください。
<session-properties>タグにpropertyを記述します。
<session-config>
<session-properties>
<property name="alwayCookieSecure" value="true"/>
</session-properties>
</session-config>
Q12 Webサーバプラグインのログローテート機能を利用したいのですが、どのようにしたらよろしいでしょうか?
A12 以下の例を参考にファイルを編集し、Webサーバを再起動してください。
対象ファイル:<WebOTXインストールディレクトリ>/domains/domain1/config/WebCont/*.conf-auto
JkLogFile "D:/WebOTX/domains/domain1/logs/webcontainer/mod_jk-20.log"
↓
JkLogFile "|D:/WebOTX/WebServer2/bin/rotatelogs.exe D:/WebOTX/domains/domain1/logs/webcontainer/mod_jk-20.log 86400"
一日(86400秒)毎にログローテートされます。
※ *.conf-autoファイルはデフォルト名のままである場合、ドメイン再起動で上書きされます。必要に応じてファイル名をリネームしてください。
5.2. Webアプリケーションの開発に関するQ&A
Q1 servletをコンパイルするときに、WebOTXではどのjarを利用するのでしょうか?
A1 ${AS_INSTALL}/lib/javaee.jar を利用してください。
Q2 Webアプリケーションを自動的に配備するには、どうすれば良いのでしょうか?
A2 Tomcatでは、webappsディレクトリにWARファイルを置くと自動的に配備されますが、WebOTXでは
${ INSTANCE_ROOT}/autodeploy ディレクトリにWARファイルを格納することで、自動的に配備できます。
Q3 context.xml にWebアプリケーションが利用するパラメータを記述しているのですが、WebOTX ではどこに記述すればよいのでしょうか?
A3 WebOTX には context.xml は存在しません。web.xml に記述してください。
5.3. 環境設定、チューニングに関するQ&A
Q1 WebOTXでJavaVMのメモリ量を指定するには、どうすれば良いのでしょうか?
A1 Tomcatでは、起動用のファイルでJavaVMのメモリ量を指定しますが、WebOTXでは運用管理コマンド(333otxadmin) で指定します。
【割り当てメモリの最大値を 640 MB にする例】
otxadmin> create-jvm-options --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <管理ポート> -Xmx640m:
詳細については、「WebOTX Webコンテナ チューニングとトラブルシューティング WebOTX V6編」−「2.1. Java VM への割り当てメモリ」をご覧ください。
Q2 Apacheと連携するときの同時接続(スレッド)数の設定は、どうすれば良いのでしょうか?
A2 Tomcatでは server.xml を編集して設定しますが、WebOTXでは運用管理コマンド(otxadmin) で指定します。
【同時に処理できるリクエストの数を拡大する例】
otxadmin> set --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <管理ポート> server.http-service.http-listener.<リスナID>.max-processors=<最大数>
詳細については、「WebOTX Webコンテナ チューニングとトラブルシューティング WebOTX V6編」−「2.2. プロセッサ数」をご覧ください。
Q3 JDBCデータソースの設定は、どうすれば良いのでしょうか?
A3 Tomcatでは server.xml を編集して設定しますが、WebOTXでの設定方法は本資料の「2.4 JDBCデータソースの設定」をご覧ください。
Q4 1台のサーバで複数のWebコンテナを起動するには、どうすれば良いのでしょうか?
A4 Tomcatでは、Tomcatのディレクトリをコピーして、同じマシンで複数のTomcatを起動しますが、WebOTXでは複数のドメインを作成することで複数のWebコンテナを起動することができます。
Q5 Tomcatからの移行時に対応する環境設定を教えてください。
A5 環境設定の対応は以下となっています。
・JAVA_HOME
JAVA_HOMEは、インストール時に「JDKがインストールされているディレクトリ」を指定していると思います。
・ CATALINA_OPTS
Java VMオプションは、次の箇所に設定してください。
■シングルプロセスモードの場合
運用管理コンソールでドメイン⇒アプリケーションサーバ⇒JVM構成⇒属性
"JVMオプション"に設定してください
■マルチプロセスモードの場合
運用管理コンソールでドメイン⇒TPシステム⇒アプリケ<ーショングループ⇒<アプリケーショングループ名>⇒プロセスグループ⇒<プロセスグループ名>
「属性」タブの「「Javaシステムプロパティ」に設定してください。
既に設定されているJava VMのメモリ指定等は編集してください。
新規の項目は、追加してください。
・ SHILIB_PATH、LD_LIBRARY_PATH、CONFIG_PATH
既存の環境のとおりOSの環境変数に設定してください。
・ CLASSPATH
クラスパスは、次の箇所に設定してください。
■シングルプロセスモードの場合
運用管理コンソールでドメイン⇒アプリケーションサーバ⇒JVM構成⇒属性
”サーバのクラスパス” に設定してください
■マルチプロセスモードの場合
運用管理コンソールでドメイン⇒TPシステム⇒アプリケーショングループ⇒<アプリケーショングループ名>⇒プロセスグループ⇒<プロセスグループ名>
「属性」タブの「「環境変数」に設定してください。