сервер node.js с веб-сокетами на эластичном стебле beanstalk без socket.io - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь заставить сервер node.js (используя экспресс) работать с использованием веб-сокетов в эластичном beanstalk (EB), используя балансировщик нагрузки приложения (ALB), но без использования socket.io (потому что сервер peerjs является сервером I 'я пытаюсь запустить, и это не написано с socket.io).

Я видел пару статей, предлагающих использовать socket.io (или другую библиотеку, которая не просто полагается на websockets), но Amazon говорит, что ALB поддерживает веб-сокеты напрямую.

Мой сервер является и сервером create-реагировать-приложения, и сервером peerjs. Он отлично работает в dev на порту 9000 как для веб-интерфейса, так и для peerjs ws-соединений.

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

1 Ответ

0 голосов
/ 11 ноября 2019

Хорошо, я получил это на работу. Вот что я сделал, чтобы все работало на порте 9000.

В EB создайте приложение, затем начните создавать среду.

В конфигурации среды перейдите в Software раздел и скажите ему, что вы собираетесь использовать npm run prod для запуска вашего сервера .:

enter image description here

Теперь идив раздел Load Balancers и, как показано на рисунке ниже:

  1. добавьте прослушиватель на порт 9000
  2. , создайте процесс на порту 9000 и включите привязку(Я назвал мой peerjsServer)
  3. добавить правила для каждого URL-пути, который вы хотите использовать для доступа к серверу, и назначьте каждому из этих правил процесс, который вы создали (peerjsServer). Также укажите этот процесс по умолчанию, чтобы проверки работоспособности на 80 успешно проходили на ваш сервер

enter image description here

Возможно, вам придется перепрыгнутьна панель управления EC2 в пользовательском интерфейсе AWS, чтобы убедиться, что там определены необходимые группы безопасности . Я думаю, что я создал первые два на и последние два были созданиями по умолчанию, но я не помню. В любом случае, им необходимо открыть порт 9000 для входящего и исходящего трафика (порт 80 всегда существует по умолчанию): enter image description here

Вернуться к конфигурации EB , перейдите в раздел Экземпляры и убедитесь, что вашему экземпляру назначены группы безопасности: enter image description here

Я запустил react-scripts build, чтобы сделать/build каталог, содержащий производственную версию пользовательского интерфейса сервера (это материал create-реагировать-приложения, о котором я здесь не говорю).

В моем коде я запускаю сервер, используя server.js, которыйделает сервер, на котором работает и peerjs-сервер, и сервер http.

const express = require("express");
const bodyParser = require("body-parser");
const path = require('path');

const passport = require("passport");
const users = require("./routes/api/users");
const games = require("./routes/api/games");
const Game = require("./src/models/Game");

const WebSocket = require('ws');
const ExpressPeerServer = require('peerjs-server').ExpressPeerServer;

const app = express();
const url = require('url');

const port = process.env.PEERSERVERPORT || 9000; 

// WebSocket for making db updates to client.
const wsserver = require('./wsserver').wsserver

// Server that gets all requests: lobby UI, peerserver, db websocket
const server = require('http').createServer(app);

wsserver.on('connection', function connection(ws) {
  ws.on('message', msg => {
    ws.send(msg)
  })

  ws.on('close', () => {
    console.log('WebSocket was closed')
  })
});

server.on('upgrade', function upgrade(request, socket, head) {
  const pathname = url.parse(request.url).pathname;

  if (pathname === '/ws') {
    wsserver.handleUpgrade(request, socket, head, function done(ws) {
      wsserver.emit('connection', ws, request);
    });    
  }
});

// Bodyparser middleware
app.use(
  bodyParser.urlencoded({
    extended: false
  })
);
app.use(bodyParser.json());

// Passport middleware
app.use(passport.initialize());
// Passport config
require("./config/passport")(passport);

// Routes -- the /api/* path is defined in the EB load balancer
app.use("/api/users", users);
app.use("/api/games", games);

// This is the create-react-apps /build directory of UI code
app.use(express.static(path.join(__dirname, 'build')));
app.get('/login', function (req, res) {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

// These are the paths that are defined in the EB load balancer
app.get('/logout', function (req, res) {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
app.get('/register', function (req, res) {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
app.get('/dashboard', function (req, res) {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

// Peer server for making WebRTC connections between game clients.
const options = { 
    debug: true
}
const peerserver = ExpressPeerServer(server, options);
app.use('/peerserver', peerserver);

app.use(express.static(path.join(__dirname, 'src')));

app.get('*', function(req, res) {
  res.sendFile(path.join(__dirname, 'src', 'index.html'));
});

peerserver.on('disconnect', (client) => {
  console.log('Delete the game if the host client disconnects');
  Game.deleteMany({ hostPeerId: client })
    .then(() => {
      wsserver.clients.forEach(function each(client) {
        if (client.readyState === WebSocket.OPEN) {
          client.send("refreshGames");
        }
      })
    })
    .catch(err => console.log(err));
});

server.listen( port, () => console.log(`Server is up and running on port ${port} !`))

И затем в моем package.json я установил скрипт для prod для запуска вышеуказанного server.js для запуска сервера, и прогу запуска npm, которую я вставил в Software Раздел ранее - это то, что вызывает это, чтобы заставить сервер работать:

  ...
  "scripts": {
    "start": "set PORT=8081&& react-scripts start",
    "prod": "node server.js",
  ...

После всего этого у меня теперь есть работающий сервер EB, использующий ALB и обрабатывающий трафик websocket (ws) и UI (http) напорт 9000.

...