Мой обратный прокси-сервер, похоже, в основном работает, хотя при открытии сеансов на разных внутренних серверах в одном браузере я получаю следующее сообщение от браузера (проверено в 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-файлу зависит от имени внутреннего сервера.
Мэтт.