(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) 原因
ProxyPass | (説明) リバースプロキシの設定そのもので、クライアントのリクエストに対して、それをどこに送るか?を定義しています(行き)。 (参考)ProxyPassやProxyPassReverseについて |
ProxyPassReverse | (説明) リバースプロキシサーバから受け取る「レスポンス」の中の「HTTPレスポンスヘッダー」から「Location」と呼ばれる、リダイレクトをするためのフィールドを書き換えます(正しくリダイレクトされるよう書き換え)。 (参考)ProxyPassやProxyPassReverseについて |
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]で指定したパスに置き換えます。 (構文) (例) |
(1-4) 対処法
(1-4-1) 設定ファイル(ssl.conf)を開く
$ cd /etc/httpd/conf.d $ sudo vi ssl.conf
(1-4-2) 設定ファイル(ssl.conf)の編集
ProxyPassReverseCookiePath [internal-path] [public-path]
ProxyPass / https://rainbow-planet-t1.xyz:8443/TennisDatabase/ ProxyPassReverse / https://rainbow-planet-t1.xyz:8443/TennisDatabase/
ProxyPassReverseCookiePath /TennisDatabase /
(1-4-3) Apacheを再起動
$ sudo service httpd restart
(1-4-4) 結果チェック
①https
https://[ドメイン]/[画面名].jsp
http://[ドメイン]/[画面名].jsp