最近打算正式使用websocket,需要做负载,而使用的是apache http server,捣腾了一天找到了一种比较靠谱的方式,特此记录一下。
加载的模块如下:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_express_module modules/mod_proxy_express.so
不排除有遗漏,因为我这边全部加载的,只去除了几个不需要的。
conf/http.conf中需要加入或者删除注释:
Include conf/extra/httpd-vhosts.conf
conf/extra/httpd-vhosts.conf配置:
<VirtualHost *:8088>
ServerAdmin webmaster@dummy-host.bigdata.com
ServerName localhost
ErrorLog "logs/bigdata.com-error_log"
CustomLog "logs/bigdata.com-access_log" common
ProxyRequests Off
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
# websocket
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) balancer://proxy2/$1 [P,QSA,L]
Proxypass /bigdata balancer://proxy
#stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse /bigdata balancer://proxy
#ProxyPassReverseCookiePath /bigdata /bigdata
<Proxy balancer://proxy2>
Order Deny,Allow
Allow from all
RequestHeader set Connection "Upgrade"
RequestHeader set Upgrade "websocket"
BalancerMember ws://10.214.136.181:8080 loadfactor=2 route=work89
BalancerMember ws://10.214.136.180:8080 loadfactor=1 route=work90
ProxySet stickysession=ROUTEID
</Proxy>
<Proxy balancer://proxy>
Order Deny,Allow
Allow from all
BalancerMember http://10.214.136.180:8080/bigdata loadfactor=2 route=work89
BalancerMember http://10.214.136.180:8080/bigdata loadfactor=1 route=work90
ProxySet stickysession=ROUTEID
</Proxy>
</VirtualHost>
根据头信息是否是websocket来重写url。