WebSocketをプロキシするようにApache2を構成しますか?


40

WebSocketプロトコルは、HTTPプロトコルの拡張です。ただし、Apache2のプロキシモジュールはそれを認識していないようで、重要なヘッダーを破棄して、呼び出しを標準のHTTP呼び出しに変換します。

Apache2に(1)WebSocketを理解させる方法、または(2)取得したものを盲目的に単純に渡す方法はありますか?

回答:


23

mod_proxy(ProxyPass / ProxyPassReverse)がWebSocketトラフィックを通過させるmod_proxy_wstunnelと呼ばれるモジュールがApacheトランクにあります。誰かがmod_proxy_wstunnelをApache 2.4 / 2.2に移植することに関するブログ投稿を書き、そのためのパッチを提供しました。

Ubuntuでmod_proxy_wstunnelをセットアップする具体的な手順を見つけ(Ubuntu Server 11.10およびApache 2.2.20でテスト済み)、ブログに投稿しました。以下にコピーしました:

# Check apache version (should be 2.2.20 as of writing, if not adjust the next step)
dpkg -s apache2

# Checkout apache source
svn checkout http://svn.apache.org/repos/asf/httpd/httpd/tags/2.2.20/ httpd-2.2.20

# Get patch and apply it
wget http://cafarelli.fr/gentoo/apache-2.2.24-wstunnel.patch
cd httpd-2.2.20
patch -p1 < ../apache-2.2.24-wstunnel.patch

# Build Apache 
svn co http://svn.apache.org/repos/asf/apr/apr/branches/1.4.x srclib/apr
svn co http://svn.apache.org/repos/asf/apr/apr-util/branches/1.3.x srclib/apr-util
./buildconf
./configure --enable-proxy=shared --enable-proxy_wstunnel=shared
make

# Copy the module and recompiled mod_proxy (for new symbols) to the ubuntu apache installation and update the permissions to match the other modules
sudo cp modules/proxy/.libs/mod_proxy{_wstunnel,}.so /usr/lib/apache2/modules/
sudo chmod 644 /usr/lib/apache2/modules/mod_proxy{_wstunnel,}.so
echo -e "# Depends: proxy\nLoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so" | sudo tee -a /etc/apache2/mods-available/proxy_wstunnel.load

# Enable the module (also make any configuration changes you need)
sudo a2enmod proxy_wstunnel
sudo service apache2 restart

2
私があなたのガイドに従ったとき、あなたが持っていないステップがありました。aprチェックアウトを実行./buildconfigした後、構成ファイルを作成するために実行する必要がありました。そして、インストールするように言われたいくつかの依存関係がありました。
-notbad.jpeg

これは、WSS経由でGlassfish 4と接続しますか?(SSL)
アルキメデス

1
@ notbad.jpeg:おそらく./buildconf(./buildconfigではない)を意味します:-)
エリックフォースバーグ

1
ちょうど私のフィードバック...これはUbuntu 12.04からapache 2.2.22-1ubuntu1.10にインストールされてロードされましたが、最終的にはうまくいきませんでした。プロキシは「アップグレード」ヘッダーを削除していました(ソースコードには「RFC2616 13.5.1はこれらのヘッダーを削除する必要がある」と書かれています)。代わりにiptables DNATルールに置き換えました。
ピーター

11

Apache httpdがすぐにそれらをサポートすることを示すもの何もありません

Apacheを介してwebsocketを実行する必要がある場合は、mod_pywebsocketを試してください。私はそれを試してみましたが、動作します。

私が好むいくつかの選択肢があります:




1

これは、@ Andrew Mossに追加されVirtualHost、socket.io 1.0で動作するように正しく構成する方法に関する回答です!CentOSに関する部分は自由にスキップしてください!


CentOS 6にこだわっている場合、その方法は次のとおりです。

  1. mod_proxy_wstunnelモジュールのバックポートされたソースをここからダウンロードします(Gistを複製するか、ファイルを個別にダウンロードします)
  2. ビルドに必要なすべてをインストールします。 yum install make gcc httpd-devel
  3. RPMビルド環境をセットアップします(基本的には非特権ユーザーといくつかのディレクトリ)
  4. コピー.cに-fileをSOURCES環境のサブフォルダと.specに-file SPECSサブフォルダ。
  5. 走る rpmbuild -ba mod_proxy_wstunnel.spec
  6. パッケージは現在SRPMSサブフォルダーにあります
  7. パッケージをインストールします。 rpm -i /path/to/package.rpm
  8. 利益

これにより、モジュールがApacheに自動的にロードされるため、で再起動するだけで済みますservice httpd restart


モジュールのバグのため、Apache 2.2ではVirtualHostSocket.ioサーバーとクライアントスクリプト(デフォルトではで利用可能http://your.server/socket.io/socket.io.js)を実際に提供するように設定するのは少し複雑ですmod_proxy

次の書き換えルールが与えられた場合:

RewriteRule    ^/ws(.*)$  ws://localhost:9000/ws  [P]

mod_rewrite これをファイルパスとして扱うので、アクセスログは次を表示します:

[26/Sep/2013:09:46:07 -0400] "GET /ws://localhost:9000/ws HTTP/1.1" 400 317

したがって、rewrite-rule-protocolを使用wsすることはできません。これは内部でHTTP GETリクエストに変わるためです。

ただし、回避策があります。

<VirtualHost *:80>
        ServerName your.server

        # Proxy socket.io Websocket
        RewriteEngine On

        # socket.io 1.0+ starts all connections with an HTTP polling request
        RewriteCond %{QUERY_STRING} transport=polling       [NC]
        RewriteRule /(.*)           http://localhost:8081/$1 [P]

        ProxyRequests Off

        # Explicitly send the request for the client-script to HTTP:
        ProxyPass /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js
        ProxyPassReverse /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js

        # Anything else goes to the WebSocket protocol:
        ProxyPass /socket.io/ ws://localhost:8081/socket.io/
        ProxyPassReverse /socket.io/ ws://localhost:8081/socket.io/

        # Any additional stuff (the actual site) comes here
        ProxyPass / http://localhost:8081/
        ProxyPassReverse / http://localhost:8081/
</VirtualHost>

これは、すべてがために送られていることを確認して作る/socket.ioに行くws://と、クライアント・ライブラリーの要求(WebSocketをが利用できないフォールバックメカニズムである)ロングポーリングの要求を除いて、-protocol。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.