Как запустить приложение Node/Express на порту 3001, 3002 и т. д.?

Мы используем 4 разных экспресс-проекта на одном сервере, запуская pm2 start cmd из корневого каталога каждого проекта для запуска приложения.

И используя сервер ec2 Linux, добавил порты 3000, 3001 к входящим правилам, оба работают нормально, но не могут получить доступ к API через 3001 и могут получить доступ к 3000, в чем может быть проблема?

тот же проект работает в 3000, но не в 3001, поэтому мы можем подтвердить, что в наших проектах нет ошибок.

Пробовал на терминале nodemon app, он работает нормально, но Postman не обращается к нему, получая ту же ошибку:

Could not get any response

There was an error connecting to http://ec2-x-x-amazonaws.com:3001/api/login.

как мы можем запустить несколько узлов/экспресс-проектов в доступных/определенных портах?

3001    tcp 0.0.0.0/0, ::/0 ✔
3000    tcp 0.0.0.0/0, ::/0 ✔

Некоторые порты работают без добавления в качестве входящего правила, например 8088, 8089.

Статус pm2 показывает, что все порты работают нормально.

введите здесь описание изображения

pm2 list указан выше, а id 8 имеет номер порта 3001


person 151291    schedule 22.01.2019    source источник
comment
в этом случае в основном проверяйте с помощью pm2 status, работает ли приложение, которое, как ожидается, будет работать в 3000, а также проверяйте, отображается ли его список только в 3000, а не в каком-либо другом порту.   -  person Saikat Chakrabortty    schedule 23.01.2019
comment
@saikatchakrabortty - порт 3000 работает нормально, но 3001 не запускается с pm2 status, как я могу его заархивировать?   -  person 151291    schedule 23.01.2019
comment
@saikatchakrabortty - перезапустил все порты pm2 restart all --watch, теперь 3001 также работает нормально, но не может получить доступ от почтальона и не получил журнал ошибок от pm2 logs   -  person 151291    schedule 23.01.2019
comment
еще раз убедитесь, что вы добавили входящие и исходящие правила,   -  person Saikat Chakrabortty    schedule 23.01.2019
comment
@saikatchakrabortty добавил 3000 и 3001 в правила для входящего трафика, но что мы можем обновить в правилах для исходящего трафика? принимает все порты там.   -  person 151291    schedule 23.01.2019
comment
Через какой хост вы пытаетесь получить доступ к этим портам? Общедоступный IP-адрес, назначенный экземпляру, или что-то еще?   -  person cantuket    schedule 26.01.2019
comment
@cantuket - Да, и этим портам назначен общедоступный IP-адрес.   -  person 151291    schedule 26.01.2019
comment
Чтобы ответить на ваш предыдущий вопрос, да, вы должны оставить свои исходящие правила для ВСЕХ 0.0.0.0/0, если у вас нет веской причины не делать этого.   -  person cantuket    schedule 27.01.2019
comment
Можете ли вы показать нам скриншот того, что печатает pm2 list?   -  person cantuket    schedule 27.01.2019
comment
@cantuket - обновлено pm2 list   -  person 151291    schedule 28.01.2019
comment
@ 151291 вы можете получить доступ к порту 3001 изнутри сервера? Типа curl -I localhost:3001 или похожего. Если вы можете, есть другая проблема с вашей конфигурацией.   -  person gargsms    schedule 29.01.2019
comment
@gargsms - я нажал указанную выше команду внутри терминала сервера, получив ответ об ошибке HTTP/1.1 404 Not Found, X-Powered-By: Express host is ec2 вместо localhost, потому что приложение работает с именем хоста ec2.   -  person 151291    schedule 29.01.2019
comment
Это кажется прекрасным. Тогда я не уверен, в чем проблема. Порт 3001 кажется недоступным снаружи сервера. Вам следует подробнее изучить конфигурацию EC2. Я не думаю, что pm2 имеет к этому какое-то отношение.   -  person gargsms    schedule 29.01.2019
comment
Как вы загружаете приложение, конкретные команды pm2. Ваш статус выглядит так, будто запущено одно и то же приложение. Что произойдет, если вы попытаетесь использовать маршруты без API через порт 3001?   -  person adamrights    schedule 30.01.2019
comment
Кроме того, попробуйте netstat -ntlp | grep 3001 в командной строке экземпляра ec2.   -  person adamrights    schedule 30.01.2019
comment
@adamrights — есть 4 проекта, все проекты имеют app.js. Я запускаю pm2 в каждом корневом каталоге. поэтому невозможно для маршрутов без API. и попробовал netstat cmd, получив хороший ответ tcp 0 0 x.x.x.x:3001 0.0.0.0:* LISTEN 32702/node /home/ec2   -  person 151291    schedule 30.01.2019
comment
Итак, процесс node прослушивает 3001. Другие 2 приложения также работают? Являются ли они явными в портах, которые они используют? Может кто ворует 3001?   -  person adamrights    schedule 30.01.2019
comment
@adamrights — другие порты работают и обращаются к postman нормально, все используют разные порты, проверенные netstat -ntlp | grep node   -  person 151291    schedule 30.01.2019
comment
Хм. Поэтому я думаю, что нам нужно увидеть этот код API. Другие мысли, возможно, если вы не попадете в эту конечную точку с определенными заголовками, файлами cookie и т. д., ее поведение равно 404. x-Powerered-By: Express сообщает вам, что сервер nodejs обработал этот 404. Кроме того, вы пробовали https:// вместо http://   -  person adamrights    schedule 30.01.2019
comment
@adamrights - другие работающие порты также показывают 404 из терминала, сервер не имеет ssl. Я использую заголовок Content-Type : application/json, как и другие порты.   -  person 151291    schedule 30.01.2019
comment
Все это выглядит так, как будто вам просто нужно открыть порт 3001 в вашей группе безопасности EC2...   -  person Dusan Bajic    schedule 01.02.2019


