2011-10-07 12 views
6

다음과 같은 방법으로 Node.js + Socket.io + 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> 

내가 URL에 포트 8080에 갈 때 늘 작업의 fs.readFile를 사용했다이 예에서 :와 소켓 연결을 열 수 있습니다.

제안 사항? Tks.

+0

정적 파일을 제공하려는 경우 특히 아파치 대신 nginx를 사용하십시오. Apache는 노드를 사용함에 대한 철학/이유에 부분적으로 비견되는 모든 요청에 ​​대해 새 스레드를 시작합니다. – badunk

답변

14

당신은 당신의 Socket.IO 응용 프로그램

아파치 포트 80에서 app = require('http').createServer(handler) 필요하지 않습니다 아파치 포트 80에서 정적 콘텐츠를 제공하고 포트 8080에 Socket.IO 서버를 통해 동적/데이터 콘텐츠를 제공 | ------------- | 클라이언트 | ------------ | 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 파일을 얻지 못했기 때문에 변경을 수행했다. 이 파일은 노드의 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 포트를 변경하십시오.

    ,363,210
  1. 실행 명령 예를 들어, 포트,의/var/www /에서 html로
  2. 실행 Nodejs (80)가 아닌 다른 포트에서 NodeJS 서버의 파일에 대한 "nodejs"라는 폴더를 만듭니다 8000
  3. : a2enmod proxy_http를
  4. 실행 명령 : a2enmod proxy_wstunnel
  5. 은 다음 파일의 끝에 다음 두 줄을 넣어 :

    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는 서비스 아파치를 다시 시작 (당신이 만든 다른 사이트가있는 경우, 거기에 라인을 넣어)


CLIENT SIDE
AngularJS에서 Socket.io를 구현하려면 다음을 사용하십시오. 이 가이드는
도 유용하다고 생각합니다. socket.io 기술의 기본 자바 스크립트 구현

PHP 서버를 호출하려면 : 예를 들어.COM
는 NodeJS 서버를 호출하려면 : NodeJS 소켓 호출하려면
을 example.com/nodejs : example.com < ---이 호출 라이브러리에서 기본적으로 수행됩니다

내가 도움이 당신을 바랍니다!

+0

감사합니다. 아파치 서버에서 socket.io를 실행하면 문제를 해결할 수있었습니다. – prateekkathal

관련 문제