2016-06-01 11 views
3

현재 Tomcat 서버에 배포 된 websocket 애플리케이션을 개발 중입니다. 엄청난 사용자 수 때문에 작업 부하를 여러 Tomcat 인스턴스에 배포하고 싶습니다. 로드 균형 조정을 위해 Apache를 사용하기로 결정했습니다.Apache로드 밸런스 tomcat websocket

이제 웹 소켓 요청에 대한 Apache로드 균형 조정 및 고정 세션 구현에 문제가 있습니다.

ProxyRequests off 
SSLProxyEngine on 
RewriteEngine On 

<Proxy balancer://http-localhost/> 
    BalancerMember https://mcsgest1.desy.de:8443/Whiteboard/ route=jvm1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 
    BalancerMember https://mcsgest1.desy.de:8444/Whiteboard/ route=jvm2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 
    ProxySet lbmethod=byrequests 
    ProxySet stickysession=JSESSIONID|sid scolonpathdelim=On 
</Proxy> 

<Proxy balancer://ws-localhost/> 
    BalancerMember wss://mcsgest1.desy.de:8443/Whiteboard/ route=jvm1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 
    BalancerMember wss://mcsgest1.desy.de:8444/Whiteboard/ route=jvm2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 
    ProxySet lbmethod=byrequests 
    ProxySet stickysession=JSESSIONID|sid scolonpathdelim=On 
</Proxy> 

RewriteCond  %{HTTP:Upgrade} =websocket 
RewriteRule  /jddd/(.*)  balancer://ws-localhost/$1 [P,L] 
ProxyPassReverse /jddd/   balancer://ws-localhost/ 
RewriteCond  %{HTTP:Upgrade} !=websocket 
RewriteRule  /jddd/(.*)  balancer://http-localhost/$1 [P,L] 
ProxyPassReverse /jddd/   balancer://http-localhost/ 

첫 번째 HTTPS 요청이 포트 8443에 균형 업그레이드 된 WSS 요청이 또한 8443 번째 HTTPS 요청이 첫 번째 요청의 sessionID와를 포함

에 전달됩니다 : 이것은 내 아파치 구성입니다 나는 아파치 로그 파일에서 볼 수 있듯이 https://...&sid=C28C13EEEC525D203F8CA4E827605E0B.jvm1

이 sessionID와는 stickySession에 대한 평가 :

... Foun D 값 C28C13EEEC525D203F8CA4E827605E0B.jvm1 stickysession SID

... 찾을 경로 jvm1

... 밸런서 : // HTTP-로컬 호스트 : 노동자 (htttps : //mcsgest1.desy.de : 8443/화이트 보드 /) htttps에 다시 : //mcsgest1.desy.de : 8443/화이트 보드 // 파일 = octocenter.xml & 주소 = /// & SID = C28C13EEEC525D203F8CA4E827605E0B.jvm1

을 두 번째 HTTPS 요청이 계속됩니다 ws-balancer는 포트 8443에서 websocket 프로토콜로 업그레이드 한 후 sessionid를 평가하고 8444로 다시 작성하지 :

... 분산 : // WS-로컬 호스트를 : 노동자 을 (WSS : //mcsgest1.desy.de : 8444/화이트 보드 /) WSS에 다시 : //mcsgest1.desy.de : 8444/화이트 보드 // whiteboardendpoint

wss 프로토콜에도 stickysession을 사용하려면 Apache 구성에서 무엇을 변경해야합니까? 웹 소켓의 균형을 맞추기 위해 두 개의 밸런서 (http와 ws)가 정말로 필요합니까?

답변

2

초기 HTTP 요청에 이미 HTTP 쿠키가 있고 올바른 인스턴스에 속하기 때문에 websokets에 별도의 밸런서가 필요하지 않습니다.

당신은 단지 업그레이드하고 수동으로 경로 요청

당신이 websokets에 대한 프록시 모듈을로드해야합니다 쿠키의 접착 부분의 따라 연결을 감지 필요 - mod_proxy_wstunnel를 예를 들어

SSLProxyEngine on 
RewriteEngine On 

<Proxy balancer://http-localhost/> 
    BalancerMember https://mcsgest1.desy.de:8443/Whiteboard/ route=jvm1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 
    BalancerMember https://mcsgest1.desy.de:8444/Whiteboard/ route=jvm2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 
    ProxySet lbmethod=byrequests 
    ProxySet stickysession=JSESSIONID|sid scolonpathdelim=On 
</Proxy> 

RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC] 
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC] 
RewriteCond %{HTTP_COOKIE} ^.*(JSESSIONID|sid)=([^=]*)\.jvm1 [NC] 
RewriteRule .* wss://mcsgest1.desy.de:8443%{REQUEST_URI} [P,L] 

RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC] 
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC] 
RewriteCond %{HTTP_COOKIE} ^.*(JSESSIONID|sid)=([^=]*)\.jvm2 [NC] 
RewriteRule .* wss://mcsgest1.desy.de:8444%{REQUEST_URI} [P,L] 

RewriteRule /jddd/(.*) balancer://http-localhost$1 [P,L] 

ProxyPreserveHost On 
ProxyRequests Off 

ProxyPass /jddd/ balancer://http-localhost 
ProxyPassReverse /jddd/ balancer://http-localhost 

설명 :

# if header upgrade = WebSocket 
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC] 
# and header connection contains Upgrade (header may be like this: connection=keep-alive, upgrade) 
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC] 
# and header cookie contains JSESSIONID or sid, ending with sticky part - .jvm1 in that case 
RewriteCond %{HTTP_COOKIE} ^.*(JSESSIONID|sid)=([^=]*)\.jvm1 [NC] 
#than we route request to application server via mod_proxy (P flag) and end rewrite rule check 
RewriteRule .* wss://mcsgest1.desy.de:8443%{REQUEST_URI} [P]