Конфигурация NGINX для работы с Socket.IO - PullRequest
7 голосов
/ 21 февраля 2012

Итак, я пытался заставить это работать 2 дня, и я застрял.Я впервые настраиваю сервер для рельсов, который использует NodeJS + Socket IO.Я нуб с NGINX и Единорогом.В основном часть моего приложения NodeJS + SocketIO будет отправлять сообщения пользователям, которые подключены к моему приложению.Это мой nginx.conf

server{
    listen 80 default;
    root /home/deployer/saigon/public;
    try_files $uri/index.html $uri @unicorn;

    location /sockets {
        proxy_pass http://localhost:3210;
    }

    location @unicorn {
       proxy_pass http://localhost:3000;
    }
}

И в моем файле production.rb я настроил URL-адрес, по которому пользователь должен будет отправлять / получать сообщения от

SOCKET_IO_URL ='http://localhost:8080/sockets

Почему8080?Я использую Vagrant для пересылки 8080 -> 80

. Я попытался получить доступ к http://localhost:8080/sockets, и мне удалось получить приветственное сообщение сокета.Я посмотрел на свой журнал сервера NodeJS, и он получал сообщения в порядке.Однако, когда дело доходит до вещания ..... он просто не делает этого.Кто-нибудь когда-нибудь получал такое приложение для работы с настройкой, которую я пытаюсь сделать?Должен ли я просто пойти с Apache + Unicorn?

'

1 Ответ

13 голосов
/ 21 февраля 2012

Обновленный ответ

Я наконец-то нашел способ заставить это работать.Это совсем не очевидно, но при размещении socket.io в подпапке вы НЕ используете подпапку в операторе connect.Это то, что я делал раньше, и клиент никогда не получал ответ.

Не работает

<script src="/test/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost:8080/test/', {resource:'test/socket.io'});
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

http://localhost:8080/test/ Это та часть, котораясбрасывает вещиЭто создает пространство имен для локального сокета, который не учитывает сторона сервера.Таким образом, клиент отправляет сообщение в пространство имен «/ test /», но ответы сервера переходят в пустое пространство имен », поэтому клиент никогда не получает сообщения.Обходной путь - просто удалить «/ test /» и убедиться, что вы используете переменную ресурса на клиенте и сервере.

Работаю!

<script src="/test/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost:8080', {resource:'test/socket.io'});
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

Надеюсь, это поможет вам добиться успеха.

Оригинальный ответ

Это не проблема с вашей настройкой, это проблема socket.io, не желающего работать с подпапкой.Готов поспорить, что если вы уроните / сокеты, ваш пример будет работать нормально.Я столкнулся с точно такой же проблемой при использовании http-node-proxy при попытке размещения соединений socket.io в подпапках.Некоторое время назад была создана ошибка, но она была закрыта и никогда не устранялась.

https://github.com/LearnBoost/socket.io-client/issues/185

https://github.com/LearnBoost/socket.io/issues/320

Я все еще ищу решение какхорошо, но у меня есть ощущение, что мне придется закатать рукава и сами покопаться в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...