
파운드는 SSL 오프로드를 위해 HAProxy 앞에 있으므로 HAProxy는 일반 텍스트 HTTP 요청을 받습니다. 동일한 애플리케이션을 호스팅하는 두 개의 웹앱 서버 앞에 HAProxy(v1.4.8)가 있습니다. 아래는 내 HAProxy 구성입니다.
현재 클라이언트는 HAProxy에 도달하고 사이트 루트에 대한 초기 "GET /" 요청을 위해 모든 서버로 이동할 수 있습니다. 예를 들어 클라이언트가 ServerA에 도달하면 그 시점부터 항상 ServerA 또는 ServerB에서 서비스를 받을 수 있으며 세션은 A 또는 B에 고정됩니다. 또한 반대의 경우도 발생합니다. 클라이언트의 초기 요청은 ServerB로 들어올 수 있으며, 이 초기 요청 이후에는 항상 ServerB 또는 ServerA에서 서비스를 제공합니다. 세션은 유지되지만 초기 요청 이후에 향후 모든 요청에 대해 반대 서버에 이러한 변경이 발생하는 경우도 있습니다.
아래는 내 HAProxy 구성입니다. 제가 이것을 잘못 쓴 걸까요?
listen app-servers 127.0.0.1:80
cookie ASP.NET_SessionId prefix
balance url_param ASP.NET_SessionId
balance roundrobin
option persist
option redispatch
# Balance based on ASP .NET sesssion ID
appsession ASP.NET_SessionId len 64 timeout 30m request-learn prefix
# Active WebApp servers
server appserver1 10.0.0.1:80
server appserver2 10.0.0.2:80
감사합니다.
답변1
앱이 세션 중에 앱 서버를 전환하는 사용자에 민감한 경우 고정 유지 시간을 최소한 세션 쿠키의 만료 시간만큼 길게 설정해야 합니다.
고정 테이블은 30분 후에 항목이 만료되도록 설정되어 있습니다. 따라서 사용자가 동일한 세션 ID를 계속 보낼 수 있지만 30분 이상 일시 중지하면 연결이 다시 균형을 이룰 것입니다. 이 동작이 마음에 들지 않으면 4시간 이상의 설정이 적합할 것입니다. 위에서 굵게 표시된 것처럼 최소한 고정 유지 시간을 세션 쿠키의 만료 시간만큼 길게 설정해야 합니다.
옵션 을 사용하면 cookie server insert
만료 시간 없이 요리를 추가하게 됩니다. 그 쿠키는 어떤 서버를 사용할지 알려줍니다. 만료가 없으므로 클라이언트는 다른 서버로 이동되지 않습니다.
하지만 당신이 관심을 갖는 이유가 무엇인지 스스로에게 물어볼 필요도 있습니다. 다른 서버로 전환하면 사용자 경험에 큰 영향을 미치나요? 그렇다면 이를 웹 앱의 결함으로 간주하고 해당 계층에서 해결해야 할 수도 있습니다. 내가 틀렸을 수도 있지만 생각해 볼 문제입니다.
답변2
나는 이것에 대해 매우 행복하지 않지만 실제로 작동합니다. ASP .NET 세션 ID를 추적하는 대신 클라이언트 요청에 쿠키를 삽입했습니다.
listen app-servers 127.0.0.1:80
cookie server insert
balance roundrobin
option persist
option redispatch
server appserver1 10.0.0.1:80 cookie srv1
server appserver2 10.0.0.2:80 cookie srv2