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


15

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にハードコーディングされているため、ライブラリ全体をフォークするまでは変更できません。

回答:


39

書き換え条件を使用して、この特別な場合に一致させます。

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レベルではなく、vhostレベルで入力する必要あります。

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

<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

+100000あなたは私の一日を作りました。これに何時間もいた。最初のコードスニペットを使用しました。現時点ではバランサーは必要ありません。
エモア14

これを機能させることはできません。Apacheは、404コードで応答し続けます。通常のファイルをロードしようとしているかのようにアクセスログに表示され、ソケットノードプロセスはリクエストを受信する兆候を示しません(socket.io.jsファイルの呼び出しを表示します)
ChiperSoft

1
mod_rewriteはws://プロトコルを認識していないようです。書き換えログに次のように表示されます: forcing proxy-throughput with http://[REDACTED].dev/ws://localhost:8082/socket.io/(domain.dev
ChiperSoft

これがおそらく理由です:issues.apache.org/bugzilla/show_bug.cgi?id=55598プロトコルのサポートがApache 2.5で追加されたようです
ChiperSoft 14

5
:これらのブロックは、ドキュメントルート(例:)を使用している場合でも、<VirtualHost>記載されている正確な順序でブロック内に配置する必要があります/var/www/html。これらの変更が適切に機能しなかった理由を解明するために2時間近く費やしましたが、これRewriteRulehttpd.conf(が機能していましたが)のルートレベルで機能していないことを確認するためだけでしたProxyPassProxyPassディレクティブはでは動作しない<Directory>ブロックや.htaccess(がファイルをRewriteRule論理的な場所ので、これらの変更はしているグループに、さんが行います)<VirtualHost>
マークW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.