Клиент Socket.io не получает испущенные события, когда находится на пути за обратным прокси-сервером apache - PullRequest
0 голосов
/ 05 сентября 2018

Я использую socket.io в моем приложении узла. У меня также есть ионное приложение в качестве клиента. Они работают, когда оба обслуживаются с моей машины под localhost. Однако сегодня приложение узла было загружено на тестовый сервер с Apache. Apache настроен в качестве обратного прокси-сервера для сервера nodejs в https://SERVER_IP/attendance, и клиент подключается к серверу socket.io, однако отправленные события не передаются клиенту.

Я выложу соответствующий код для конфигурации клиента, сервера и apache:

Ионный код клиента

this.socket = io(this.socketUrl, {
    query: {
      sessionId: sessionId
    }
  });
  this.socket.on('connect', (data) => {
    console.log('connected', data);
  });
  this.socket.on('code received', (code) => {
    console.log('code received');
    this.code = code;
  });

код узла nodejs

io.on('connection', function (socket) {
  const querySessionId = socket.handshake.query.sessionId;
  connectedClients[querySessionId] = socket;
  socket.broadcast.emit('connect', 'connected');
  socket.on('disconnect', function () {
    delete connectedClients[querySessionId];
  });
});

connectedClients[sessionId].emit('code received', newCode);

Я использую connectedClients, чтобы вести список клиентов и отправлять сообщения соответствующему клиенту, а не всем.

apache config

<VirtualHost *:80>
  ...

  ProxyPreserveHost On
  RewriteEngine On
  RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
  RewriteCond %{QUERY_STRING} transport=websocket    [NC]
  RewriteRule /(.*)           ws://localhost:3000/$1 [P,L]

  ProxyPass        /socket.io http://localhost:3000/socket.io
  ProxyPassReverse /socket.io http://localhost:3000/socket.io
  ProxyPass /attendance http://localhost:3000
  ProxyPassReverse /attendance http://localhost:3000
</VirtualHost>

Приложение nodejs работает на порту 3000 на сервере. Странно то, что если я попытаюсь подключиться через порт, а не через путь / посещаемость, это сработает, и отправленные события будут получены клиентом.

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