PM2(Node.js)没有在指定端口上监听

20

我正尝试将一个基于Node/Express的应用在PM2上运行。我可以使用以下命令成功启动该应用:npm start。这会在3000端口上成功启动该应用。

但如果我尝试使用命令pm2 start app.js来启动应用,日志会显示以下信息:

{ online: true, success: true, pid: 10714, pm2_version: '0.8.15' }
2014-06-12T19:52:06.789Z : [[[[ PM2/God daemon launched ]]]]
2014-06-12T19:52:06.800Z : RPC interface [READY] on 6666:localhost
2014-06-12T19:52:06.801Z : BUS system [READY] on  6667:localhost
2014-06-12T19:52:06.978Z : Entering in node wrap logic (cluster_mode) for script     /home/user/test/app.js
2014-06-12T19:52:07.115Z : /home/user/test/app.js - id0 worker online

在我的bin/www文件中,我有以下指定端口的内容:

app.set('port', process.env.PORT || 3000);

我也尝试过运行export PORT=3000

以及在bin/www中加入以下内容:

app.set('port', 3000);

如果我运行netstat -an | grep 3000,将不会有任何输出。


好的,你正在将它设置为 process.env.PORT除非它未定义,那么你会将它设置为 3000。你试过只用 3000 吗? - adeneo
是的,我也尝试过了 - 它仍然没有在端口 3000 上监听。 - JamesE
那个日志输出看起来像是 pm2.log 的输出,你的应用程序有日志文件吗?也许在服务器启动后,你会在其中使用 console.log 输出一些主机/端口信息? - dylants
5个回答

49

对于使用Express的任何人,解决方法是运行以下命令:

pm2 start ./bin/www

我之前一直在运行 pm2 start app.js,但这并没有起作用。


10
这里有什么不同之处? - astronaut
你帮我节省了2天时间。如果您能给一个解释就太好了。 - Fawzan
对我有用。太好了。我在其他地方找不到正确的答案。 pm2 start ./bin/www - mythicalcoder
可以用啊...非常感谢!!!3000的时候也不行。 - Juan
5
完全没有意义。./bin/www怎么可能知道我的server.js文件在哪里? - Seph Reed
@SephReed,我听到你了。 这是我如何使它工作的(即pi@myserver:〜/ nodeapps / expserver $ pm2 start)。 如果您在项目文件夹中(与package.json位于同一文件夹中)使用了pm2生成一个名为ecosystem.config.js的文件,请将行script:'app.js'更改为script: './ bin / www'。这将希望保留生态系统配置文件中的所有其他参数。 - mahesh

3
你的 app.set('port'... 代码并不是直接相关的。 app.set 只是存储键值设置的地方,本身没有任何功能。你需要关注的是你调用 app.listen 的地方,因为这个函数接受端口作为参数。

看起来它仍然设置在bin/www中 -var server = app.listen(app.get('port'), function() { debug('Express服务器正在侦听端口' + server.address().port); }); - JamesE

1
我曾遇到类似的问题,使用nginx作为代理服务器时,我无法看到由PM2运行的Express应用程序。当我删除了我的~/.pm2文件夹后,它就可以工作了。

0
在我的情况下,它是在特定端口上进行监听,但由于某种原因,我的接口无法找到主机/端口,然后我安装了NGINX并将默认设置为/etc/nginx/sites-enabled/上的:
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        server_name _;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection “upgrade”;
            proxy_max_temp_file_size 0;
            proxy_pass ip:port/; <<<<<<<<< Change the IP and port >>>>>>>>>
            proxy_redirect off;
            proxy_read_timeout 240s;
        }

}

检查最后几行。反向代理已经生效。

注意: /etc/nginx/sites-enabled/default 已经包含在 /etc/nginx/nginx.conf 中,然后作为 NGINX 的配置文件使用。


0

我使用这个

pm2.json

[
{
  "exec_mode": "fork_mode",
  "cwd" : "/opt/acme_service",
  "script": "acme_service.js",
  "name": "acme_service",
  "restart_delay":"9000",
  "port"       : 8081,
  "node_args": [ "--acme" ],
  "error_file": "/var/log/acme_service.err.log",
  "out_file": "/var/log/acme_service.out.log"
}
]

"port" : 8081 - 接受端口连接。应用程序中相同

var server = app.listen(8081 , '0.0.0.0');

6
请解释你为什么认为这是一个解决方案,以及它是如何解决问题的。 - Lajos Arpad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接