как создать несколько экземпляров Socket.io против пространств имен с помощью nginx - PullRequest
0 голосов
/ 22 марта 2019

Я создаю масштабируемое приложение для чата с Node (express), socket.io и Nginx.

Я понимаю, как работает Nginx, работая как балансировщик нагрузки / обратный прокси. вот мой конфиг Nginx:

worker_processes auto;

events {
    worker_connections  1024;
}

http {
  server {
    listen 80;
    root /public/;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;

        proxy_pass http://io_nodes;

        #enable websockets 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_update;
        proxy_set_header Connection "upgrade";

    }
  }
    #load balancing socket io
    upstream io_nodes {
        # enable sticky sessions
        ip_hash;
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }
}

Я достигаю порта nginx на 80-м порту, однако не распределяюсь по разным серверам. Я могу сказать это, потому что pid - то же самое. У меня такое ощущение, что это из-за socket.io и пространств имен? Я не до конца понимаю и не смог найти хорошую статью или видео, которые бы это хорошо объясняли.

вот сервер:

const express = require('express');
const app = express();
const PORT = process.env.PORT || 8080;
const ENV = process.env.ENV || 'development';
const server = require('http') .createServer(app);
const io = require('socket.io')(server);
const redis = require('socket.io-redis');

server.listen(PORT, (err) => {
  if (err) console.error('❌ Unable to connect the server: ', err);
  console.log(`? Chat server listening on port ${PORT} - ${ENV} environment`);
});

io.on('connection', socket => {
  console.log(`made socket connections, socket ID: ${socket.id} and pid ${process.pid}`);
});

и, наконец, передняя часть:

socket.emit('new message', {
    message: message.value,
    author: author.value
});

Так что мой вопрос таков:

  • Как мне создать разные socketio-серверы, прослушивающие разные порты для маршрутизации nginx. Исходя из моего понимания пространств имен, он создает конечную точку для общения чатов, а не различных экземпляров socketio, верно?
  • Я смотрю на это правильно? Я чувствую, что есть одна вещь, которую я не могу полностью понять.

Как всегда, любая помощь приветствуется!

Редактировать: дальнейшее чтение здесь показывает, что он использует восходящие потоки как:

upstream socket_nodes {
    ip_hash;
    server srv1.app.com:5000 weight=5;
    server srv2.app.com:5000;
    server srv3.app.com:5000;
    server srv4.app.com:5000;
}

Означает ли это, что вы не можете реально тестировать на локальном хосте / разных портах, но на разных адресах (что имеет смысл)

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