2012-05-03 8 views
9

Ich versuche Node.js mit Socket.IO zu verwenden, Messaging zwischen dem Browser und Client zu erleichtern, nach the guide.mit NodeJS auf einem Server mit Apache als Reverse Proxy verwenden socket.io

Allerdings musste ich Setup Knoten hinter Apache Reverse-Proxy. Statt example.com:8080 für node verwende ich example.com/nodejs/.

Dies scheint Socket.IO zu verursachen Sinn für sich selbst zu verlieren. Hier ist mein Knoten App

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

// this has to be here, otherwise the client tries to 
// send events to example.com/socket.io instead of example.com/nodejs/socket.io 
io.set('resource', '/nodejs/socket.io'); 

io.sockets.on('connection', function (socket) { 

    socket.emit('bar', { one: '1'}); 

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

}); 

Und hier ist es, was meine Client-Datei

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>Socket.IO test</title> 

    <script src="http://example.com/nodejs/socket.io/socket.io.js"></script> 

    <script> 

    var socket = io.connect('http://example.com/nodejs/'); 

    console.log(socket); 

    socket.on('bar', function (data) 
    { 
    console.log(data); 
    socket.emit('foo', {bar:'baz'}); 
    }); 

    socket.emit('foo',{bar:'baz'}); 

    </script> 
</head> 
<body> 
    <p id="hello">Hello World</p> 
</body> 
</html> 

Das Problem hier ist das Skript Bezug auf http://example.com/nodejs/socket.io/socket.io.js wie

aussieht. Es gibt nicht den erwarteten Javascript-Inhalt zurück - stattdessen gibt es "Willkommen bei socket.io" zurück, als würde ich http://example.com/nodejs/ treffen.

Jede Idee, wie ich diese Arbeit machen kann?

+0

Ich weiß, dass dies nicht mit der Frage zusammenhängt (und bitte rufen Sie mich an, wenn ich eine neue SO Frage öffnen sollte), aber ich bin neugierig, wie Ihre Apache httpd.conf aussieht. Ich habe eine Proxy-Einrichtung für die Weitergabe an den eigentlichen node.js-Server eingerichtet, jedoch kann ich den websockets-Proxy nicht verwenden. Könnten Sie bitte ein Beispiel geben, wie Sie das mit Apache machen? – pmalbu

+0

Sorry, aber ich kann nicht. Dieses Projekt wurde vor über 2 Jahren bei einem Hackathon durchgeführt und der Server, der dafür eingerichtet wurde, existiert nicht mehr. –

Antwort

7

Dies ist ein Multi-Säulen-Lösungen endete als.

Zuerst auf dem Server Ende der Dinge, ich hatte die Endpunkte wie diese

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

var rootSockets = io.of('/nodejs').on('connection', function(socket) 
{ 
    // stuff 
}); 

var otherSockets = io.of('nodejs/other').on('connection', function(socket) 
{ 
    // stuff 
}); 

Dann wird auf der Client-Seite einzurichten, um richtig diese

var socket = io.connect(
    'http://example.com/nodejs/' 
    , {resource: 'nodejs/socket.io'} 
); 

// The usage of .of() is important 
socket.of('/nodejs').on('event', function(){}); 
socket.of('/nodejs/other').on('event', function(){}); 

sieht aus wie zu verbinden Danach hat alles funktioniert. Beachten Sie, dass Apache auf diesem Server example.com/nodejs intern an Port 8080 weiterleitet.

+2

Welche Version von socket.io hast du benutzt? Ich habe die erwähnte Lösung ausprobiert. Alle HTTP-Header werden jedoch entfernt, wenn die Web-Socket-Anforderung über Apache mod_proxy weitergeleitet wird.So schließt socket.io die Verbindung als "Websocket-Verbindung ungültig". –

4

Ich glaube nicht, dass dies etwas mit Ihrem Apache-Proxy, aber einige ‚Macken‘ zu tun, wie socket.io verarbeitet Anforderungen an einem Unterverzeichnis. Siehe meine Antwort hier. NGINX configuration to work with Socket.IO

Grundsätzlich müssen Sie stattdessen diese Connect-Anweisung verwenden:

var socket = io.connect('http://example.com', {resource:'nodejs/socket.io'});

+3

Ab socket.io 1.0 '{resource: ...' wird ersetzt durch '{path: ...' – ceremcem

0

Wenn jemand interessiert ist, nur arbeitete für mich. ersetzen Port 3000 mit NodeJS Port

Apache 2.2.14 in Ihrem Virtual

<IfModule mod_proxy.c> 
     <Proxy *> 
     Order allow,deny 
     allow from all 
     </Proxy> 
    </IfModule> 

    RewriteEngine on 

    RewriteCond %{QUERY_STRING} transport=polling 
    RewriteRule /(.*)$ http://localhost:3001/$1 [P] 

    ProxyRequests off 
    ProxyPass /socket.io/ ws://localhost:3001/socket.io/ 
    ProxyPassReverse /socket.io/ ws://localhost:3001/socket.io/ 

Client-Seite-Anschluss:

var myIoSocket = io.connect($location.protocol() + '://' + $location.host(), {path: '/socket.io'}); 

Keine Notwendigkeit, irgendetwas auf Node.js Seite zu ändern.