問題
- このような警告は、過去ログに頻繁に出てきます:
Unable to extend the HTTP session.
または
Unable to extend the HTTP session. Review the portal property "session.timeout" if this warning is displayed frequently
環境
- Liferay DXP 7.0 Fixpack 102+の場合。
- Liferay DXP 7.1 Fixpack 25+の場合。
- Liferay DXP 7.2 Fixpack 15+の場合。
- Liferay DXP 7.3 SP3以上
- Liferay DXP 7.4
( LPS-133668 が含まれる全バージョン)
解像度
Unable to extend HTTP session」エラーは、ブラウザがLiferayサーバーにセッションを延長するために /c/portal/extend_session のリクエストを送信したが、すでに期限切れだった場合に発生します。 このエラーは、Liferayの設定ミスや外的要因で発生する可能性があります:
Liferayの設定ミス
このトレースはLiferayの設定ミスが原因である可能性があるので、確認してみてください:
-
セッションタイムアウトの設定を確認してください:
- まず、セッションタイムアウト の設定値を以下のファイルから確認する必要があります:
-
TOMCAT_HOME/webapps/ROOT/WEB-INF/web.xml=><session-timeout>の設定を確認してください。 -
[LIFERAY_HOME]/portal-ext.properties=>session.timeoutプロパティを確認してください。
-
- 通常、1つ目の設定は2つ目の設定で定義された値を上書きしますが、Tomcatアプリケーションサーバーを使用していない場合は必ずしもそうではないので、両方の設定を揃える必要があります。
- 詳しくは、 セッションのタイムアウト値を変更する方法 をご覧ください。
- パッチ適用時に、Liferay が取り込んだ web.xml に変更があった場合、
TOMCAT_HOME/webapps/ROOT/WEB-INF/web.xmlのカスタム修正が失われる場合がありますので、ご注意ください。
- まず、セッションタイムアウト の設定値を以下のファイルから確認する必要があります:
-
session timeout auto extend offsetの設定を確認してください:
-
[LIFERAY_HOME]/portal-ext.propertiesファイルのsession.timeout.auto.extend.offsetのプロパティを確認してください。 このオフセットは、セッションがタイムアウトになる前に、extend リクエストが実行される秒数を制御します:
- オフセットは、セッションの有効期限が切れる前に「セッションの延長」リクエストが届くように、十分に大きくする必要があります。
- ブラウザのタイマーが1分にスロットルされる問題を避けるため、少なくとも60秒より大きくする必要があります。 Google ChromeでSession timeout auto extend failsを参照してください。
- デフォルト値は
session.timeout.auto.extend.offset=70seconds (since LPS-137264) で、これより大きな値を設定すると効果的です。
-
-
製品で適用されている値を確認する:
- ポータルで適用されるセッションに関連する実際の値を確認するには、このGroovyスクリプトが便利です:
import com.liferay.portal.util.PropsValues out.println("session.timeout: " + PropsValues.SESSION_TIMEOUT) out.println("session.timeout.auto.extend: " + PropsValues.SESSION_TIMEOUT_AUTO_EXTEND) out.println("session.timeout.auto.extend.offset: " + PropsValues.SESSION_TIMEOUT_AUTO_EXTEND_OFFSET) out.println("session.timeout.redirect.on.expire: " + PropsValues.SESSION_TIMEOUT_REDIRECT_ON_EXPIRE) out.println("session.timeout.warning: " + PropsValues.SESSION_TIMEOUT_WARNING)
- ポータルで適用されるセッションに関連する実際の値を確認するには、このGroovyスクリプトが便利です:
外的要因
Liferayの構成が揃い、正しく設定されていることを確認した上で、以下のような外的原因でもエラーが発生する可能性があります:
-
extendセッションリクエストは、ユーザーのセッションを持たないノードに送られる:
- 特にスティッキーセッションを使用している場合は、ロードバランサーの設定を確認する必要があります。
- アプリケーションサーバーでセッションレプリケーションを使用している場合は、セッションが正しくレプリケートされているかどうかを再確認する必要があります。
-
サーバー再起動後、セッションは失効します:
- これは、2番目のクラスタノードにセッションのレプリケーションを設定することで軽減することができます。 をご覧ください: Liferay DXPでTomcatにセッションレプリケーションを設定する
- セッションの複製がなく、Tomcatの再起動をまたぐセッションの永続性 が設定されている場合、セッション長が再起動時間より大きければ、エラーを軽減することができます。
-
一部のブラウザで、誤ったオフセット値でエクステンドリクエストを送信しています:
-
session.timeout/session.auto.extend.offsetの設定を変更すると、ユーザーブラウザに「セッションの拡張」JavaScriptロジックのキャッシュバージョンを表示させることができます。 - これらのブラウザが新しいJavaScriptを再読み込みするまで数週間待つだけで、WARNトレースはしばらくして減少するはずです。
- また、Tomcat側とLiferay側の両方でセッションのタイムアウトを長く設定することができます。例えば、15分から30分に増やすと、キャッシュされたバージョンのブラウザが短い長さでリクエストを送り続けるので、問題が回避されます。
-
WARNトレースの無効化
Liferayのセッションに関連する実際の問題がない場合、それをオフにすることができます。 そのためには、 「ポータルの再起動後も持続するログレベルの調整」 に記載されている手順に従って、カテゴリ portal_web.docroot.html.portal.extend_session_jsp を ERROR: に構成する必要があります。
-
[TOMCAT]/webapps/ROOT/WEB-INF/classes/META-INFに portal-log4j-ext.xml というファイルを以下の内容で作成し、ポータルを再起動します.
<?xml version="1.0"?> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <category name="portal_web.docroot.html.portal.extend_session_jsp"> <priority value="ERROR" /> </category> </log4j:configuration>
セッション拡張に関する追加ログDEBUGトレース
セッション拡張についてさらに詳しく調べたい場合は、以下のDEBUGトレースを有効にすることができます:
-
portal_web.docroot.html.portal.extend_session_jsp-> "Unable to extend HTTP session" WARN が発生した場合、拡張するセッションとリクエストの有効セッションもトレースされます。 -
com.liferay.portal.servlet.PortalSessionListener-> すべてのセッションの作成と破棄のイベントをトレースするので、いつ作成され、いつ失効するかを確認することができます。 - 重要: これらのデバッグトレースは LPS-147401 で追加されたため、インストールを 7.1 fp 27, 7.2 fp 17, 7.3 u4 または 7.4 u9 に更新するか、Hotfix をリクエストする必要があります。
また、Tomcatのserver.xmlの設定ファイルに、リクエストのsessionid情報を追加して、アクセスログを有効にすることも有効である:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{JSESSIONID}c %S %{LIFERAY_SHARED_AUTHENTICATION_TOKEN#CSRF}s" />
を、ファイルの最後、 </Host> のラベルの中に入れてください。