2011-10-07 79 views
6

我正在尋找一種方法來以下列方式集成Node.js + Socket.io + Apache: 我希望apache繼續提供HTML/JS文件。 我想Node.js的監聽端口連接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' }); 
    }); 

}); 

如果我訪問連接到該服務器上的HTML,它的工作原理,但我需要去mydomian.com:8080 /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> 

在這個例子中,我不得不使用不會工作fs.readFile當我去到端口8080的URL。

有什麼建議嗎?韓國社交協會。

+0

嘗試nginx而不是apache,特別是如果你只是想提供靜態文件。 Apache爲每個請求啓動一個新線程,這與使用節點的理念/原因有部分相反。 – badunk

回答

14

Apache的80端口服務您的靜態內容和服務動態/數據的內容,通過端口8080一Socket.IO服務器時,不需要app = require('http').createServer(handler)在Socket.IO應用

Apache的端口80 | ------------- |客戶| ------------ | 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

是的,你會想從你的Apache靜態服務器上的端口80上提供socket.io.js,並在你的客戶端代碼 – EhevuTov

4

AWS + APACHE + +的NodeJS + SOCKET.IO ANGULARJS

服務器端
這爲我工作在生產服務器上運行的端口阿帕奇80和NodeJS 。通過您希望的選項更改NodeJS端口...

  1. 創建一個名爲「的NodeJS」,爲的NodeJS服務器位於/ var/www/html等
  2. 運行的NodeJS不同的端口80上的文件的文件夾,例如8000端口
  3. 執行命令:a2enmod proxy_http
  4. 執行命令:a2enmod proxy_wstunnel
  5. 將接下來的2線在以下文件的末尾:/etc/apache2/apache2.conf中

    LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so 
    LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so 
    
  6. 將在接下來的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. 須藤服務的Apache2重啓


CLIENT SIDE
我使用以下library在AngularJS中實現Socket.io,但是 我認爲本指南
也是有用的用於socket.io技術的基本Javascript實現。

打電話給我的PHP服務器:例子。COM
要調用服務器的NodeJS:example.com/nodejs
要調用插座的NodeJS:example.com < ---這個調用將被默認由庫完成

我希望幫助你!

+0

謝謝,我能解決在apache服務器上運行socket.io的問題。 – prateekkathal