2016-06-01 4 views
3

В настоящее время я разрабатываю приложение для веб-приложений, которое развертывается на сервере Tomcat. Из-за огромного числа пользователей я хотел бы распространять рабочую нагрузку на несколько экземпляров Tomcat. Я решил использовать Apache для балансировки нагрузки.Баланс загрузки Apache tomcat websocket

Теперь у меня возникла проблема с реализацией балансировки нагрузки Apache и липким сеансом для запросов веб-камер. Это моя конфигурация 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

Как я могу увидеть в файле журнала Apache, это SESSIONID оценивается для stickySession:

... Foun d значение C28C13EEEC525D203F8CA4E827605E0B.jvm1 для stickysession ИДС

... Найдено маршрут jvm1

... балансировочный: // HTTP-локальный: рабочий (htttps: //mcsgest1.desy.de: 8443/Интерактивная доска /) переписан htttps: //mcsgest1.desy.de: 8443/белая доска // файл = octocenter.xml & адрес = /// & с.и.д. = C28C13EEEC525D203F8CA4E827605E0B.jvm1

запрос второго протокола HTTPS еще на порт 8443, но после перехода на протокол websocket, ws-balancer не оценивать SESSIONID и переписывает в 8444:

... балансира: // WS-Localhost: работник (WSS: //mcsgest1.desy.de: 8444/Белая доска /) переписана WSS : //mcsgest1.desy.de: 8444/whiteboard // whiteboardendpoint

Что мне нужно изменить в конфигурации Apache, чтобы включить stickysession также для протокола wss? Мне действительно нужны два балансира (http и ws), чтобы сбалансировать websockets?

ответ

2

Вам не нужен отдельный балансир для websokets, потому что начальный HTTP-запрос уже имеет http-файл cookie и принадлежит к правильному экземпляру.

Вам просто нужно обнаружить подключение обновить и вручную запрос маршрута в зависимости от липкой части печенья

Убедитесь, что вы загружаете прокси-модуль для 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] 
Смежные вопросы