2012-05-03 18 views
9

Próbuję użyć Node.js z Socket.IO do ułatwienia przesyłania wiadomości między przeglądarką a klientem, postępując zgodnie z the guide.Używanie socket.io z nodejs na serwerze z apache jako odwrotnym proxy

Jednak musiałem skonfigurować Węzeł odwrotny-proxy za Apache. Tak więc zamiast example.com:8080 dla węzła używam example.com/nodejs/.

Wydaje się, że Socket.IO traci poczucie samego siebie. Oto mój węzeł aplikacja

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); 
    }); 

}); 

A oto co mój plik klient wygląda

<!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> 

Problemem jest tutaj odniesienie skrypt http://example.com/nodejs/socket.io/socket.io.js. Nie zwraca oczekiwanej zawartości javasscript - zamiast tego zwraca "Welcome to socket.io", jak gdybym trafił http://example.com/nodejs/.

Masz pomysł, jak to zrobić?

+0

Wiem, że to nie ma związku z danym pytaniem (i proszę, zadzwoń do mnie, jeśli powinienem otworzyć nowe pytanie SO), ale jestem ciekawy jak wygląda twój httpd.conf Apache. Mam serwer proxy skonfigurowany do przekazywania na aktualny serwer node.js, jednak nie mogę uruchomić serwera proxy WebSocket. Czy mógłbyś podać przykład tego, jak robisz to z Apache? – pmalbu

+0

Przepraszam, ale nie mogę. Ten projekt został wykonany na hackathonie ponad 2 lata temu, a skonfigurowany serwer nie istnieje. –

Odpowiedz

7

To okazało się być wieloaspektowe rozwiązania.

pierwsze, na końcu serwera rzeczy, musiałem skonfigurować punkty końcowe jak ten

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 
}); 

Następnie na stronie klienta, niezbędny do prawidłowego podłączenia wygląda następująco

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(){}); 

Po tym wszystkim wszystko działało. Pamiętaj, że na tym serwerze Apache proxy.com/nodejs pośredniczy w portowaniu 8080 wewnętrznie.

+2

Z której wersji pliku socket.io korzystałeś? Próbowałem wspomnianego rozwiązania. Ale wszystkie nagłówki HTTP zostaną usunięte, jeśli żądanie gniazda sieci Web zostanie przekierowane przez apache mod_proxy.Tak więc socket.io zamyka połączenie jako "niepoprawne połączenie websocket". –

4

Nie sądzę, że ma to coś wspólnego z serwerem proxy Apache, ale niektóre "dziwactwa" z tym, w jaki sposób socket.io obsługuje żądania w podkatalogu. Zobacz moją odpowiedź tutaj. NGINX configuration to work with Socket.IO

Zasadniczo, trzeba użyć tego connect oświadczenie zamiast:

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

+3

Od wersji socket.io 1.0 '{resource: ...' zostaje zastąpione przez '{path: ...' – ceremcem

0

Jeśli ktokolwiek jest zainteresowany, tylko to zadziałało dla mnie. Wymień portu 3000 z portu Nodejs

Apache 2.2.14 wewnątrz VirtualHost

<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/ 

boczne podłączenie Klient:

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

Nie trzeba nic zmieniać na stronie node.js.

Powiązane problemy