回答:
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
Apache httpdがすぐにそれらをサポートすることを示すものは何もありません。
Apacheを介してwebsocketを実行する必要がある場合は、mod_pywebsocketを試してください。私はそれを試してみましたが、動作します。
私が好むいくつかの選択肢があります:
切断プラグインといくつかの追加コードの組み合わせにより、これが可能になりました。
http://blog.alex.org.uk/2012/02/16/using-apache-websocket-to-proxy-tcp-connection/
http://github.com/disconnect/apache-websocketをご覧ください
apache-websocketモジュールは、Apache 2.xサーバーがWebSocketプロトコルを使用してリクエストを処理するために使用できるApache 2.xサーバーモジュールです。
The module consists of a plugin architecture ...
これは、@ Andrew Mossに追加されVirtualHost
、socket.io 1.0で動作するように正しく構成する方法に関する回答です!CentOSに関する部分は自由にスキップしてください!
CentOS 6にこだわっている場合、その方法は次のとおりです。
mod_proxy_wstunnel
モジュールのバックポートされたソースをここからダウンロードします(Gistを複製するか、ファイルを個別にダウンロードします)yum install make gcc httpd-devel
.c
に-fileをSOURCES
環境のサブフォルダと.spec
に-file SPECS
サブフォルダ。rpmbuild -ba mod_proxy_wstunnel.spec
SRPMS
サブフォルダーにありますrpm -i /path/to/package.rpm
これにより、モジュールがApacheに自動的にロードされるため、で再起動するだけで済みますservice httpd restart
。
モジュールのバグのため、Apache 2.2ではVirtualHost
Socket.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。
./buildconfig
した後、構成ファイルを作成するために実行する必要がありました。そして、インストールするように言われたいくつかの依存関係がありました。