Meu proxy reverso parece estar funcionando principalmente, mas quando abro sessões em diferentes servidores back-end, no mesmo navegador, recebo esta mensagem do navegador (testado com Chrome e IE):
Already a session is running in this browser, so opening the same session
Assim que abro a 2ª sessão, as duas sessões interferem de tal forma que uma delas fica desconectada.
Os dois URLs de solicitação são:
https://proxy-server/backend1/index.html
https://proxy-server/backend2/index.html
O proxy reverso mapeia essas solicitações para:
https://backend1:1234/index.html and
https://backend2:1234/index.html
Eu acho que isso está relacionado aos cookies? Então, comparei-os e cada um possui um conteúdo de cookie exclusivo, por exemplo:
Session to backend1:
QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl
Session to backend2:
QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC
O que preciso configurar no proxy reverso para evitar que essas sessões interfiram umas nas outras?
Obrigado,
Matt.
Responder1
Respondendo à minha própria pergunta... Para ir direto à resposta, precisei adicionar ProxyPassReverseCookiePath
à minha <VirtualHost>
:
<Location "/backend1">
...
ProxyPass https://backend1:1234/
ProxyPassReverse https://backend1:1234/
...
ProxyPassReverseCookiePath / /backend1
...
</Location>
Para descobrir o que eu precisava adicionar, era necessário rastrear o Set-Cookie
cabeçalho no servidor back-end, bem como no servidor proxy.
No backend estou usando lighttpd. Para rastrear a solicitação/resposta de back-end:
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"
O Reverse-Proxy está executando o Apache, então adicionei isso ao meu <VirtualHost>
...
LogFormat "%h %l %u %t \"%r\" \"C:%{Cookie}i\" \"S-C:%{Set-Cookie}o\" %>s %b"
TransferLog "/store/log/httpd_access_log"
Agora armado com detalhes de registro, pude ver o que estava acontecendo...
Após a tela de login inicial, uma sessão é estabelecida e o servidor backend cria o conteúdo do Cookie e o adiciona ao Set-Cookie
cabeçalho. A pista que eu precisava era que ela especificasse Set-Cookie
com Path=/
. Para impedir que sessões de diferentes servidores back-end interfiram entre si, precisei tornar o Path
atributo dependente do nome do servidor back-end. Isso é o que ProxyPassReverseCookiePath
faz por mim.
O Proxy vê o Set-Cookie
cabeçalho e mapeia o Path
atributo.
Os logs mostraram, no lighttpd (editado para visualização):
"POST /api/session HTTP/1.1" "C:i18next=en-us" "S-C:SID=3bmx; path=/; secure"
E depois que essa resposta passa pelo Proxy, ela é modificada pela ProxyPassReverseCookiePath
diretiva para ser:
POST /backend1/api/session HTTP/1.1 C:i18next=en-us S-C:SID=3bmx; path=/backend1;secure
Agora o caminho do cookie depende do nome do servidor backend.
Matt.