2012-02-21 21 views
7

これは2日間働くように努力しており、私は立ち往生しています。 NodeJS + Socket IOを使用するレール用のサーバを初めて設定しました。私はNGINXとUnicornのノブです。基本的に私のアプリのNodeJS + SocketIO部分は、自分のアプリに接続しているユーザーにメッセージをプッシュします。これは私のnginx.confSocket.IOと連携するNGINX設定

server{ 
    listen 80 default; 
    root /home/deployer/saigon/public; 
    try_files $uri/index.html $uri @unicorn; 

    location /sockets { 
     proxy_pass http://localhost:3210; 
    } 

    location @unicorn { 
     proxy_pass http://localhost:3000; 
    } 
} 

であると私production.rbに、私は、ユーザーが

SOCKET_IO_URL ='http://localhost:8080/sockets 

なぜ8080からメッセージを受信/にメッセージを送信する必要がありますURLを設定していますか?私はバグを使って8080を転送します - > 80

私はhttp://localhost:8080/socketsにアクセスしようとしましたが、私はソケットのウェルカムメッセージを受け取ることができました。私はNodeJSサーバーのログを見て、メッセージを受け取りました。しかし、放送になると.....それはしません。誰も私がやろうとしている設定でこの種のアプリを手に入れましたか?私はApache + Unicornと一緒に行かなければならないのですか?

答えて

12

私は最終的にこの作業を取得する方法を考え出した

更新回答。それは明らかではありませんが、サブフォルダにsocket.ioをホストする場合は、connect文でサブフォルダを使用しないでください。これは私が以前にやっていたことであり、クライアントは決して応答を受けていませんでした。

が機能していない

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080/test/', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

http://localhost:8080/テスト/これは物事を投げている部分です。これにより、サーバー側が尊重しないローカルソケットの名前空間が作成されます。したがって、クライアントは '/ test /'という名前空間でメッセージを送信しますが、サーバの応答は空の名前空間に移動するので、クライアントはメッセージを受け取ることはありません。これを回避するには、単に '/ test /'を削除して、クライアントとサーバーでリソース変数を使用していることを確認してください。

作業中!

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

私はこれがあなたの終わりに取り組んで物事を得ることができます願っています。

オリジナル回答

それは、サブフォルダ上で動作するように望んでいないsocket.ioの問題であり、あなたのセットアップの問題ではありません。あなたが/ socketsを落としても、あなたの例はうまくいくはずです。サブフォルダでsocket.io接続をホストしようとすると、http-node-proxyを使用したときと全く同じ問題が発生しました。しばらく前に作成されたバグがありましたが、クローズされて決して解決されませんでした。

https://github.com/LearnBoost/socket.io-client/issues/185

https://github.com/LearnBoost/socket.io/issues/320

私はまだだけでなく解決策を探していますが、私は私の袖をロールアップし、コードの中に自分自身を掘るする必要がありますするつもりだ気持ちを持っています。

+0

ですから、基本的にソケット/ソケットです。IOは私がレールに起こっているとそれがルートに当たるとIOをソケットしようとしている要求を知る必要があることを意味している....その後、ルートフォルダに滞在する必要がありますか? = ___ = argh – denniss

+0

今のところはいです。可能であれば、代わりにサブドメインルートを使用できます。 http://socket.domain.com/。サブドメインのSSL証明書にこれ以上の費用をかけたくないので、これは私のためには機能しませんでした。 –

+0

@denniss私は回避策を使って私の答えを更新しました。これが意図された設計か修正されるべきバグかどうか把握するために、まだそれを掘り下げてください。 –

関連する問題