2011-10-07 18 views
6

Node.js + Socket.io + Apacheを次のように統合する方法を探しています。 Apache/HTMLファイルの配信を継続したい。 私はNode.jsのは、ポート8080で接続を待機するために、このような何かしたい:私は、このサーバーに接続するHTMLにアクセスする場合、それは動作しますが、私はmydomian.com:8080に行く必要がNode.js + Socket.io + Apache

var util = require("util"), 
    app = require('http').createServer(handler), 
    io = require('/socket.io').listen(app), 
    fs = require('fs'), 
    os = require('os'), 
    url = require('url'); 

app.listen(8080); 

function handler (req, res) { 

    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 

    socket.on('my other event', function (data) { 
    socket.emit('ok 1', { hello: 'world' }); 
    }); 

    socket.on('clientMSG', function (data) { 
    socket.emit('ok 2', { hello: 'world' }); 
    }); 

}); 

を/index.html。 私が望むのは、mydomian.com/index.htmlに行くことができることです。ソケット接続開くことができます。この例では

<script> 
     var socket = io.connect('http://mydomain.com', {port: 8080}); 
     socket.on('news', function (data) { 
      console.log(data); 
      socket.emit('my other event', { my: 'data from the client' }); 
     }); 

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

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


      //call this function when a button is clicked 
     function sendMSG() 
     { 
      console.log("sendMSG"); 
      socket.emit('clientMSG', { msg: 'non-scheduled message from client' }); 
     } 

    </script> 

を私はURLにポート8080に行くと文句を言わない仕事のfs.readFileを使用する必要がありました。

提案がありますか? Tks。

+0

特に静的ファイルを提供したい場合は、特にApacheの代わりにnginxを試してください。 Apacheは、ノードを使用するという理念/理由に部分的に反しているすべての要求に対して新しいスレッドを開始します。 – badunk

答えて

14

Apacheのポート80から、あなたの静的なコンテンツを提供し、あなたのSocket.IOアプリ

Apacheのポート80にapp = require('http').createServer(handler)を必要としないポート8080上のSocket.IOサーバの上にダイナミック/データコンテンツを提供| ------------- |クライアント| ------------ |これは、ポート上でApacheを実行している本番サーバー上で私のために働いたSocket.IOポート8080

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

io.sockets.on('connection', function (socket) { 
    io.sockets.emit('this', { will: 'be received by everyone'}); 

    socket.on('clientMSG', function (from, msg) { 
    console.log('I received a private message by ', from, ' saying ', msg); 
    }); 

    socket.on('disconnect', function() { 
    sockets.emit('user disconnected'); 
    }); 
}); 
+0

お返事ありがとうございます。私は変更を行い、クライアントは/socket.io/socket.io.jsファイルを取得しないように見えます。このファイルはNodeのHTTPサーバーによって提供されていますか? – oscarm

+1

私はそれを働かせました。パスを/socket.io-client/dist/socket.io.jsに変更しました。ありがとう! – oscarm

+1

ええ、ポート80のApache静的サーバーからsocket.io.jsを提供し、クライアント側のコード – EhevuTov

4

AWS + APACHE + NODEJS + SOCKET.IO + ANGULARJS

サーバ側
80およびNodeJS (ポート8000​​)。NodeJSポートを希望するオプションで変更してください。

  1. 実行コマンドの例ポートのために、/ var/www/htmlと設定
  2. 実行Nodejs 80とは別のポート上でNodeJSサーバのファイルに対して「nodejsを」という名前のフォルダを作成します8000
  3. :a2enmod proxy_httpを
  4. コマンドを実行します。a2enmod proxy_wstunnel
  5. は、次のファイルの末尾に次の2行を置く:

    LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so 
    LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so 
    
  6. /etc/apache2/apache2.conf以下のファイルの末尾に次の12行を入れてください:/座るES-利用可能/ 000-は、default.conf

    RewriteEngine On 
    RewriteCond %{REQUEST_URI} ^socket.io   [NC] 
    RewriteCond %{QUERY_STRING} transport=websocket [NC] 
    RewriteRule /{.*}  ws://localhost:8000/$1 [P,L] 
    
    RewriteCond %{HTTP:Connection} Upgrade [NC] 
    RewriteRule /(.*) ws://localhost:8000/$1 [P,L] 
    
    ProxyPass /nodejs http://localhost:8000/ 
    ProxyPassReverse /nodejs http://localhost:8000/ 
    
    
    ProxyPass /socket.io http://localhost:8000/socket.io 
    ProxyPassReverse /socket.io http://loacalhost:8000/socket.io 
    
    ProxyPass /socket.io ws://localhost:8000/socket.io 
    ProxyPassReverse /socket.io ws://localhost:8000/socket.io 
    
  7. sudoのサービスapache2の再起動(あなたが作成した別のサイトをお持ちの場合は、そこにラインを入れて)


CLIENT SIDE
AngularJSでSocket.ioを実装するには、次のようなlibraryを使用しますが、 このガイドは
も便利だと思いますsocket.ioテクノロジーの基本的なJavaScript実装です。

PHPサーバーを呼び出すには、次のようにします。NodeJSソケット呼び出すにはexample.com/nodejs
:NodeJSサーバーを呼び出すために、COM
example.com <を---この呼び出しは、私はあなたの助けを願っていますライブラリによってデフォルトで

を行われます!

+0

ありがとう、私はapacheサーバー上でsocket.ioを実行することで問題を解決することができました。 – prateekkathal

関連する問題