Socket.io 1.0 的 Apache 负载均衡器粘性会话

Socket.io 1.0 的 Apache 负载均衡器粘性会话

我一直在尝试使用 Apache 作为 Socket.io 服务器的负载平衡器。我浏览了以下主题,现在一切似乎都很好。

为 Socket.IO 1.0 配置 Apache 2.4 mod_proxy_wstunnel

我使用以下配置配置了 Apache,现在连接正在升级到 WebSocket。但是当我尝试为以下配置启用粘性会话时,似乎有时 apache 将升级请求路由到路由 #2,而轮询是在路由 #1 上建立的。发生这种情况时,升级失败,并且 websocket 未连接。由于我们有两个平衡器(一个用于 http,一个用于 ws),我想也许由 http 路由 #1 设置的 cookie 无法通过 ws 路由访问,这就是会话在 http 和 ws 之间不粘性的原因。

我正在使用 apache 2.4.9

<VirtualHost *:8080>
    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

    ProxyRequests off

    ServerName localhost

    <Proxy balancer://http-localhost/>
        BalancerMember http://localhost:8081 route=1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
        BalancerMember http://localhost:8082 route=2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900

        ProxySet lbmethod=byrequests
        ProxySet stickysession=ROUTEID
    </Proxy>

    <Proxy balancer://ws-localhost/>
        BalancerMember ws://localhost:8081 route=1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
        BalancerMember ws://localhost:8082 route=2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900

        ProxySet lbmethod=byrequests
        ProxySet stickysession=ROUTEID
    </Proxy>

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io                [NC]
    RewriteCond %{QUERY_STRING} transport=websocket        [NC]
    RewriteRule /(.*)           balancer://ws-localhost/$1 [P,L]

    ProxyPass /socket.io balancer://http-localhost/socket.io
    ProxyPassReverse /socket.io balancer://http-localhost/socket.io
</VirtualHost>

相关内容