带有 websockets 的 apache mod 代理平衡器

标签 apache websocket uwsgi

我有 uWSGI + Apache 和以下 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/

现在我想实现粘性 session 并使 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/

现在的问题是如何传递到 RewriteRule 选定的工作 URL?因为我需要更改 WebSockets 握手中的协议(protocol)。

谢谢!

最佳答案

我最近偶然发现了同样的问题。我不能 100% 确定这是正确的路径(而且感觉相当冗长),但它似乎是一个实用的选项!

基本上,我创建了两个不同的平衡器组,一个用于 HTTP 流量,另一个用于 WebSocket。我不太确定 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/

创意来源:https://serverfault.com/a/808640/437243

关于带有 websockets 的 apache mod 代理平衡器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43878091/

相关文章:

python - 从 docker 容器发送唤醒局域网数据包

architecture - CQRS 和 WebSocket

javascript - 实时通知 node.js

Django_Socketio 和 Apache

c - 基本 Apache 模块中的链接器错误

python - pip install uwsgi 失败并显示 "cannot find -lz"

python - 如何配置 uwsgi 将日志记录编码为 json,应用程序输出除外

apache - 这些重写规则的 IIS 等价物是什么?

eclipse - Stardust和Activiti有什么区别

java - 重新编译在没有源 java 文件夹的情况下部署在 apache tomcat 上的 Java 中创建的 Web 应用程序