Ответы (3)


ПРИМЕЧАНИЕ. Не обязательно ответ, но есть некоторые вещи, которые я испортил раньше, и это процесс, который я бы использовал для устранения неполадок...

Конфигурация PM2
< br> Сначала проверьте это, чтобы убедиться, что у вас нет конфликтов.
(Как упоминалось в комментариях, пожалуйста, предоставьте скриншот pm2 list и даже файлы конфигурации PM2, если возможно)

Как у вас работает PM2, единая конфигурация ecosystem.json? Несколько ecosystem.json конфигураций? Так или иначе...

Убедитесь, что каждый app имеет правильно указанные свойства...

  • script:(сценарий запуска)
  • cwd: (рабочий каталог)
  • Уникальный name: для каждого процесса
  • Если вы указываете свои переменные среды env: в конфигурации PM2, убедитесь, что они правильно установлены на 3000 и 3001 соответственно.
  • Убедитесь, что вы случайно не запрограммировали оба приложения для запуска на 3000. То есть убедитесь, что эти конфигурации env действительно используются.

Еще одна вещь, которую следует отметить, это то, что если вы обновите файлы конфигурации PM2, простой pm2 restart не будет искать новую конфигурацию. Вам нужно будет добавить флаг --update-env.



Базовый тест веб-сервера порта

Если приведенные выше проверки на PM2 в порядке, я бы начал еще больше сужать круг, полностью исключив node. Вы можете попробовать что-то подобное для быстрой проверки доступности порта 3001...

  1. Остановить все процессы pm2

pm2 stop all

  1. Установите Nginx

sudo apt-get install nginx

  1. Изменить файл конфигурации по умолчанию

sudo nano /etc/nginx/conf.d/default Или любой другой редактор, который вы хотите

  1. Настроить сервер. Добавить в начало файла...

 server {
      listen 3001;
      listen [::]:3001;
      location / {
          return 200 '3001 works!';
      }
  }

  1. Перезапустите Nginx

sudo service nginx restart


Теперь попробуйте получить доступ к общедоступному IP-адресу через порт 3001, и он должен загрузить текстовый файл на ваш компьютер с "3001 работает!"

Если это работает, проблема заключается не в EC2 или связанных группах безопасности, а в ваших серверах узлов.

person cantuket    schedule 27.01.2019

если ваш код выглядит так

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

var port = process.env.PORT || 3000;

app.listen(port, function () {
  console.log('Example app listening on port ' + port + '!');
});

вы можете изменить порт из команды, которая запускает сервер так

PORT=8000 node index.js

для получения дополнительных примеров проверьте это https://gist.github.com/indiesquidge/7fe1d8be1b973f782c97

Вы также можете передать порт в качестве аргумента вашему сценарию, используя process.argv

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

var port = getPort();

app.listen(port, function () {
  console.log('Example app listening on port ' + port + '!');
});

function getPort(){
    if(process.argv.length > 2){
        return process.argv[2];
    } else {
        return 3000;
    }
}
person Haris Bouchlis    schedule 28.01.2019
comment
не удалось изменить номер порта с помощью cmd PORT=8000 node app.js, по-прежнему прослушивается определенный порт из app.js - person 151291; 01.02.2019
comment
не могли бы вы опубликовать свой код app.js? по крайней мере та часть, где запущен сервер - person Haris Bouchlis; 01.02.2019
comment
@ 151291 я добавил еще один пример, посмотрите, поможет ли это - person Haris Bouchlis; 01.02.2019

Это проблема с номером порта, повторно проверенная по правилам входящего трафика сервера, правильно ли добавлены порты 3001 и 3002 и т. д. с custom TCP rule и source должны быть anywhere. теперь едет нормально.

ec2-Instances -> launch-wizard-1 -> right click -> edit inbound rules.
person 151291    schedule 01.02.2019