【问题标题】:How to run Node/Express App on port 3001, 3002 etc?如何在端口 3001、3002 等上运行 Node/Express 应用程序?
【发布时间】:2023-12-08 13:33:01
【问题描述】:

我们在单个服务器中使用 4 个不同的 express 项目,从每个项目根目录运行 pm2 start cmd 来启动应用程序。

并且使用 ec2 Linux 服务器,在入站规则中添加端口30003001,两者都运行良好但无法通过3001 访问 API,并且可以通过 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.

我们如何在可用/定义的端口中运行多个节点/express 项目?

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

某些端口在运行时没有添加为入站规则,例如 8088、8089。

pm2 状态显示所有端口都运行良好。

pm2 list 在上面,id 8 的端口号为3001

【问题讨论】:

  • 在这种情况下,主要检查 pm2 status 是否正在运行应用程序,该应用程序预计将在 3000 中运行,并检查它是否仅在 3000 中列出,而不是任何其他端口。跨度>
  • @saikatchakrabortty - 端口3000 运行良好,但3001 不能从pm2 status 运行,我该如何存档?
  • @saikatchakrabortty - 重新启动所有端口pm2 restart all --watch,现在3001 也运行良好,但无法从邮递员访问,并且没有从pm2 logs 获得任何错误日志
  • 再次确保您已添加入站和出站规则,
  • 这一切看起来您只需要在您的 EC2 安全组中打开端口 3001...

标签: node.js http amazon-ec2 pm2 port-number


【解决方案1】:

注意:不一定是答案,但这些是我以前搞砸过的一些事情,这是我用来解决问题的过程......

PM2 配置

首先检查此项以确保您没有任何冲突。
(如 cmets 中所述,请提供pm2 list 的屏幕截图,如果可能,请提供 PM2 配置文件)

您如何运行 PM2,单个 ecosystem.json 配置?多个ecosystem.json 配置?不管怎样……

确保每个app 都有正确指定的属性...

  • script:(启动脚本)
  • cwd:(工作目录)
  • 每个进程唯一的name:
  • 如果您在 PM2 配置中指定环境变量 env:,请确保它们分别正确设置为 30003001
  • 确保您没有意外硬编码这两个应用程序以在 3000 上运行。即确保这些 env 配置正在实际使用中。

这里要注意的另一件事是,如果您更新 PM2 配置文件,简单的pm2 restart 将不会查找新配置。您需要添加 --update-env 标志。



基本端口 Web 服务器测试

如果上面对 PM2 的检查没问题,那么我现在将通过完全消除节点来进一步缩小范围。您可以尝试这样的方法来快速测试端口 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


现在尝试在端口 3001 访问公共 IP,它应该会下载一个文本文件到您的计算机,并显示 “3001 有效!”

如果这可行,则问题不是 EC2 或相关的安全组,而是您的节点服务器。

【讨论】:

    【解决方案2】:

    如果你的代码看起来像这样

    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;
        }
    }
    

    【讨论】:

    • 无法使用 cmd PORT=8000 node app.js 更改端口号,仍然从 app.js 监听定义的端口
    • 能否请您发布您的 app.js 代码?至少是服务器启动的部分
    • @151291 我添加了另一个示例,看看是否有帮助
    【解决方案3】:

    这是端口号问题,从服务器入站规则重新检查,custom TCP rulesource添加的端口3001和3002等是否正确必须是anywhere。现在运行良好。

    ec2-Instances -> launch-wizard-1 -> right click -> edit inbound rules.
    

    【讨论】:

      最近更新 更多