Я использую 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 на сервере. Странно то, что если я попытаюсь подключиться через порт, а не через путь / посещаемость, это сработает, и отправленные события будут получены клиентом.