Skip to content

pm2部署Nodejs项目总结

一. 什么是pm2

Process Manager 2 简称 PM2

PM2 是具有内置负载均衡器的 Node.js 应用程序的生产运行时和进程管理器。 允许一直保持应用程序活跃,无需停机即可重新加载它们,并促进常见的Devops任务。类似的工具还有 Supervisord,Forever,Systemd。 pm2官网文档地址https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/?utm_source=ld246.com

二. PM2特点

  • 日志管理:应用程序日志保存在服务器的硬盘中~/.pm2/logs/
  • 负载均衡:PM2 可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许您以零秒停机时间重新启动应用程序。
  • 终端监控:可以在终端中监控您的应用程序并检查应用程序运行状况(CPU 使用率,使用的内存,请求/分钟等)。
  • SSH 部署:自动部署,避免逐个在所有服务器中进行 ssh。
  • 静态服务:支持静态服务器功能。
  • 多平台支持:适用于 Linux(稳定)和 macOS(稳定)和 Windows(稳定)。

三. pm2的使用

(一)安装pm2

安装PM2之前,先得有Node环境, node下载地址,或者使用命令安装(centOS) 第一步: curl --silent --location https://rpm.nodesource.com/setup_14.x | sudo bash - 第二步: sudo yum -y install nodejs 第三步: 切换npm镜像 npm config set registry https://registry.npm.taobao.org

javascript
// 全局安装PM2
$ npm install pm2 -g

(二)常用命令

pm2 start index.js		# 入口文件index.js启动项目(同 node ./index.js一样)
pm2 start npm -- run dev	# 启动 npm run dev脚本
pm2 start npm -- start		# 启动 npm start 脚本

pm2 list               # 显示所有进程
pm2 monit              # 进入监视页面,监视每个node进程的CPU和内存的使用情况
pm2 logs               # 查看所有进程日志
pm2 logs 0             # 查看进程id为 0 的进程的日志
pm2 stop all           # 停止所有进程
pm2 restart all        # 重启所有进程
pm2 reload all         # 0秒停机重载进程 (用于 NETWORKED 进程)
pm2 stop 0             # 停止指定的进程
pm2 restart 0          # 重启指定的进程
pm2 startup            # 产生 init 脚本 保持进程活着
pm2 web                # 运行健壮的 computer API endpoint (http://localhost:9615)
pm2 delete 0           # 杀死指定的进程
pm2 delete all         # 杀死全部进程
pm2 show 0 或者 pm2 info 0	# 查看进程id为 0 的进程的详细信息
pm2 flush	       # 清空所有日志文件;

pm2 scale <进程名字或ID> 3   # 调整服务进程数量为3个(前提是启动时通过 -i 启用 cluster 模式)
pm2 scale <进程名字或ID> +3  # 在原来的基础上扩容3个进程(前提是启动时通过 -i 启用 cluster 模式)

(三)常用参数

pm2用 -- 传递参数, 注意--后面有空格,例如 : -- 参数1 参数二

--name <别名>			# 指定进程名称
-i max				# 根据有效CPU数目启动最大进程数目
-i 3				# 启动3个进程
--watch				# 实时监控的方式启动,app.js文件有变动时,pm2会自动reload
-x				# 用fork模式启动  而不是使用 cluster
-x -- -a 23			# 用fork模式启动  并且传递参数(-a 23)
pm2 start app.json		# 启动进程, 在 app.json里设置选项

(四)示例

  1. PM2启动 index.js 1.png

  2. PM2启动index.js 并重命名为 express 2.png

  3. PM2启动 npm run dev 3.png

  4. PM2启动 npm run dev 并重命名 为 npm-express 4.png

  5. PM2启动 npm start 5.png

  6. PM2启动 npm start 并重命名为 npm-express-start 6.png

四.pm2配置文件(ecosystem.config.js)

贴自implistarry的文章《PM2 使用及详细配置》

javascript
// ecosystem.config.js
{
    "apps": {
        "name": "wuwu",                             // 项目名          
        "script": "./bin/www",                      // 执行文件
        "cwd": "./",                                // 根目录
        "args": "",                                 // 传递给脚本的参数
        "interpreter": "",                          // 指定的脚本解释器
        "interpreter_args": "",                     // 传递给解释器的参数
        "watch": true,                              // 是否监听文件变动然后重启
        "ignore_watch": [                           // 不用监听的文件
            "node_modules",
            "logs"
        ],
        "exec_mode": "cluster",                	    // 应用启动模式,支持fork和cluster模式
        "instances": 4,                             // 应用启动实例个数,仅在cluster模式有效 默认为fork;或者 max
        "max_memory_restart": 8,                    // 最大内存限制数,超出自动重启
        "error_file": "./logs/app-err.log",         // 错误日志文件
        "out_file": "./logs/app-out.log",           // 正常日志文件
        "merge_logs": true,                         // 设置追加日志而不是新建日志
        "log_date_format": "YYYY-MM-DD HH:mm:ss",   // 指定日志文件的时间格式
        "min_uptime": "60s",                        // 应用运行少于时间被认为是异常启动
        "max_restarts": 30,                         // 最大异常重启次数,即小于min_uptime运行时间重启次数;
        "autorestart": true,                        // 默认为true, 发生异常的情况下自动重启
        "cron_restart": "",                         // crontab时间格式重启应用,目前只支持cluster模式;
        "restart_delay": "60"                       // 异常重启情况下,延时重启时间(以毫秒为单位)。默认值为0
        "env": {
           "NODE_ENV": "production",                // 环境参数,当前指定为生产环境 process.env.NODE_ENV
           "REMOTE_ADDR": "中国"               	    // process.env.REMOTE_ADDR
        },
        "env_dev": {
            "NODE_ENV": "development",              // 环境参数,当前指定为开发环境 pm2 start app.js --env_dev
            "REMOTE_ADDR": ""
        },
        "env_test": {                               // 环境参数,当前指定为测试环境 pm2 start app.js --env_test
            "NODE_ENV": "test",
            "REMOTE_ADDR": ""
        }
    }
}