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 之間不具有黏性。

我使用的是阿帕契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>

相關內容