Mi proxy inverso parece funcionar en su mayor parte, aunque cuando abro sesiones en diferentes servidores backend, dentro del mismo navegador, recibo este mensaje del navegador (probado con Chrome e IE):
Already a session is running in this browser, so opening the same session
Una vez que abro la segunda sesión, las dos sesiones interfieren de tal manera que una de ellas cierra la sesión.
Las dos URL de solicitud son:
https://proxy-server/backend1/index.html
https://proxy-server/backend2/index.html
El proxy inverso asigna estas solicitudes a:
https://backend1:1234/index.html and
https://backend2:1234/index.html
¿Supongo que esto está relacionado con las cookies? Entonces los comparé y cada uno tiene contenidos de cookies únicos, por ejemplo:
Session to backend1:
QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl
Session to backend2:
QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC
¿Qué necesito configurar en el proxy inverso para evitar que estas sesiones interfieran entre sí?
Gracias,
Matt.
Respuesta1
Respondiendo a mi propia pregunta... Para ir directamente a la respuesta, necesitaba agregar ProxyPassReverseCookiePath
a mi <VirtualHost>
:
<Location "/backend1">
...
ProxyPass https://backend1:1234/
ProxyPassReverse https://backend1:1234/
...
ProxyPassReverseCookiePath / /backend1
...
</Location>
Para descubrir lo que necesitaba agregar, fue necesario rastrear el Set-Cookie
encabezado en el servidor backend y en el servidor proxy.
En el backend estoy usando lighttpd. Para rastrear la solicitud/respuesta del backend:
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"
El proxy inverso ejecuta Apache, así que agregué esto a mi <VirtualHost>
...
LogFormat "%h %l %u %t \"%r\" \"C:%{Cookie}i\" \"S-C:%{Set-Cookie}o\" %>s %b"
TransferLog "/store/log/httpd_access_log"
Ahora armado con los detalles de registro, pude ver lo que estaba sucediendo...
Después de la pantalla de inicio de sesión inicial, se establece una sesión y el servidor backend crea el contenido de la cookie y lo agrega al Set-Cookie
encabezado. La pista que necesitaba era que especifica Set-Cookie
con Path=/
. Para evitar que las sesiones de diferentes servidores backend interfirieran entre sí, necesitaba hacer que el Path
atributo dependiera del nombre del servidor backend. Eso es lo que ProxyPassReverseCookiePath
hace por mí.
El Proxy ve el Set-Cookie
encabezado y asigna el Path
atributo.
Los registros mostraban, en lighttpd (editado para placer visual):
"POST /api/session HTTP/1.1" "C:i18next=en-us" "S-C:SID=3bmx; path=/; secure"
Y después de que esta respuesta pasa por el Proxy, la directiva la modifica ProxyPassReverseCookiePath
para que sea:
POST /backend1/api/session HTTP/1.1 C:i18next=en-us S-C:SID=3bmx; path=/backend1;secure
Ahora la ruta de las cookies depende del nombre del servidor backend.
Mate.