2012-05-03 14 views
9

the guideの後に、ブラウザとクライアント間のメッセージングを容易にするためにSocket.IOでNode.jsを使用しようとしています。apacheをリバースプロキシとして使用するサーバーでnodejsとsocket.ioを使用する

しかし、Apacheの背後に逆プロキシされたNodeをセットアップする必要がありました。だから、example.com:8080の代わりにnodeのために、私はexample.com/nodejs/を使用しています。

これは、Socket.IOがそれ自身の感覚を失うように思えます。ここに私のノードアプリは

var io = require('socket.io').listen(8080); 

// this has to be here, otherwise the client tries to 
// send events to example.com/socket.io instead of example.com/nodejs/socket.io 
io.set('resource', '/nodejs/socket.io'); 

io.sockets.on('connection', function (socket) { 

    socket.emit('bar', { one: '1'}); 

    socket.on('foo', function(data) 
    { 
    console.log(data); 
    }); 

}); 

そして、ここでは私のクライアントのファイルは、ここでの問題はhttp://example.com/nodejs/socket.io/socket.io.jsへのスクリプト参照である

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>Socket.IO test</title> 

    <script src="http://example.com/nodejs/socket.io/socket.io.js"></script> 

    <script> 

    var socket = io.connect('http://example.com/nodejs/'); 

    console.log(socket); 

    socket.on('bar', function (data) 
    { 
    console.log(data); 
    socket.emit('foo', {bar:'baz'}); 
    }); 

    socket.emit('foo',{bar:'baz'}); 

    </script> 
</head> 
<body> 
    <p id="hello">Hello World</p> 
</body> 
</html> 

次のようになりますです。期待されるjavasscriptのコンテンツを返しません。代わりに、私がhttp://example.com/nodejs/を打つかのように "welcome to socket.io"を返します。

どのように私はこの作品を作ることができますか?

+0

これは手元の質問とは無関係であることを知っています(新しいSO質問を開く必要がある場合は私に電話してください)が、あなたのApache httpd.confがどのように見えるか不思議です。実際のnode.jsサーバに渡すためにプロキシを設定しましたが、WebSocketプロキシを動作させることができません。あなたはApacheでこれをやっている例を教えてください。 – pmalbu

+0

申し訳ありませんが、私はできません。このプロジェクトは2年以上前にhackathonで行われており、設定されたサーバーはもはや存在しません。 –

答えて

7

これは、多面的なソリューションになってしまいました。

まず、物事のサーバー側で、私はきちんとこの

var socket = io.connect(
    'http://example.com/nodejs/' 
    , {resource: 'nodejs/socket.io'} 
); 

// The usage of .of() is important 
socket.of('/nodejs').on('event', function(){}); 
socket.of('/nodejs/other').on('event', function(){}); 

のようなルックスを接続するには、クライアント側で、その後、この

var io = require('socket.io').listen(8080); 

var rootSockets = io.of('/nodejs').on('connection', function(socket) 
{ 
    // stuff 
}); 

var otherSockets = io.of('nodejs/other').on('connection', function(socket) 
{ 
    // stuff 
}); 

のようにエンドポイントを設定する必要がありましたこの後、それはすべて働いた。このサーバでは、Apacheは内部的にポート8080にexample.com/nodejsをプロキシしています。

+2

あなたが使用したsocket.ioのバージョンは?私は言及された解決策を試みた。しかし、WebソケットリクエストがApache mod_proxy経由でルーティングされると、すべてのhttpヘッダーが削除されます。したがって、socket.ioは "websocket connection invalid"として接続を閉じます。 –

4

これはあなたのApacheのプロキシとは関係ありませんが、socket.ioがどのようにサブディレクトリでリクエストを処理するかという「癖」があります。私の答えはここを参照してください。 NGINX configuration to work with Socket.IO

基本的に、あなたの代わりにこの接続ステートメントを使用する必要があります。

var socket = io.connect('http://example.com', {resource:'nodejs/socket.io'});

+3

socket.io 1.0から '{resource:...'は '{path:... 'に置き換えられました – ceremcem

0

誰かが興味があれば、これだけは私のために働いた。

var myIoSocket = io.connect($location.protocol() + '://' + $location.host(), {path: '/socket.io'}); 

Node.jsの側に何も変更する必要はありません: あなたのVirtualHost内でごNodejsポート

はApache 2.2.14で

<IfModule mod_proxy.c> 
     <Proxy *> 
     Order allow,deny 
     allow from all 
     </Proxy> 
    </IfModule> 

    RewriteEngine on 

    RewriteCond %{QUERY_STRING} transport=polling 
    RewriteRule /(.*)$ http://localhost:3001/$1 [P] 

    ProxyRequests off 
    ProxyPass /socket.io/ ws://localhost:3001/socket.io/ 
    ProxyPassReverse /socket.io/ ws://localhost:3001/socket.io/ 

クライアント側の接続をポート3000を交換してください。

関連する問題