обратный прокси с несколькими сеансами в одном браузере

обратный прокси с несколькими сеансами в одном браузере

Мой обратный прокси-сервер, похоже, в основном работает, хотя при открытии сеансов на разных внутренних серверах в одном браузере я получаю следующее сообщение от браузера (проверено в Chrome и IE):

Already a session is running in this browser, so opening the same session

Как только я открываю второй сеанс, два сеанса мешают друг другу, и один из них оказывается отключенным.

Два 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-файлу зависит от имени внутреннего сервера.

Мэтт.

Связанный контент