Я создаю масштабируемое приложение для чата с 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;
}
Означает ли это, что вы не можете реально тестировать на локальном хосте / разных портах, но на разных адресах (что имеет смысл)