[英]apache mod proxy balancer with websockets
I have uWSGI + Apache with following apache config:我有带有以下 apache 配置的 uWSGI + Apache:
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:3031/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://127.0.0.1:3031/$1 [P,L]
ProxyPass / http://127.0.0.1:3031/
Now I want to implement sticky sessions and make apache use proxy balancer for each worker:现在我想实现粘性会话并使 apache 为每个工作人员使用代理平衡器:
<Proxy "balancer://uwsgiworkers">
BalancerMember "http://127.0.0.1:3031" route=1
BalancerMember "http://127.0.0.1:3032" route=2
BalancerMember "http://127.0.0.1:3033" route=3
ProxySet stickysession=ROUTEID
ProxySet lbmethod=byrequests
</Proxy>
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://??????/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://???????/$1 [P,L]
ProxyPass balancer://uwsgiworkers/
And now problem is how to pass to RewriteRule
selected worker URL?现在的问题是如何将选定的工作 URL 传递给
RewriteRule
? As I need to change protocol in WebSockets handshake.因为我需要在 WebSockets 握手中更改协议。
Thanks!谢谢!
I have just recently stumbled upon the same problem.我最近偶然发现了同样的问题。 I am not 100% certain this is the right path to go down (and it feels pretty verbose), but it seems to be a functional option!
我不是 100% 确定这是正确的路径(而且感觉很冗长),但它似乎是一个功能选项!
Basically, I created two different balancer groups, one for HTTP traffic and one for WebSocket.基本上,我创建了两个不同的平衡器组,一个用于 HTTP 流量,另一个用于 WebSocket。 I'm not quite sure whether
ProxyPass
can be omitted here (it seems that balancer://
takes care of the ProxyPass part), but it seems to work nicely in my environment!我不太确定此处是否可以省略
ProxyPass
(似乎balancer://
处理了 ProxyPass 部分),但它似乎在我的环境中运行良好!
<Proxy "balancer://uwsgiworkers">
BalancerMember "http://127.0.0.1:3031" route=1
BalancerMember "http://127.0.0.1:3032" route=2
BalancerMember "http://127.0.0.1:3033" route=3
ProxySet stickysession=ROUTEID
ProxySet lbmethod=byrequests
</Proxy>
<Proxy "balancer://uwsgiworkersws">
BalancerMember "ws://127.0.0.1:3031" route=1
BalancerMember "ws://127.0.0.1:3032" route=2
BalancerMember "ws://127.0.0.1:3033" route=3
ProxySet stickysession=ROUTEID
ProxySet lbmethod=byrequests
</Proxy>
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) balancer://uswsgiworkersws/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) balancer://uswsgiworkers/$1 [P,L]
# I actually think this can be omitted
# it seems that balancer:// handles the ProxyPass
# ProxyPass balancer://uwsgiworkers/
Credit for the idea: https://serverfault.com/a/808640/437243这个想法的功劳: https : //serverfault.com/a/808640/437243
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.