web-dev-qa-db-ja.com

Socket.IO 1.0用のApache 2.4 mod_proxy_wstunnelの構成

Mod_proxy_wstunnelを使用して、socket.ioのwebsocket接続をnode.js websocketサーバーにプロキシするようにApache 2.4を構成しようとしています。これは、socket.io 0.9で問題なく機能しましたが、1.0リリースでは、ソケットエンドポイントをクエリパラメーターに変更したため、正しいプロキシー命令を使用してApacheを構成できません。

/socket.io/?EIO=N&transport=websocket(Nは任意の数字、通常2)へのすべてのリクエストはws://localhost:8082/socket.io/に転送する必要がありますが、他のすべてのリクエストはhttp://localhost:8082/socket.io/に転送する必要があります。

私は次の両方の構成のバリエーションを試しました:

ProxyPass /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket
ProxyPassReverse /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket

ProxyPass /socket.io/ http://localhost:8082/socket.io/
ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/

RewriteRule /socket.io/?EIO=([0-9]+)&transport=websocket ws://localhost:8082/socket.io/ [QSA,P]

ProxyPass /socket.io/ http://localhost:8082/socket.io/
ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/

私はグーグルから、ProxyPassとLocationsがクエリ文字列をターゲットにできないことを収集しました。ここに他のオプションはありますか?パスはsocket.ioにハードコードされているので、ライブラリ全体をフォークしないと変更できません。

15
ChiperSoft

この特別なケースに一致させるには、書き換え条件を使用します。

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

ProxyPass        /socket.io http://localhost:8082/socket.io
ProxyPassReverse /socket.io http://localhost:8082/socket.io

注マークWが以下に記したように。これらの必須は、サーバーまたは.htaccessレベルではなく、仮想ホストレベルで入力します。

バランサーを参照することもできます。

<Proxy balancer://http-localhost/>
    BalancerMember http://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember http://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=bytraffic
</Proxy>

<Proxy balancer://ws-localhost/>
    BalancerMember ws://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember ws://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=bytraffic
</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
39
PeterPramb