Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Apache

Apacheのリバースプロキシでセッションを維持する方法

投稿日:2021年3月6日 更新日:

<目次>

(1) Apacheのリバースプロキシでセッションを維持する方法
 (1-1) 発生状況・エラーメッセージ
 (1-2) 調査
 (1-3) 原因
 (1-4) 対処法

(1) Apacheのリバースプロキシでセッションを維持する方法

(1-1) エラー概要

Apacheのリバースプロキシ」および「httpsの設定」をして以降、session属性(セッション間で有効な変数など)が正常に動作しなくなりました。

(図111)sessionが正常動作せず、グラフが描画されない

具体的には、ユーザのセッション(HttpSessionクラス)のSetAttributeメソッド等でセッションにオブジェクトをセットしようとすると、セットされずに「NullPointerException」が発生していました。

(エラーメッセージ)

DD MM, YYYY HH:MM:DD 午前 org.apache.catalina.core.StandardWrapperValve invoke
重大: サーブレット [jfreechart.JFreeChartDrawServlet] のServlet.service()が例外を投げました
java.lang.NullPointerException
        at jfreechart.JFreeChartFunctions.createDS_LineChart(JFreeChartFunctions.java:27)
        at jfreechart.JFreeChartDrawServlet.drawLineGraph(JFreeChartDrawServlet.java:92)
        at jfreechart.JFreeChartDrawServlet.doGet(JFreeChartDrawServlet.java:59)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

(図112)エラーメッセージ

例外はsession.setAttributeでセットが出来ず、その状態でgetAttributeすると空なので発生していました。

(図113)例外発生箇所

目次にもどる

(1-2) 調査

原因の切り分けのために、いくつかの形式のURLでチェックする中で気づいたのが、セッションが正常動作するURLの形式と、異常終了する(例外が起きる)形式とに分かれる事でした。

(表)

テストしたURLの形式 Sessionの正常動作
①https://[ホスト名]:8443/[アプリ名]/[画面名].jsp ○(OK)
②https://[ドメイン]/[画面名].jsp ×(NG)
③https://[ホスト名]/[画面名].jsp ×(NG)

(※8443はTomcatのhttps用ポート番号)

特に②と③のURLでのアクセスはApacheのリバースプロキシにより実現しているため、Apacheの設定に不備があるのでは?と考え、調査を進めていました。

目次にもどる

(1-3) 原因

Apacheのリバースプロキシの設定で、ProxyPassReverseCookiePathディレクティブ(Apacheに対して実行するコマンド)が抜けていたのが原因でした。
 
Apacheの公式ドキュメントを見ても、ProxyPassやProxyPassReverseといったディレクティブとセットで使用するような記載ぶりになっています。
 
ProxyPassReverseCookiePathを設定していないと、クッキー(Cookie)に書き込まれるパスの情報が不正になり、2回目以降のリクエストにセッションの情報を引き継げなくなると理解しています(違ってたらスミマセン・・)。
 
(表:各デリバティブの意味)
ProxyPass (説明)
リバースプロキシの設定そのもので、クライアントのリクエストに対して、それをどこに送るか?を定義しています(行き)。

(参考)ProxyPassやProxyPassReverseについて
https://rainbow-engine.com/apache-reverseproxy-howto/#title1-2-3

ProxyPassReverse (説明)
リバースプロキシサーバから受け取る「レスポンス」の中の「HTTPレスポンスヘッダー」から「Location」と呼ばれる、リダイレクトをするためのフィールドを書き換えます(正しくリダイレクトされるよう書き換え)。

(参考)ProxyPassやProxyPassReverseについて
https://rainbow-engine.com/apache-reverseproxy-howto/#title1-2-3

ProxyPassReverseCookieDomain (説明)
リバースプロキシサーバから受け取る「Set-Cookie」ヘッダーの「Domain文字列」を調整します。以下はSet-Cookieヘッダーのイメージで、DomainやPathなどCookieに書き込むいくつかの情報を保持しています。その中の「Domain=」の部分です。
Set-Cookie: token=XXXXX;Version=1;Comment=XXXX;Domain=XXXX;Path=XXXX;Max-Age=3600;Expires=XXXXX;

