Skip to content

node命令启动服务能被访问,但是用pm2启动服务却访问失败的问题

问题描述

笔者在部署慕课网音乐项目遇到这个么一个问题,浏览器打开项目地址,项目接口请求报错,但是笔者在自己电脑本地跑了一下线上环境,一切正常。于是首先想到的是服务器可能部署环境与本地有什么差异导致的这个问题,而服务器和本地最大的区别是多了nginx服务器代理,和pm2进程守护步骤。由于项目页面已经能被访问了,故排除了nginx的可能。所以就用pm2 list检查了进程状态,也没发现异常。笔者又试着把pm2停了,改为node启动,发现线上接口又正常了。这就产生了一个疑问,我的pm2服务也没看出问题,但是为什么node命令启动的服务能被访问,但是改用pm2启动却访问失败了呢?

问题分析

笔者于是对比pm2启动,和node启动后的差异,发现node启动的服务跑在3200端口上,pm2启动的服务却不在3200端口上。后来又细想,这个端口号好像是我在执行node命令时通过PORT=3200带过去了,而我执行pm2时只是单纯的用pm2 start prod.server.js --name vue-music,并没有携带端口参数。想到这里问题差不多可以解决了。

解决方案

笔者查阅网上资料,得知要让pm2携带环境参数可以通过ecosystem.config.js这个配置文件实现。首先在项目根目录下创建这个文件,文件内容如下:

js
module.exports = {
  apps: [
    {
      name: 'vue-music',
      script: './prod.server.js',
      instances: 1,
      autorestart: true,
      watch: false,
      max_memory_restart: '1G', // 最大内存限制数,超出自动重启
      env: {
        NODE_ENV: 'production',
        PORT: 3200 // 我们要传入的端口号
      }
    }
  ]
}

然后在服务器端项目的根目录下执行pm2 start,大功告成!

苏ICP备20040768号