2011-10-07 78 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