Как запустить два сервера в героку - PullRequest
2 голосов
/ 29 апреля 2020

Я создал проект в angular 9 для внешнего интерфейса и nodejs в качестве внутреннего сервера. Теперь я использую node appserver.js для запуска внутреннего сервера. Это слушает порт 9090 по умолчанию. В другом терминале я запускаю ng serve для запуска моего приложения angular через порт 4200 как обычно. У меня есть приложение в angular приложении, которое отправляет и получает сообщения с сервера. Я использовал класс Websocket для подключения к порту 9090. Мое приложение отлично работает в локальной сети. Но теперь как я могу развернуться в героку. Heroku дает случайный номер порта, который будет указан как process.env.PORT как я могу получить этот порт в моей службе websocket. Мои вопросы ..

  1. Как развернуть два сервера в heroku
  2. Как номер порта в appserver. js указан как номер порта в службе websocket в angular
  3. Есть ли какое-либо использование файла .env и ProcFile для решения моей проблемы.
  4. Есть ли какое-либо использование multi-buildpack, которое есть в heroku для решения моей проблемы

Пожалуйста, помогите

1 Ответ

2 голосов
/ 29 апреля 2020
  1. Нельзя развернуть два отдельных сервера, если каждому из них требуется порт. Вы должны будете поместить их в отдельные приложения. В некоторых случаях вы можете комбинировать веб-серверы. Развертывание сервера выполняется в обычном режиме.

  2. При развертывании веб-службы в Heroku Heroku предоставляет вам порт, к которому необходимо подключиться. Затем вы можете посетить свой веб-сервис под <appname>.herokuapp.com. (<- вот почему 1.) требует, чтобы вы помещали их в отдельные приложения.). Кроме того, когда вы подключаетесь к веб-сервису, вы просто указываете URL. Этот URL автоматически переводится на <code><ipaddress>:<port>. Так что в вашем интерфейсе вы не собираетесь указывать номер порта. Вы указываете URL-адрес веб-сокета в своем веб-интерфейсе без порта.
    На веб-сервере вы привязываете к process.env.PORT.

  3. .env файл, который не должен быть версионирован / зафиксирован. Бесполезно Если вам требуются переменные среды, вы можете установить их через панель управления Heroku. Procfile не требуется, так как вы используете Node.js, он изучит ваш скрипт npm start, расположенный в package.json. Но это не помешает, поскольку дает ясность.

  4. Для этого нет мульти-билда.


Если ваши 2 сервера строго различны и используют отдельные протоколы. Один использует http, другой можно объединить два сервера в один. Вот пример:

const http = require('http');
const path = require('path');
const express = require('express');
const WSServer = require('ws').Server;
const DateFormat = require('dateformat');

let wss;
let server;
const app = express();
app.use(express.static(path.join(__dirname, './../build')));

server = new http.createServer(app);
wss = new WSServer({ server })

this.wss = wss;
wss.on('connection', function(socket) {
    console.log(DateFormat(new Date(), 'm/d h:MM:ss TT'),
        `client connected to server (${wss.clients.size} total)`);
    socket.on('message', function(data) {
        console.log(data)
    });
    socket.on('close', function(code, desc) {
        console.log(DateFormat(new Date(),
            "h:MM:ss TT"),'client disconnected, total:', wss.clients.length);
    });
});
wss.on('listening', () => console.log('Websocket listening on port', config.get('port')));
wss.on('error', err => console.log('Websocket server error:', err));

server.on('error', err => console.log('Server error:', err));
server.listen(process.env.PORT);

Пример в проекте:
https://github.com/vegeta897/d-zone/blob/63730fd7f44d2716a31fcae55990d83c84d5ffea/script/websock.js

Deploy

В проекте серверная часть с сервером веб-сокетов была расширена и теперь включает сервер express, обслуживающий файлы stati c. Обратите внимание, что это изменение существует только в ветке heroku.

В этом коммите вы найдете все соответствующие изменения, которые сделали этот проект heroku совместимым:
https://github.com/vegeta897/d-zone/commit/63730fd7f44d2716a31fcae55990d83c84d5ffea

...