私のリバース プロキシはほぼ動作しているようですが、同じブラウザー内で異なるバックエンド サーバーへのセッションを開くと、ブラウザーから次のメッセージが表示されます (Chrome と IE でテスト済み)。
Already a session is running in this browser, so opening the same session
2 番目のセッションを開くと、2 つのセッションが干渉し、一方のセッションがログアウトされます。
2 つのリクエスト URL は次のとおりです。
https://proxy-server/backend1/index.html
https://proxy-server/backend2/index.html
リバース プロキシはこれらの要求を次のようにマッピングします。
https://backend1:1234/index.html and
https://backend2:1234/index.html
これはクッキーに関係しているのでしょうか? 比較してみたところ、それぞれに固有のクッキーの内容がありました。例:
Session to backend1:
QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl
Session to backend2:
QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC
これらのセッションが相互に干渉しないようにするには、リバース プロキシで何を構成する必要がありますか?
ありがとう、
マット。
答え1
私自身の質問に答えます... 答えをすぐに出すために、私はProxyPassReverseCookiePath
次のことを追加する必要がありました<VirtualHost>
:
<Location "/backend1">
...
ProxyPass https://backend1:1234/
ProxyPassReverse https://backend1:1234/
...
ProxyPassReverseCookiePath / /backend1
...
</Location>
何を追加する必要があるかを調べるには、Set-Cookie
バックエンド サーバーとプロキシ サーバーのヘッダーをトレースする必要がありました。
バックエンドでは lighttpd を使用しています。バックエンドのリクエスト/応答をトレースするには:
server.modules += ("mod_accesslog")
accesslog.use-syslog = "enable"
accesslog.syslog-level = 6
accesslog.format = "%h %l %u %t \"%r\" \"C:%{Cookie}i\" \"S-C:%{Set-Cookie}o\" %>s %b"
リバース プロキシは Apache を実行しているので、これを<VirtualHost>
...に追加しました。
LogFormat "%h %l %u %t \"%r\" \"C:%{Cookie}i\" \"S-C:%{Set-Cookie}o\" %>s %b"
TransferLog "/store/log/httpd_access_log"
ログの詳細がわかったので、何が起こっているのかがわかりました...
最初のログイン画面の後、セッションが確立され、バックエンド サーバーが Cookie コンテンツを作成してヘッダーに追加しますSet-Cookie
。必要な手がかりは、Set-Cookie
で が指定されていることですPath=/
。異なるバックエンド サーバーのセッションが互いに干渉しないようにするには、Path
属性をバックエンド サーバー名に依存させる必要がありました。これがProxyPassReverseCookiePath
の役割です。
プロキシはSet-Cookie
ヘッダーを確認し、Path
属性をマップします。
lighttpd 上のログは次のようになりました (閲覧用に編集済み):
"POST /api/session HTTP/1.1" "C:i18next=en-us" "S-C:SID=3bmx; path=/; secure"
この応答がプロキシを通過した後、 ProxyPassReverseCookiePath
ディレクティブによって次のように変更されます。
POST /backend1/api/session HTTP/1.1 C:i18next=en-us S-C:SID=3bmx; path=/backend1;secure
現在、Cookie パスはバックエンド サーバーの名前に依存します。
マット。