ProxyPassReverseCookiePath (説明)
リバースプロキシサーバから受け取る「Set-Cookie」ヘッダーの「Path文字列」(Set-Cookieヘッダーの「Paht=」の部分)を調整します。具体的には[internal-path]で指定したパスを[public-path]で指定したパスに置き換えます。

(構文)
ProxyPassReverseCookiePath [internal-path] [public-path]

(例)
ProxyPassReverseCookiePath /TennisDatabase /

 
主にサーバ⇒クライアントへのレスポンスの部分の情報を、上記のディレクティブ設定により修正する事で、リバースプロキシを正常動作させるイメージです。
(図131:イメージ図)

 

(1-4) 対処法

原因に記載した通り、Apacheのリバースプロキシ設定ファイル(ssl.conf)に「ProxyPassReverseCookiePath」の設定を追加していきます。

(1-4-1) 設定ファイル(ssl.conf)を開く

設定ファイルのあるディレクトリに移動し、viエディタ等のエディタで設定ファイル「ssl.conf」を開きます。
 
$ cd /etc/httpd/conf.d
$ sudo vi ssl.conf
(図141)
 

(1-4-2) 設定ファイル(ssl.conf)の編集

ssl.confに対してProxyPassReverseCookiePathの設定をしていきますが、パスの設定は次のような形式になります。
ProxyPassReverseCookiePath [internal-path] [public-path]

 

[internal-path]がリバースプロキシのリダイレクト先のアプリケーション名を、[public-path]はリダイレクトする元のパスを指定しており、ProxyPassやProxyPassReverseとは逆の指定をしているイメージになります。

 

例えば、ProxyPassやProxyPassReverseが次のようなパスだった場合を考えます。
(例)
ProxyPass / https://rainbow-planet-t1.xyz:8443/TennisDatabase/
ProxyPassReverse / https://rainbow-planet-t1.xyz:8443/TennisDatabase/

 

この例ではProxyPassReverseCookiePathは次のようになります。
ProxyPassReverseCookiePath /TennisDatabase /
 
実際の設定ファイルで見ると、次のように変更が入るイメージになります。
(図142)①Before

(図142)②After

http用の設定ファイルもあるなら、そちらも併せて修正します。
(図142)③http用の設定ファイル

目次にもどる

(1-4-3) Apacheを再起動

Apacheのサービスを再起動します。
$ sudo service httpd restart
(図143)

(1-4-4) 結果チェック

最後に結果チェックとして、冒頭でNGだったURLで疎通テストをしてみます。
 

①https

https://[ドメイン]/[画面名].jsp
(図144)①
 
②http
 
http://[ドメイン]/[画面名].jsp
(図144)②

Adsense審査用広告コード


Adsense審査用広告コード


-Apache

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Apacheのリバースプロキシをhttps化する手順について

<目次> (1) Apacheのリバースプロキシをhttps化する手順について  (1-0) STEP0:前提事項の確認  (1-1) STEP1:mod_sslモジュールの導入  (1-2) STE …

ApacheとNginxの違いやそれぞれの特徴について

<目次> (1) ApacheとNginxの違いやそれぞれの特徴について  (1-1) Apacheとは?  (1-2) Nginxとは?  (1-3) Nginxのアーキテクチャについて  (1-4 …

Apacheのリバースプロキシの設定方法をご紹介

<目次> (1) Apacheのリバースプロキシの設定方法をご紹介  (1-1) 設定の概要  (1-2) 設定の手順   (1-2-1) STEP1:リバースプロキシ用のモジュール確認   (1-2 …

TomcatのURLに付くポート番号8080を非表示にしてドメイン名のみでサイトにアクセスする方法と手順

本記事で実現したい事は下記2点、①URLのポート番号・アプリ名を非表示(リバプロ)と②JSP/Servlet名非表示(web.xml)です。これらを実現する事でブラウザにドメイン名のみ(例:XXXX. …

Apache HTTP Serverとは?概要や主要な機能についてご紹介

<目次> (1) Apache HTTP Serverとは?概要や主要な機能についてご紹介  (1-1) Apacheとは?  (1-2) Apacheの主な機能  (1-3) Apacheの使用例 …

  • English (United States)
  • 日本語
Top