Мой обратный прокси-сервер, похоже, в основном работает, хотя, когда я открываю сеансы на разных внутренних серверах в одном и том же браузере, я получаю это сообщение из браузера (проверено с 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
Я думаю, это связано с куки? Поэтому я сравнил их, и каждый из них имеет уникальное содержимое файлов cookie, например:
Session to backend1:
QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl
Session to backend2:
QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC
Что мне нужно настроить в обратном прокси, чтобы эти сеансы не мешали друг другу?
Спасибо,
Мэтт.
Отвечая на свой вопрос ... Чтобы сразу перейти к ответу, мне нужно было добавить 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 зависит от имени внутреннего сервера.
Мэтт.