Использование сокета.io с nodejs на сервере с apache в качестве обратного прокси
Я пытаюсь использовать Node.js с гнездом.IO для облегчения обмена сообщениями между браузером и клиентом, следуя руководство.
однако мне пришлось настроить узел обратного проксирования за Apache. Итак, вместо примера.com: 8080 для узла, я использую example.com/nodejs/.
это, кажется, вызывает сокет.ИО потерять чувство себя. Вот мой узел 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 );
});
});
и вот как выглядит мой клиентский файл
<!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>
в проблема здесь заключается в ссылке скрипта наhttp://example.com/nodejs/socket.io/socket.io.js. Он не возвращает ожидаемое содержимое javasscript-вместо этого он возвращает " Добро пожаловать в сокет.io " как будто я ударил http://example.com/nodejs/.
есть идеи, как я могу это сделать?
3 ответов
это заканчивалось многоэтапного решения.
во-первых, на серверной части вещей, я должен был настроить конечные точки, как это
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
});
затем на стороне клиента, для правильного подключения выглядит так
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(){} );
после этого все работало. Помню, на этом сервере Apache прокси example.com/nodejs порт 8080.
Я не думаю, что это имеет какое-либо отношение к вашему прокси-серверу apache, но некоторые "причуды" с how socket.io обрабатывает запросы в подкаталоге. Смотрите мой ответ здесь. конфигурация NGINX для работы с сокетом.IO
в принципе, вам нужно использовать этот оператор connect вместо:
var socket = io.connect('http://example.com', {resource:'nodejs/socket.io'});
Если кто-то заинтересован, только это сработало для меня. Замените порт 3000 на порт Nodejs
Apache 2.2.14 внутри вашего 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/ [P]
ProxyRequests off
ProxyPass /socket.io/ ws://localhost:3001/socket.io/
ProxyPassReverse /socket.io/ ws://localhost:3001/socket.io/
соединение на стороне клиента:
var myIoSocket = io.connect($location.protocol() + '://' + $location.host(), {path: '/socket.io'});
не нужно ничего менять на узле.Яш стороны.