以下の条件をすべて満たす場合、リクエストが、セッション情報を持つプロセスへ適切に振り分けされず、同じプロセスグループの別のプロセスへ振り分けられる可能性があります。
そのため、リクエストは同じWebアプリケーションで処理されますが、Webアプリケーションにおいて、セッションIDに対するセッション情報を取得できない問題があります。
(1)Webコンテナの動作モードがアドバンスドモード
(2)WebコンテナとWebサーバの連携モードがAJP
(3)プロセスグループのプロセス数が複数
(4)セッションレプリケーションを設定していない
(5)セッションの管理方法がURL Rewriting
それぞれの確認方法は以下になります。
(1)Webコンテナの動作モードは、WebコンテナのパラメータprocessMultiplicityがtrue(アドバンスドモード)かfalse(スタンダードモード)かで確認できます。
アドバンスドモードの場合、otxadminコマンドでは以下のように出力されます。
# otxadmin get --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインのポート番号> server.web-container.processMultiplicity
server.web-container.processMultiplicity = true
(2)WebコンテナとWebサーバの連携モードは、Webコンテナのパラメータadvanced-mode-protocolがajp(AJPプロトコル)かiiop(IIOPプロトコル)かで確認できます。
AJPの場合、otxadminコマンドでは以下のように出力されます。
# otxadmin get --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインのポート番号> server.web-container.advanced-mode-protocol
server.web-container.advanced-mode-protocol = ajp
(3)プロセスグループのプロセス数は、プロセスグループごとに以下のコマンドで確認できます。
# otxadmin get --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインのポート番号> tpsystem.applicationGroups.<アプリケーショングループ名>.processGroups.<プロセスグループ名>.processCount
tpsystem.applicationGroups.<アプリケーショングループ名>.processGroups.<プロセスグループ名>.processCount = <プロセス数>
(4)セッションレプリケーションを設定しているかどうかは、web.xmlで確認できます。アプリケーションが持つ WEB-INF/web.xmlに次の定義があればセッションレプリケーションを設定しています。無ければセッションレプリケーションは設定されていません。
<web-app>
:
<distributable/>
:
(5)セッション管理方法がURL Rewritingになっているかどうかは、Webアプリケーションごとに以下のコマンドで確認できます。
# otxadmin get --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインのポート番号> server.applications.web-module.<AP名>.module.<AP名>.engine.web.web-module-config.cookies
server.applications.web-module.<AP名>.module.<AP名>.engine.web.web-module-config.cookies = false
アクセスログからの確認方法は以下です。
プロセスグループのプロセス数が複数で、セッションレプリケーションを設定していない場合、セッションIDにはプロセスIDが付加されます。プロセスIDはセッションIDの最後尾に"$プロセスID"の形で付加されます。
また、セッションの管理方式がURL Rewritingの場合、URLにセッションIDが付加されます。したがって、この問題に該当する場合、アクセスログにはjsessionidとしてプロセスIDを含むセッションIDが設定されているURLのリクエストが記録されます。
例) /HelloSample/HelloServletへのリクエストにURL RewritingでプロセスIDを含むセッションIDが含まれている場合
xx.xx.xx.xx - - xxxx-xx-xx xx:xx:xx "GET /HelloSample/HelloServlet;jsessionid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$xxxx HTTP/1.1" xxx xxx xxxxx
上記の例のようなリクエストが記録されていない場合、この問題には該当しません。
この事象が発生した場合、Webアプリケーションでは正しいセッション情報を取得することができません。
以下のいずれかを行ってください。
(a)プロセスグループのプロセス数を1に変更する
(b)セッションレプリケーションを設定する
(c)セッションの管理方法をCookieに変更する
(d)WebコンテナとWebサーバの連携モードをIIOPに変更する
それぞれの詳細は以下となります。
(a)プロセスグループのプロセス数は、以下のotxadminコマンドで変更できます。反映には、アプリケーショングループの再起動が必要です。プロセスグループの多重度が減りますので、性能にはご注意ください。
# otxadmin set --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインのポート番号> tpsystem.applicationGroups.<アプリケーショングループ名>.processGroups.<プロセスグループ名>.processCount=1
(b)セッションレプリケーションの設定は、セッション情報をどこに格納するかによって、設定方法が異なります。セッションへのアクセスのための処理が追加になりますので、性能にはご注意ください。
詳細はマニュアルをご確認ください。
[WebOTX マニュアル V9.3] または [WebOTX マニュアル V9.4]
> Application Server
> リファレンス集 運用管理・設定編
> 1. コンフィグレーション(設定一覧)
> 1.4. Webコンテナ
> 1.4.7. HTTPセッション管理について
> 1.4.7.3. セッションレプリケーション
(c)セッションの管理方法をCookieに変更するには、warアーカイブに格納してあるnec-web.xmlを変更してwarアーカイブを再作成するか、otxadminコマンドで設定します。また、セッションの管理方法として、URL Rewritingを無効にします。詳細はマニュアルをご確認ください。
[WebOTX マニュアル V9.3] または [WebOTX マニュアル V9.4]
> Application Server
> リファレンス集 運用管理・設定編
> 1. コンフィグレーション(設定一覧)
> 1.4. Webコンテナ
> 1.4.7. HTTPセッション管理について
> 1.4.7.1. HTTPセッション管理について
(d)WebコンテナとWebサーバの連携モード(advanced-mode-protocol)を変更するには以下の操作を行います。これにより、advanced-mode-protocol属性および関連する設定を一括で変更します。設定後はドメインを再起動してください。WebコンテナとWebサーバの連携モードをIIOPに変更するには、WebOTX Webサーバを利用していることが前提となります。
また、AJPリスナではなく、IIOPリスナを使用することになりますので、IIOPリスナの機能、設定をご確認ください。
AJPリスナのアクセスログやエラードキュメントカスタマイズ機能を使用している場合は、使用できなくなりますので、IIOPプラグインのエラードキュメントカスタマイズ機能を使用してください。
# otxadmin stop-system --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインのポート番号>
# otxadmin invoke --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインのポート番号> server.web-container.switchAdvancedModeProtocol iiop