精华内容
下载资源
问答
  • pm2
    千次阅读
    2020-02-08 19:19:57

    pm2与log4js的结合使用


    如需转载请标明出处:http://blog.csdn.net/itas109
    QQ技术交流群:129518033

    相关问题:
    1.nodejs集群模式使用log4js
    2.pm2 cluster log4js不打印日志
    3.pm2 cluster log4js日志写文件丢数据

    环境说明:
    pm2版本:4.2.1
    log4js版本:5.1.0


    1.pm2简介

    PM2是守护程序进程管理器,它将帮助您管理和保持应用程序在线。

    官网:https://pm2.keymetrics.io

    可通过NPM或Yarn安装的PM2:

    $ npm install pm2 -g
    # or
    $ yarn global add pm2
    

    pm2常用命令

    # Fork mode
    pm2 start app.js --name my-api # Name process
    
    # Cluster mode
    pm2 start app.js -i 0        # Will start maximum processes with LB depending on available CPUs
    pm2 start app.js -i max      # Same as above, but deprecated.
    pm2 scale app +3             # Scales `app` up by 3 workers
    pm2 scale app 2              # Scales `app` up or down to 2 workers total
    
    # Listing
    
    pm2 list               # Display all processes status
    pm2 jlist              # Print process list in raw JSON
    pm2 prettylist         # Print process list in beautified JSON
    
    pm2 describe 0         # Display all informations about a specific process
    
    pm2 monit              # Monitor all processes
    
    # Logs
    
    pm2 logs [--raw]       # Display all processes logs in streaming
    pm2 flush              # Empty all log files
    pm2 reloadLogs         # Reload all logs
    
    # Actions
    
    pm2 stop all           # Stop all processes
    pm2 restart all        # Restart all processes
    
    pm2 reload all         # Will 0s downtime reload (for NETWORKED apps)
    
    pm2 stop 0             # Stop specific process id
    pm2 restart 0          # Restart specific process id
    
    pm2 delete 0           # Will remove process from pm2 list
    pm2 delete all         # Will remove all processes from pm2 list
    
    # Misc
    
    pm2 reset <process>    # Reset meta data (restarted time...)
    pm2 updatePM2          # Update in memory pm2
    pm2 ping               # Ensure pm2 daemon has been launched
    pm2 sendSignal SIGUSR2 my-app # Send system signal to script
    pm2 start app.js --no-daemon
    pm2 start app.js --no-vizion
    pm2 start app.js --no-autorestart
    

    2.测试代码

    主要包括console.log和log4js各函数的输出

    // index.js
    'use strict';
    const pid = process.pid;//nodejs进程号
    
    var log4js = require('log4js');
    
    const express = require('express')
    const app = express()
    
    const logger = log4js.getLogger();
    
    log4js.configure({
        // 方式1
        // pm2: true,
        // pm2InstanceVar: 'INSTANCE_ID',
    
        // 方式2
        // disableClustering: true,
        appenders: {
            out: { type: 'console', layout:{type:'pattern',pattern:'%[[%d] [%p]%] - %m'} },
            allLog: { type: 'dateFile', filename: './logs/app.log', layout:{type:'pattern',pattern:'[%d] [%p] - %m'} }
    
        },
        categories: {
            default: { appenders: ['out', 'allLog'], level: 'debug'},
        }
    
    });
    
    var count = 0;
    
    function log(){
        console.log("hello : %d", count++);
        logger.debug("hello : %d", count++);
        logger.info("hello : %d", count++);
        logger.warn("hello : %d", count++);
        logger.error("hello : %d", count++);
        logger.fatal("***** pid :  %d", pid);
    }
    
    setInterval(function () {
        log();
    }, 10000);
    
    app.get('/', (req, res) => {
        let info = '+++++ pid : '+ pid;
        console.log(info);
        logger.info(info);
        res.status(200).send(info);
    })
    
    app.listen(3000, () => console.log('Example app listening on port 3000!'));
    

    3.pm2单机与日志测试

    启动app

    $ pm2 start index.js --name logTest
    

    通过pm2 monit和pm2 logs测试:

    • console.log正常输出控制台
    • logjs模块正常输出控制台和写入log文件
    PM2      | App [logTest:0] starting in -fork mode-
    PM2      | App [logTest:0] online
    0|logTest  | Example app listening on port 3000!
    0|logTest  | hello : 0
    0|logTest  | [2020-02-07T15:28:58.481] [DEBUG] - hello : 1
    0|logTest  | [2020-02-07T15:28:58.486] [INFO] - hello : 2
    0|logTest  | [2020-02-07T15:28:58.487] [WARN] - hello : 3
    0|logTest  | [2020-02-07T15:28:58.487] [ERROR] - hello : 4
    0|logTest  | [2020-02-07T15:28:58.488] [FATAL] - ***** pid :  9672
    0|logTest  | hello : 5
    0|logTest  | [2020-02-07T15:29:08.479] [DEBUG] - hello : 6
    0|logTest  | [2020-02-07T15:29:08.480] [INFO] - hello : 7
    0|logTest  | [2020-02-07T15:29:08.481] [WARN] - hello : 8
    0|logTest  | [2020-02-07T15:29:08.482] [ERROR] - hello : 9
    0|logTest  | [2020-02-07T15:29:08.482] [FATAL] - ***** pid :  9672
    

    4.pm2集群与日志测试

    启动集群

    $ pm2 start index.js --name logTest -i 2
    

    通过pm2 monit和pm2 logs测试:

    • console.log正常输出控制台
    • logjs模块均无法正常输出控制台和写入log文件
    PM2      | App [logTest:0] starting in -cluster mode-
    PM2      | App [logTest:0] online
    PM2      | App [logTest:1] starting in -cluster mode-
    PM2      | App [logTest:1] online
    0|logTest  | Example app listening on port 3000!
    1|logTest  | Example app listening on port 3000!
    0|logTest  | hello : 0
    1|logTest  | hello : 0
    0|logTest  | hello : 5
    1|logTest  | hello : 5
    

    5.pm2集群模式下使用log4js

    经过测试,在Cluster集群模式下log4js无效。

    查看log4js的API文档,log4js.configure(https://log4js-node.github.io/log4js-node/api.html)说明如下:

    • levels
    • appenders
    • categories
    • pm2 (boolean) (可选) - 如果app使用pm2,设置为true,否则日志将不起作用(需要安装pm2-intercom作为pm2的模块: pm2 install pm2-intercom)
    • pm2InstanceVar (string) (可选, 默认为‘NODE_APP_INSTANCE’) - 如果app使用pm2,修改默认名为NODE_APP_INSTANCE
    • disableClustering (boolean) (可选) - 设置为true,可能会解决pm2的日志问题。每个工作者线程会独立打印日志。但是如果将日志记录到文件,需要谨慎使用,可能会出现日志丢失问题。
      set this to true if you liked the way log4js used to just ignore clustered environments, or you’re having trouble with PM2 logging. Each worker process will do its own logging. Be careful with this if you’re logging to files, weirdness can occur.

    注意:不要同时使用disableClusteringpm2

     you don’t need `disableClustering` and `pm2` in your config.
     `pm2: true` turns on support for using pm2-intercom, `disableClustering: true` turns off all clustering support so it won’t use pm2-intercom.
     Use one or the other, but not both.
    

    两种解决方式:

    • A.pm2参数设置

    安装pm2-intercom作为pm2的模块: pm2 install pm2-intercom
    并为log4js.configure添加参数:

    pm2: true,
    pm2InstanceVar: 'INSTANCE_ID'
    
    • B. disableClustering参数设置(存在日志丢失问题)

    log4js.configure添加参数:

    disableClustering: true
    

    注意:
    经过测试发现,在disableClustering: true设置下,可能会出现日志写入文件(控制台正常)丢失问题。可以在~/.pm2/logs中以pm2的日志文件作为补充。

    结果(disableClustering: true方式):

    PM2      | App [logTest:0] starting in -cluster mode-
    PM2      | App [logTest:0] online
    PM2      | App [logTest:1] starting in -cluster mode-
    PM2      | App [logTest:1] online
    0|logTest  | Example app listening on port 3000!
    1|logTest  | Example app listening on port 3000!
    0|logTest  | hello : 0
    0|logTest  | [2020-02-07T15:32:13.341] [DEBUG] - hello : 1
    0|logTest  | [2020-02-07T15:32:13.346] [INFO] - hello : 2
    0|logTest  | [2020-02-07T15:32:13.347] [WARN] - hello : 3
    0|logTest  | [2020-02-07T15:32:13.348] [ERROR] - hello : 4
    0|logTest  | [2020-02-07T15:32:13.349] [FATAL] - ***** pid :  9572
    1|logTest  | hello : 0
    1|logTest  | [2020-02-07T15:32:13.519] [DEBUG] - hello : 1
    1|logTest  | [2020-02-07T15:32:13.523] [INFO] - hello : 2
    1|logTest  | [2020-02-07T15:32:13.524] [WARN] - hello : 3
    1|logTest  | [2020-02-07T15:32:13.524] [ERROR] - hello : 4
    1|logTest  | [2020-02-07T15:32:13.525] [FATAL] - ***** pid :  10336
    

    6.其他

    6.1 PM2 API

    通过pm2 api启动

    var pm2 = require('pm2');
    
    pm2.connect(function(err) {
      if (err) {
        console.error(err);
        process.exit(2);
      }
      
      pm2.start({
        script    : 'app.js',         // Script to be run
        exec_mode : 'cluster',        // Allows your app to be clustered
        instances : 4,                // Optional: Scales your app by 4
        max_memory_restart : '100M'   // Optional: Restarts your app if it reaches 100Mo
      }, function(err, apps) {
        pm2.disconnect();   // Disconnects from PM2
        if (err) throw err
      });
    });
    

    6.2 pm2生态系统文件

    PM2支持流程管理工作流程。通过进程文件微调每个应用程序的行为,选项,环境变量和日志文件。对于基于微服务的应用程序特别有用。支持的配置格式为Javascript,JSON和YAML。

    pm2 ecosystem
    

    这将生成一个示例ecosystem.config.js:

    module.exports = {
      apps : [{
        name: "app",
        script: "./app.js",
        env: {
          NODE_ENV: "development",
        },
        env_production: {
          NODE_ENV: "production",
        }
      }]
    }
    

    在方便时进行编辑后,您可以通过CLI启动/重新启动/停止/删除此文件:

    $ pm2 [start|restart|stop|delete] ecosystem.config.js
    

    6.3 web管理

    pm2 plus
    

    License

    License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎


    Reference:
    NULL

    更多相关内容
  • pm2入坑详解

    千次阅读 2021-12-17 10:03:00
    1、pm2是什么? pm2是node进程管理工具。 2、为什么选它?与其他工具的对比 对比图 二、特性 1、后台运行 普通启动方式:node index.js,关闭终端就结束进程; pm2可以后台运行,终端关闭不影响。 2、...

    一、概述

    1、pm2是什么?
    pm2是node进程管理工具。

    2、为什么选它?与其他工具的对比

    对比图

    二、特性

    1、后台运行

    普通启动方式:node index.js,关闭终端就结束进程;
    pm2可以后台运行,终端关闭不影响。

    2、自动重启

    可以监听某些文件改动,自动重启

    3、停止不稳定的进程

    限制不稳定的重启的次数,达到上限就停止进程。

    4、0 秒停机重启

    集群模式下,可以达到重启时不停止服务。

    5、简单日志管理

    pm2可以收集日志,并有插件配合进行管理。后面会提到。

    6、自动负载均衡

    cluster模式下,会自动使用轮询的方式达到负载均衡,从而减轻服务器的压力。

    7、提供实时的接口

    pm2插件提供实时的接口,返回服务器与进程的信息,后面会提到。

    8、集成管理

    对于多个进程,不同环境,可以统一配置,方便管理。

    三、基础用法

    ps:这里补充一个安装方法:

    npm install pm2 -g

    如果这时候还是无法运行可以将node安装目录里面的bin目录里面的快捷方式链接到运行目录就可以了,具体操作方法:

    whereis pm2

    得到的目录就是pm2所在的目录,然后加一个快捷:

    ln -s /usr/software/nodejs/bin/pm2 /usr/local/bin/

    1、启动进程: pm2 start app.js

    app.js是node的启动文件,控制台会有如下打印。

    启动

    (1)其中app name 和id都是这个进程的标识,可以对他们进行别的操作,比如stop,delete等。
    (2)mode:进程模式,cluster或fork。cluster有多个进程,而fork只有一个。
    (3)status:进程是否在线
    (4)restart:重启次数
    (5)uptime:运行时间
    (6)cpu:cpu占用率
    (7)mem:内存占用大小

    2、停止进程:pm2 stop app_name|app_id|all

    3、删除进程:pm2 delete app_name|app_id|all

    4、重启进程:pm2 restart/reload app_name|app_id|all

    集群模式下,restart中断服务,而reload不会

    5、查看所有的进程:pm2 list/ls/status

    所有进程

    id编号从1~4的是一个应用,分别对应4个进程。

    6、查看某一个进程的信息:pm2 show app_name|app_id

    第一张图是指进程的信息,比如status(状态)、restarts(重启次数)、uptime(运行时间)、script path(启动入口的路径)、script args(启动文件的参数)、error log path(错误日志的路径)、out log path(输出日志的路径)、exec mode(进程的模式)、watch&reload(是否开启监听文件变动重启)、unstable restarts(不稳定的重启次数)

    第二张图是指代码指标:heap size(堆内存)、heap usage(堆内存使用率)、used heap size(堆内存使用情况)、event loop latency(事件循环时延)、event loop latency p95(事件循环时延 第95分位)

    7、查看日志:pm2 logs

    会打印下面的信息。但是一般不这么看,一般直接进入红框的路径,直接用less 命令查看日志文件。

    8、监控所有进程:pm2 monit

    左上角是进程的列举,右上角是全部的实时日志,左下角是选中进程的代码指标,右下角是进程的信息。

    但是这样有2个不好的地方:
    (1)不可能这样一直开着终端看监控
    (2)比较容易死机

    9、启动命令(start)还可以带参数

    其它可用选项:

    • --watch 以监听模式启动,当文件发生变化时自动重启
    • --max-memory-restart <200MB> 设置应用重载占用的最大内存
    • --log <log_path> 指定日志文件
    • -- arg1 arg2 arg3 给启动脚本传递额外的参数
    • --restart-delay <delay in ms> 延时 x 毫秒自动重启
    • --time 日志里添加时间前缀
    • --no-autorestart 不自动重启
    • --cron <cron_pattern> 按指定的定时任务规则强制重启
    • --no-daemon 以非守护进程模式启动
    • 小结:
      上面介绍的这些启动其实有弊端:
      1、通过命令行传递参数,无法记住到底传递过哪些参数。
      2、对于多个进程,不方便管理。

    请见下章的大招

    四、集成部署(Ecosystem File)

    1、why

    (1)不同环境(dev、test、master)
    (2)通过命令行传递参数不方便
    (3) 同时管理多个应用

    2、how

    生成一个配置文件:pm2 ecosystem
    app是要管理应用的数组,每个对象都是一个应用的配置。

    module.exports = {
      apps: [
        {
          name: "app",
          script: './app.js',
          env: {
            NODE_ENV: "development",
          },
          evn_master: {
            NODE_ENV: "master"
          }
        }
      ]
    }
    

    3、配置项

    (1)基础类

    name:进程名
    script:node启动文件的路径
    cwd :项目所在的目录
    args :通过命令行传递给node启动文件的参数
    interpreter :编译器的绝对路径(默认node)
    interpreter_args :传给编译器的参数
    node_args:传给node的参数

    (2)进阶类

    instances :进程数
    exec_mode :进程的模式(cluster或fork)

    • ps: cluster模式利用node的child_process模块孵化多个子进程,主进程监听端口,子进程只和主进程通信,从而
      达到单个端口多个进程;通过轮转方式实现负载均衡。

    watch :布尔值或文件数组,允许开启监听文件改动重启
    ignore_watch :不监听的文件
    max_memory_restart :超过该内存就自动重启
    env :应用中的默认环境变量
    env_ :命令行中可传入的环境变量,覆盖默认环境变量
    source_map_support :默认true,支持sourcemap文件

    (3)日志类

    log_date_format :日志时间格式
    error_file :错误日志存放路径
    out_file :全部日志存放路径
    combine_logs:是否将不同id的进程日志合并
    merge_logs:同上

    (4)控制流

    min_uptime :pm2认为进程在线的最小时长
    listen_timeout :如果app没有发送ready信号,间隔多长时间reload
    kill_timeout :从告诉进程要关闭到强制关闭进程的间隔时间
    wait_ready:是否等待进程发送ready信号
    max_restarts :最大不稳定重启次数(不稳定指的是小于1s或者小于的min_uptime重启)
    restart_delay:进程掉线后,等待多长时间重启
    autorestart: 是否开启自动重启

    其实还有一个 部署类,但是因为在我的场景中用不上,就没介绍,详细可以看官方文档。

    4、m站最佳实践

    • pm2配置文件是一个单独的工程(pm2-server)

    (1)配置踩坑经历:

    a)script:若使用cluster模式,必须是启动文件入口,不可通过nuxt start启动

    b) max_restarts:指不稳定重启,即小于1s或min_uptime的重启,要结合min_uptime配置才起效

    c) listen_timeout:当cluster模式时,这个值要大于一个进程启动所需时间,否则reload时会造成短暂的服务不可用

    踩坑经历:
    (1)script:若使用cluster模式,必须是启动文件入口,不可通过npm启动
    (2)max_restarts:指不稳定重启,即小于1s或min_uptime的重启,要结合min_uptime配置才起效
    (3)listen_timeout:当cluster模式时,这个值要大于一个进程启动所需时间,否则reload时会造成短暂的服务不可用

    (2)配置启动命令(package.json)

    命令解释:

    cross-env NODE_ENV=development   pm2 start pm2-conf/ecosystem.config.js   --only  detective  --env test
    
    1、 cross-env NODE_ENV=development ,pm2-server工程的环境变量,目的是区分各个环境的应用启动路径
    2、 pm2 start pm2-conf/ecosystem.config.js ,pm2的启动命令
    3、 --only  detective  --env test ,传递给pm2的参数,-- only  <name>,--env <env name>
    

    (3)部署

    前置条件:
    pm2的ecosystem file单独作为一个工程(pm2-server),与其他工程一样的方法拷贝至服务器

    m站构建流程:
    1、jenkins从git上拉取代码
    2、构建完,压缩拷贝至服务器
    3、在服务器上切换至pm2-server目录,通过pm2命令启动m站 (npm run reloadM)
    即:
    cross-env NODE_ENV=master pm2 reload pm2-conf/ecosystem.config.js --only mweb --env master

    五、Graceful start/shutdown

    1、start

    有时候需要等待进程与数据库或者其他建立起链接之后再启动,希望pm2等待这段时间再去启动进程。这个时候就要配置wait_ready: true;同时在进程准备好时发送process.send('ready')

    var http = require('http');
    var app = http.createServer(function(req, res) {
      res.writeHead(200);
      res.end('hey');
    })
    var listener = app.listen(0, function() {
      console.log('Listening on port ' + listener.address().port);
      // Here we send the ready signal to PM2
      process.send('ready');
    });
    

    2、shutdown

    (1)当restart/reload/stop进程时,pm2会向进程发送一个SIGINT信号,告诉进程将会被停止; *当进程接到pm2的SIGINT信号时,可以终止所有连接,清除所有任务,这样就可以【干净利索】的关闭进程
    (2)如果进程1.6s内(参数:kill_timeout,默认1600ms)没有停止,pm2会发送一个SIGKILL信号,之后强制进程退出。

    process.on('SIGINT', function() {
       db.stop(function(err) {
         process.exit(err ? 1 : 0);
       });
    });
    

    六、pm2插件

    1、pm2-logrorate

    pm2只收集日志,通常可以配合pm2-logrotate插件来管理日志,如修改日志文件名,日志分割,日志文件数量管理,自动删除早期日志等。

    2、pm2-web

    pm2 服务状态监控程序,默认9615端口,返回该机器的信息,node进程的信息。

    3、pm2.io

    pm2的可视化实时监控(收费)
    (1)服务器信息
    (2)进程信息:重启次数,cpu使用率,内存占用,event loop延迟,报错邮件提醒等

    四、自研监控

    其实利用pm2-web,轮询它提供的接口,做一个可视化。展示图片就不放上来了。

    主要观察指标:

    • 进程状态:online
    • 重启次数:一定范围
    • 内存使用:稳定
    • cpu占用率:稳定
    • 平均负载:大于0.7有压力,持续大于1.2危险

    结语:

    其实有很多pm2功能还没有提到,因为自己没用到所以也没有去细究。有感兴趣的可以互相学习讨论。

    启动

    $ pm2 start app.js # 启动app.js应用程序
    $ pm2 start app.js -i 4 # cluster mode 模式启动4个app.js的应用实例
    $ pm2 start app.js --name="api" # 启动应用程序并命名为 "api"
    $ pm2 start app.js --watch # 当文件变化时自动重启应用
    $ pm2 start script.sh # 启动 bash 脚本
    

    查看信息

    $ pm2 list # 列表 PM2 启动的所有的应用程序
    $ pm2 monit # 显示每个应用程序的CPU和内存占用情况
    $ pm2 show  id# 显示应用程序的所有信息
    $ pm2 logs # 显示所有应用程序的日志
    $ pm2 logs id # 显示指定应用程序的日志
    

    停止

    $ pm2 stop all # 停止所有的应用程序
    $ pm2 stop 0 # 停止 id为 0的指定应用程序
    

    重启

    $ pm2 restart all # 重启所有应用
    $ pm2 reload all # 重启 cluster mode下的所有应用
    

    删除应用

    $ pm2 delete all # 关闭并删除所有应用
    $ pm2 delete 0 # 删除指定应用 id 0
    

    其他

    $ pm2 gracefulReload all # Graceful reload all apps in cluster mode
    $ pm2 scale api 10 # 把名字叫api的应用扩展到10个实例
    $ pm2 reset [app-name] # 重置重启数量
    $ pm2 startup # 创建开机自启动命令
    $ pm2 save # 保存当前应用列表
    $ pm2 resurrect # 重新加载保存的应用列表
    $ pm2 update # Save processes, kill PM2 and restore processes
    $ pm2 generate # Generate a sample json configuration file
    pm2 start app.js --node-args="--max-old-space-size=1024"
    

    重置重启次数

    pm2 reset  PID //一次只能重置一个

    查看 

    # 查看所有已启动应用的基本信息
    # 同 pm2 ls 或 pm2 status
    $ pm2 list
    
    # 查看所有应用的日志(历史 + 实时)
    $ pm2 logs
    $ pm2 logs www # 只查看应用 www 的日志
    $ pm2 logs --lines 10 # 查看最后10条历史,默认 15 条
    $ pm2 logs --timestamp # 实时日志添加时间前缀
    $ pm2 logs www --lines 10 --err # 只查看应用 www 的最新 10 条错误日志
    $ pm2 flush # ❗️清空所有日志文件
    
    # 查看进程详情
    $ pm2 show app_name|app_id
    
    # 查看每个应用的CPU和内存资源实时占用情况
    $ pm2 monit
    
    # 在线的 Web 诊断系统,跨服务器
    # 需要注册登录或使用 Github、Google 账户授权登录
    $ pm2 monitor

     管理应用状态

    # 重启 ❗️
    # 同时杀死并重启所有进程,短时间内服务不可用。
    # 生成环境推荐使用 reload
    $ pm2 restart app_id|app_name|all
    
    # 重载 👍
    # 始终保持一个进程在线,避免宕机
    $ pm2 reload app_id|app_name|all
    
    # 停止
    $ pm2 stop app_id|app_name|all
    
    # 关闭并删除
    $ pm2 delete app_id|app_name|all
    
    # 直接杀死 pm2 守护进程
    $ pm2 kill

     静态服务器

    # 将目录 dist 作为静态服务器根目录,端口为 3333
    $ pm2 serve ./dist 3333

     集群模式(自动负载均衡)

    # max 表示 PM2 将自动检测可用 CPU 的数量并运行尽可能多的进程
    # max 可以自定义,如果是 4 核 CPU,设置为 2 则只占用 2 核
    pm2 start app.js -i max

     开机自启动

    $ pm2 startup
    $ pm2 unstartup

     应用列表

    # 保存当前应用列表,以后可以恢复
    $ pm2 save  # 同 pm2 dump
    
    # 重新加载之前保存的应用列表
    $ pm2 resurrect
    
    # 清除保存的应用列表
    $ pm2 cleardump

     配置文件

    生成示例配置文件

    $ pm2 ecosystem # 或 pm2 init
    

    示例配置如下(根据实际项目需要添加、删除配置项)

    module.exports = {
      apps : [{
      name      : 'demo',      // 应用名
      script    : 'app.js',   // 应用文件位置
      env: {
        PM2_SERVE_PATH: ".",    // 静态服务路径
        PM2_SERVE_PORT: 8080,   // 静态服务器访问端口
        NODE_ENV: 'development' // 设置开发环境运行时
      },
      env_production : {
        NODE_ENV: 'production'  // 设置生产环境运行时
      },
      instances: "max",         // 将应用程序分布在所有CPU核心上,可以是整数或负数
      watch: true,              // 监听模式
      output: './out.log',      // 指定日志标准输出文件及位置
      error: './error.log',     // 错误输出日志文件及位置
      merge_logs: true,         // 集群情况下,可以合并日志
      log_type: "json",         // 日志类型
      log_date_format: "DD-MM-YYYY",  // 日志的日期格式
      }],
      deploy : {
        production : {
          user : 'SSH_USERNAME',
          host : 'SSH_HOSTMACHINE',
          ref  : 'origin/master',
          repo : 'GIT_REPOSITORY',
          path : 'DESTINATION_PATH',
          'pre-deploy-local': '',
          'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
          'pre-setup': ''
        }
      }
    }

    以配置文件启动示例

    $ pm2 start ecosystem.config.js --env production
    ⚠️ 注意:配置文件支持 js 和 yaml 格式,还有一些没有列举的参数项,详见官方文档:https://pm2.keymetrics.io/docs/usage/application-declaration
    
    

     升级 PM2

    # 更新前推荐先保存当前应用列表,方便更新后直接恢复
    $ pm2 save
    
    # 更新主程序
    $ npm install pm2 -g
    
    # 紧接着更新内存中的程序
    $ pm2 update
    
    # 恢复应用列表
    $ pm2 resurrect

     日志切割

    安装 pm2-logrotate-ext 扩展模块

    项目地址:https://github.com/Lujo5/pm2-logrotate-ext

    $ pm2 install pm2-logrotate-ext
    

    重新启动应用后,pm2-logrotate-ext 以模块的形式被加载、启动。

    可以通过以下命令对其配置进行修改:

    # 当文件大小超过此设置则执行切割
    $ pm2 set pm2-logrotate-ext:max_size 1M
    
    # 保留最新的几个日志文件
    $ pm2 set pm2-logrotate-ext:retain 30
    
    # 是否开启 gzip 压缩
    $ pm2 set pm2-logrotate-ext:compress false
    
    # 文件名的日期部分格式
    $ pm2 set pm2-logrotate-ext:dateFormat YYYY-MM-DD_HH-mm-ss
    
    # 几秒钟检查一次日志文件大小
    $ pm2 set pm2-logrotate-ext:workerInterval 30
    
    # 类似于系统的定时任务,当满足指定规则时,
    # 不管日志文件大小是否达到设置的最大值,直接对日志文件进行切割
    $ pm2 set pm2-logrotate-ext:rotateInterval 0 0 * * *
    
    # 对 pm2 模块产生的日志同样进行切割处理
    $ pm2 set pm2-logrotate-ext:rotateModule true
    
    # 是否按定时任务设置规则强制执行
    # 如果设置为否,则只有当日志文件大小超过设置时才进行切割
    $ pm2 set pm2-logrotate-ext:forced true

    展开全文
  • Node进程管理工具—pm2

    千次阅读 2021-09-21 14:00:21
    PM2 二、简介 PM2是一个内建了负载均衡器的node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。当你要把你的独立代码利用全部的服务器上的所有...

    一、官网

    PM2

    二、简介

    PM2是一个内建了负载均衡器的node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。当你要把你的独立代码利用全部的服务器上的所有 CPU,并保证进程永远都活着,0 秒的重载, PM2 是完美的。

    三、为什么需要pm2?

    目前Nodejs开发中有很多痛点,因为node本身是一个单线程应用,它的特点就是所有方法都是串行一次执行,并且node并没有能力像Java一样独自去创建一个新的线程来实现异步操作,如果在执行I/O中遇到了阻塞就会降低整个应用的执行效率,导致CPU使用率高等不利原因。

    因此在这种模式下,一个线程只能处理一个任务,要想提高吞吐量必须通过多线程。虽然单线程的好处有很多比如避免了线程同步或者死锁、状态同步等等之类的问题,但是在应用和计算能力要求日益倍增的今天,单线程最大的弊端就是无法利用多核CPU带来的优势来提升运行效率。pm2可以把你的应用部署到服务器所有的CPU上,有效的解决这个问题

    四、特性

    1. 内建负载均衡(使用Node cluster 集群模块)
    2. 后台运行
    3. 0秒停机重载(维护升级的时候不需要停机).
    4. 具有Ubuntu和CentOS 的启动脚本
    5. 停止不稳定的进程(避免无限循环)
    6. 控制台检测
    7. 提供 HTTP API
    8. 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

    五、安装

    直接使用 npm 进行全局安装即可。当然你也可以使用 yarn 来进行安装

    // npm
    npm install -g pm2
    
    // yarn
    yarn global add pm2
    

    六、基本命令

    // 启动命令
    pm2 start app.js // 启动nodeJs应用,进程的默认名称为文件名app
    pm2 start app.js--name mynode // 启动node,并指定进程名称为mynode
    pm2 start app.js - i max // 根据有效CPU数目启动最大进程数目
    pm2 start app.js - i 3 // 启动3个进程
    pm2 start app.js--watch // 实时监控的方式启动,app.js文件有变动时,pm2会自动reload
    pm2 start app.js - x // 用fork模式启动 app.js 而不是使用 cluster
    pm2 start app.js - x– - a 23 // 用fork模式启动 app.js 并且传递参数(-a 23)
    pm2 start app.json // 启动进程, 在app.json里设置选项
    pm2 start app.js - i max– - a 23 // 在 – 之后给 app.js 传递参数
    pm2 start app.js - i max - e err.log - o out.log // 启动并生成一个配置文件
    
    // 查看与监视进程
    pm2 list | pm2 ls // 显示所有进程;
    pm2 show 0 | pm2 info 0 // 查看进程id为0的详细信息
    pm2 monit // 进入监视页面,监视每个node进程的CPU和内存的使用情况
    
    // 停止、删除进程
    pm2 stop 0 // 停止id为0的进程
    pm2 stop all // 停止所有进程
    pm2 delete 0 // 删除id为0的进程
    pm2 delete all // 删除所有进程
    
    // 重启、重载
    pm2 restart 0 // 重启id为0的进程
    pm2 restart all // 重启所有进程
    pm2 reload 0 // 0秒停机重载id为0进程(用于 NETWORKED 进程)
    pm2 reload all // 重载所有进程
    
    // 日志操作
    pm2 logs // 显示所有进程的日志
    pm2 logs 0 // 显示进程id为0的日志
    pm2 flush // 清空所有日志文件
    pm2 reloadLogs // 重载所有日志
    pm2 startup // 产生init脚本,保持进程活着
    
    // 杀死PM2进程
    pm2 kill

    七、pm2使用方式

    使用 pm2 主要有 2 种方式:命令行、配置文件。虽然使用配置文件的方式最终仍然需要使用命令行来启动,但两者的主要区别是:(1)命令行方式需要将各种配置参数在命令行中输入。(2)配置文件方式将各种配置参数放在了配置文件里面。

    举个例子:你需要启动一个应用,并指定应用名称为 newApp,设定入口文件路径为 index.js ,我们来看看如何通过两种方式将应用名称和入口文件路径这两个参数带进去

    【1】命令行方式

    pm2 start index.js --name newApp

    【2】配置文件方式

    首先我们需要创建一个配置文件(pm2.config.js),里面内容如下:

    // 文件名为 pm2.config.js
    module.exports = {
        apps: [{
            name: "newApp", // 应用名称
            script: "./index.js" // 入口文件
        }]
    }

    然后再在命令行输入以下内容,表明以指定的配置文件启动应用

    pm2 start pm2.config.js

    【3】总结

    通过对比以上两种形式,你可以看出:使用配置文件的方式,可以将各种参数、环境变量等内容 持久化 地保留在文件中,方便批量管理各种应用,避免在命令行中由于 遗忘、手误 等原因导致启动参数的不可控。

    八、创建配置文件的方式

    可以自行创建一个 Javascript 文件或者使用以下命令生成配置文件,需要注意的一点是,pm2 要求配置文件的文件名必须以  .config.js 结尾。

    【1】命令生成

    pm2 ecosystem

    命令生成的配置文件名称为ecosystem.config.js,格式如下, 可以发现这个文件就是导出 一个对象,其中有个 apps 属性,这是一个列表,其中的每一项都对应一个应用,在每一个子项的对象中设置对应应用的配置参数,你可以在配置文件中配置多个应用。

    module.exports = {
      apps : [{
        script: 'index.js',
        watch: '.'
      }, {
        script: './service-worker/',
        watch: ['./service-worker']
      }],
    
      deploy : {
        production : {
          user : 'SSH_USERNAME',
          host : 'SSH_HOSTMACHINE',
          ref  : 'origin/master',
          repo : 'GIT_REPOSITORY',
          path : 'DESTINATION_PATH',
          'pre-deploy-local': '',
          'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
          'pre-setup': ''
        }
      }
    };

    【2】自行创建

    如果你自行创建 Javascript 文件,按照以上格式创建即可,注意文件名要以config.js结尾。

    【3】注意

    这个配置文件无论是通过命令创建或者你手工自己创建的,只要符合语法,两者是没有任何区别的。除了 .js  形式的配置文件外,pm2 还支持 .json 和 .yml 形式的配置文件,这三种配置文件的形式本质上没有任何区别,参数名称也完全一致,差异仅在于参数呈现的方式。

    九、案例

    我们先创建几个项目文件用于演示,目录结构如下,demo1目录存放的项目project1用命令行方式使用pm2,demo2目录存放的项目project2和project3用配置文件方式使用pm2, 三个项目都是node.js项目,index.js是非常基础的 Koa 项目入口文件,ecosystem.config.js是配置文件,各自的 node_modules 文件中只安装了 koa 框架

    pm2
    ├── demo1
        └── project1
    |       ├── index.js
    |       └── node_modules
    └── demo2
        ├── ecosystem.config.js
        ├── project2
        │   ├── index.js
        │   └── node_modules
        └── project3
            ├── index.js
            └── node_modules

    入口文件index.js代码如下,三个项目的port分别为 8001、8002、8003

    'use strict'
    
    const Koa = require('koa')
    const app = new Koa()
    
    const PORT = 8001 // 三个项目分别为 8001,8002,8003
    
    app.use(ctx => {
        ctx.body = {
            NODE_ENV: process.env.NODE_ENV,
            url: ctx.url,
            port: PORT,
        }
    })
    
    app.listen(PORT)

    配置文件ecosystem.config.js 代码如下

    module.exports = {
        apps: [{
            cwd: '../demo2/project2',
            name: 'project2',
            script: 'index.js',
            watch: ['.']
        },
            cwd: '../demo2/project3',
            name: 'project3',
            script: 'index.js',
            watch: ['.']
        }]
    }

    【1】启动应用

    命令行方式:pm2 start xxx.js

    配置文件方式:pm2 start || pm2 start ecosystem.config.js 

    我们使用命令行方式启动project1应用,进入到project文件目录,运行pm2 start index.js命令,我们没有在命令中设定任何参数,pm2 会自动按照默认参数值进行执行。例如自动将入口文件的文件名index作为应用名称。几乎每一次命令执行完成后,pm2 都会显示一个应用列表(如下图所示),接着你就可以在网页中输入:localhost:8001查看project1项目

     我们接着使用配置文件方式启动project2和project3应用,因为两个应用的配置在同一个文件,因此我们只需要运行一次配置文件,启动成功后可在网页中访问localhost:8002和localhost:8003

     【2】停止应用

    使用id停止:pm2 stop <id>

    使用name停止:pm2 stop <name>

    停止所有应用:pm2 stop all

     

    【3】重启应用

    使用id重启:pm2 reload <id>

    使用name重启:pm2 reload <name>

    重启所有应用:pm2 reload all

     

     【4】显示应用列表

     pm2 list

    pm2 ls

    pm2 status

      【5】以JSON格式显示应用列表

     pm2 jlist

    pm2 prettylist

     使用 pm2 jlist 命令,你会发现输出的内容很乱,你可以使用 pm2 prettylist 命令来输出优化过的 JSON 格式内容

     【6】查看应用信息

    pm2 describe id 
    ​​​​​​​pm2 describe name

    上述的 JSON 格式应用列表,输出了所有应用的信息,而且信息十分凌乱,我们可以使用 pm2 describe 命令来查看指定应用的信息

     【7】实时打印日志

    打印日志:pm2 logs

    指定日志行数:pm2 logs --lines  (指定显示的日志行数)

    清空日志:pm2 flush

     对于线上正在运行的应用,有的时候需要打印实时日志来进行调试排查问题,虽然日志会自动添加到日志文件里面,但是总之不太方便。pm2 提供了logs命令,可以直接实时打印日志。

    注意:当前命令行页面使用了该命令后,当前命令行会一直处于监听状态,你需要再新开一个命令行去敲其他命令

    【8】显示仪表盘

    pm2 monit

     【9】删除应用

    通过Id删除:pm2 delete id

    通过name删除:pm2 delete name

    删除所有应用:pm2 delete all

    删除应用几乎不会造成任何后果,只是在管理列表中删除了这一项,并不会删除项目文件 

     

     【10】配置参数-应用名称

    --name <app_name>

    在命令行方式中,使用 --name <app_name> 参数指定应用名称,上面我们命令行运行的project1默认名称为index,现在我们指定名称为project1

     【11】配置参数-监听目录

     监听目录:--watch 

    指定目录不被监听:--ignore-watch

    监听目录用于当指定监听目录文件发生变化时,pm2 将会自动重启应用

    除了指定一个监听目录外,还可以再继续指定某个目录不被监听,例如上述的例子,指定了project1目录为监听目录,然后你把日志文件放在了这个目录下,比如为 logs 目录,这个目录不希望被监听,否则会形成死循环,这时候就需要用到另一个参数 --ignore-watch,输入一下命令

    pm2 start 0 --watch --ignore-watch './logs'

     【12】配置参数-最大内存数

    --max-memory-restart xxx(K|M|G)

    设置最大内存数,当应用运行时占用的内存超出该数值后,应用将自动重启。命令行方式通过 --max-memory-restart 参数设定应用运行最大内存,后续跟上数值和单位,单位只能是 K,M,G 三个值,分别表示 KB,MB,GB 。

     【13】配置参数-日志存放路径

    --log <log_path> 

     日志默认会放置在 $HOME/.pm2/logs/ 目录下,使用 --log <log_path> 指定日志文件路径

    pm2 start index.js --log ./logs/mylog.log

     文章每周持续更新,可以微信搜索「 前端大集锦 」第一时间阅读,回复【视频】【书籍】领取200G视频资料和30本PDF书籍资料

    展开全文
  • 从浅到深使用pm2来彻底掌握微服务运维精髓

    千次阅读 多人点赞 2021-06-01 20:49:46
    喝茶去,让pm2来管理你的微服务 前面博主写了一篇如何摆姿势启动进程的收到好多阅读。 里面介绍了,pm2这个js库,这个库除了对简单应用进程管理,但是它还有很多功能,让我们一起看看! Mini微服务平台 本文就使用这...

    从浅到深使用pm2来彻底掌握微服务运维精髓

    前面发了一篇多种姿势后台启动进程提到pm2,它就像一个大管家一样,高效管理协调多个微服务,神奇吧。

    本文会从简单使用,切入到微服务管理。

    所以下面,我们先试一个web服务来熟悉它。接着,围绕一个极简微服务平台,运用pm2来管理,举一反三从而熟悉甚至掌握微服务管理运维的精髓!文末有好书推荐!

    安装与使用

    全局安装

    npm install -g pm2

    查看应用程序进程

    pm2 ls 
    

    在这里插入图片描述
    当前pm2管家没有启动任何服务,所以上面展示了一个空列表。

    第一个简单web应用效果

    如下,左边浏览器为web主页,右边为nodejs启动终端
    在这里插入图片描述
    上图展示的应用代码如下,可以复制保存为: simpleweb.js
    直接运行启动命令:node simpleweb.js

    const pid = require('process').pid
    const server = require('http').createServer((req,res)=>{
        console.log(new Date() + ' - visiting app')
        res.write("Levin - PM2 DEMO - ProcessId: "+pid)
        res.end()
    })
    server.listen(8000,()=>{console.log('listening at 8000, pid:',pid)})
    

    以上代码使用NodeJS内置http模块来创建一个服务器监听8000端口,打开浏览器访问能看到进程号。

    接下来都交给pm2

    关闭上面进程后使用命令:pm2 start simpleweb.js

    查看应用进程,日志

    一旦讲应用交由pm2管理,我们可以用使用下面命令

    pm2 ls #查看进程
    pm2 logs simpleweb #或者pm2 logs 应用序号,pm2 ls返回的第一列
    pm2 monit #监控查看当前应用的日志
    

    效果如下,看到simpleweb这个应用了把,pm2帮我们管理了。
    在这里插入图片描述
    在这里插入图片描述
    不过我们这里使用: pm2 start simpleweb.js --watch。

    后面加了–watch,这个能够监听默认当前工作目录。

    试着修改文件比如下图中间终端移动文件,pm2 检测到变化重启web应用,左边浏览器web页面打印新的进程id,右边日志也更新了。
    在这里插入图片描述

    pm2 保证应用程序进程常驻

    读者可以试着kill -9 命令杀进程(加上面浏览器显示的进程ID),刷新web页面之后打印了新的进程id。
    这时候 pm2发现程序挂了,自动恢复了。

    这里简单带过一下pm2的原理

    我们看到pm2命令被执行后,系统中多了一个守护进程“PM2 v4.5.6: God Daemon", 下图。
    它维护了一些进程信息在当前用户主目录下 .pm2目录。
    当我们把这个进程杀掉之后,连带被pm2使用的服务都被停掉了。必须启动pm2 daemon之后再restart。
    在这里插入图片描述
    感受到pm2的魅力了吧,其他命令可使用pm2 -h查看。

    这里先使用pm2 delete simpleweb,清理一下应用。

    下面进入多个服务管理场景,稍微复杂一点,加一点耐心看完下去就能学会一个微服务并掌握它的运维管理。

    管理一个迷你的微服务平台

    简单带过一下微服务

    把人体看作一个微服务平台,那眼睛就是一个专门接入图像数据的微服务,大脑就是一个执行数据计算的微服务,然后有些还是成对出现的(双热实例)。

    商品展示微服务平台

    在这里插入图片描述
    上图有两个微服务

    • LevinUIApp前台服务:用来展示产品库存数据。
    • BackendApp后端产品服务:提供产品库存数据 给前台服务但是有两个worker子进程。

    启动UI服务

    #这里加上--name指定了应用名为uiapp
    pm2 start ui-app/app.js --name uiapp
    

    在这里插入图片描述

    启动后端进程

    后端服务启动两个worker线程(-i) :

    #雷学委demo代码,指定进程名字为levinbapp并启动两个worker线程,用更多CPU来提高效率。
    pm2 start backend-app/app.js --name levinbapp -i 2
    

    效果如下,目前有两个应用进程了。
    在这里插入图片描述
    这里通过-i轻易的横向拓展更多个worker。 想要玩更多的服务,读者可以看完学会后自行尝试。

    看效果并微服务日志:

    #雷学委demo代码
    pm2 monit
    

    运行上面代码,同时打开两浏览器页面。
    刷新前端应用(最左边窗口),会调用后端接口(中间的窗口),monit控制台切换服务查看日志。
    如果刷新后端接口,monit控制台实时打印日志。
    在这里插入图片描述
    使用下面命令杀掉中间的后端服务, 一次刷新最左边uiapp应用,和中间的后端服务窗口。显示服务下线了。

    而且在最右边monit窗口,能方便实时的切换服务日志,和查看服务状态,这是很不错的。

    pm2 stop levinbapp
    

    在这里插入图片描述

    用起来还是很简单的,pm2管家覆盖支持了程序查日志,起停服务恢复等等。

    那么下面的配置化管理,让我们更加简单专业的管理微服务平台。

    配置化管理启动/停止服务群

    使用 pm2 ecosystem 生成类似下面的ecosystem.config.js文件,这个可以启动的。读者可以不使用博主的代码,自己做一个前台app.js和后台app.js试试看。

    module.exports = {
      apps : [{
        name: 'uiapp',
        script: './ui-app/app.js',
        watch: ['./ui-app']
      }, {
        name: 'levinbapp',
        script: './backend-app/app.js',
        watch: ['./backend-app']
      }],
      deploy : {//ssh方式把微服务整个附属到生产服务器!
        production : {
          user : 'root',
          host : 'alicloudtx',//阿里云主机
          ref  : 'origin/master',
          repo : 'GIT_REPOSITORY',
          path : '/demo/levin-demo-msa',
          'pre-deploy-local': '',
          'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
          'pre-setup': ''
        }
      }
    };
    

    简单介绍一下:apps属性配置了需要pm2管理的服务群。
    然后deploy属性支持用户使用pm2直接把多个服务群部署到阿里云。

    然后使用: pm2 start ecosystem.config.js
    在这里插入图片描述
    部署到云上,这里不展示了,只要配置好ssh,即可部署到任意云平台。

    总结

    微服务平台,总是表现为多个服务多个机器分布式运行,资源和算力拓展了,管理等复杂度提升了。

    可能两个服务登录不同机器,查看日志还容易,当服务到达成百上千的时候问题就很明显。

    所以,我们需要(孵化)像pm2这样的工具,提供下面的便利:

    开发和运维上的便利

    • 无缝接入服务管理

    这个对NodeJS应用来说,几乎是神器,pm2 原生地支持了应用程序管理,提供了命令管理查看用户应用。

    举Springboot开发的微服务平台为例,开发应用的同学需要引入SpringCloud等组件进行服务发现,注册到注册中心。本人也使用过春天全家桶来制作微服务平台,再简化还得定制一个通用SpringBoot Starter,理念也是类似的!

    • 统一管理日志工作台

    特别是在微服务环境下,多个服务,使用pm2 monit,可以很方便的一个monit工作台切换微服务日志。大型平台那就需要做日志搜索了,比较成百上千个服务在pm2 monit窗口切换也不现实,这也是pm2缺少的地方!

    不过,pm2还有一个在线版的Keymetics 做专业微服务平台监控管理的工作台(收费)。

    • 更容易的应用弹性伸缩

    上面启动后台服务的时候,加了一个-i参数,指定数量就能启动多worker服务。
    虽然在NodeJS中还是单进程多线程,但是这个参数化实例拓展,这个设计是很有指导意义的!

    • 服务启动/恢复操作的封装,原子性

    我们使用pm2 start/stop appname即可,而非开发进入多个应用目录手动打node app.js。再者pm2会常驻应用保证应用不掉线,这个设计也是值得参考。

    比如下面的命令:

    #记得加 -i 2否则启动一个worker单线程处理ui的请求。
    pm2 start levinbapp -i 2
    

    在这里插入图片描述

    整体编排和部署配置化管理

    一个配置管理整个微服务的多个服务和实例,还能快速部署到云平台!

    说到这,读者会不会觉得有些地方跟k8s(kubernetes)有相似的地方,无缝契合,配置化编排,弹性伸缩等等。 在NodeJS应用这一块pm2几乎是轻量接入,不需要像k8s那样去进行很多配置才能用起来。

    本文主要是通过pm2使用展示了微服务应用的管理运维,指出一个更好的方向,以此引导读者把握并朝着这些角度开发优化微服务平台的运维与管理!

    看看你周边的微服务可以想想怎么更好更方便的定位日志,服务部署,起停/横向拓展等等?

    至于书籍

    想做微服务的务必把这本书《微服务设计》看完。

    这对架构实施和运营微服务很有帮助,算是微服务领域内比较经典的书籍,看了不下两遍!

    还有参考链接中的MicroServicePattern 网站,上面有很多例子。

    题外话,对NodeJS比较熟的同学可以去阅读一下它的源码,像服务常驻/热加载更新/无缝接入管理,这些优秀的实现值得挖一挖,可以开发出优秀的运维监控平台。

    代码和参考链接

    上文的微服务代码: https://blog.csdn.net/geeklevin/article/details/117458297?spm=1001.2014.3001.5501
    pm2官网: https://pm2.keymetrics.io/docs/usage/quick-start/
    书籍:https://book.douban.com/subject/26772677/
    微服务网站: https://microservices.io/patterns/microservices.html

    展开全文
  • pm2的基本使用

    万次阅读 多人点赞 2019-07-13 00:36:03
    pm2的基本使用 目录 1、pm2的安装... 2 2、更新PM2. 3 3、上传项目到服务器并使用普通方式启动... 3 4、使用pm2启动项目... 4 5、pm2对项目的基本管理操作... 6 5.1、启动项目... 6 5.2、列出PM2管理的所有...
  • 使用pm2部署node生产环境的方法步骤

    千次阅读 2021-01-17 13:18:15
    一、PM2是什么是可以用于生产环境的Nodejs的进程管理工具,并且它内置一个负载均衡。它不仅可以保证服务不会中断一直在线,并且提供0秒reload功能,还有其他一系列进程管理、监控功能。并且使用起来非常简单。嗯嗯,...
  • NUXT搭配pm2部署上线

    千次阅读 2021-11-26 20:59:40
    如果实在是找不到 :pm2: command not found 修改软连接搭配nginx的使用nginx 命令之后就是PM2启动,,,pm2启动nuxt项目,,pm2其他命令 一. 项目打包,指定配置文件package.json # 在package.json "config": {
  • pm2 start命令进阶详解

    千次阅读 2021-01-16 10:08:12
    运行php推荐pm2 start .sh --interpreter bashpm2 start "php index.php" "/index/receiver/receive" --name aaa.sh内容 (tp5里的命令行)php index.php /index/receiver/receive前言说起这个pm2,在node的世界里面,...
  • PM2常用命令

    万次阅读 2018-08-09 15:32:03
    一、PM2常用命令 假设你现在已经写好了一个app.js的文件,需要启动,你可以使用pm2进行管理 1. 启动 # pm2 start app.js # pm2 start app.js --name my-api #my-api为PM2进程名称 # pm2 start app.js...
  • pm2查看、重启服务和日志

    千次阅读 2022-01-11 14:36:48
    PM2 是一个守护进程管理器,它将帮助您管理和保持应用程序在线。 1. ssh远程登录 ssh [hostAddress] 通过输入密码,成功会登录到对应主机 如果失败会被拒绝 2. pm2 查看当前启动的所有应用 pm2 list 3. pm2 ...
  • 关于pm2项目启动成功,但pm2 list又显示errored的问题 首先先判断入口js文件app.js在node上是否能正确运行,确定是否缺少依赖。如若缺少则安装对应的依赖再进行pm2管理。 如若node能正常运行,pm2也能正常启动,...
  • pm2配置文件介绍

    千次阅读 2020-12-22 16:41:12
    PM2的优势PM2是一个带有负载均衡功能的Node应用的进程管理!内建负载均衡(使用Node cluster 集群模块)可以在后台运行可以0秒停机重载,(可以理解为不需要停机重启,在用户愉快的浏览页面时我们已经程序更新了)控制台...
  • 小程序上线过程中,pm2安装成功了,但是运行pm2命令只打印一句话 root@iZm5e3iekfi2krh6udbikaZ:~/.pm2# pm2 -v [PM2] Spawning PM2 daemon with pm2_home=/root/.pm2 查看pm2日志,里面报错 root@iZm5e3iekfi2krh...
  • pm2 启动 Node + TS 项目

    千次阅读 2022-01-28 09:52:46
    全局安装 pm2 npm install -g pm2 pm2 安装typescript和ts-node pm2 install typescript pm2 install ts-node@latest typescript 安装失败 就先装ts-node@latest,在安装typescript 启动项目 方式一: 通过配置...
  • pm2安装使用

    千次阅读 2021-11-19 09:31:42
    pm2是一个进程管理工具,可以用它来管理node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能,在前端和nodejs的世界中用的很多。 假如go应用名字叫main可执行文件 ,那么直接pm2 start ...
  • [PM2] Spawning PM2 daemon with pm2_home=/root/.pm2 ```,回车后又到命令行,检查后磁盘只用了17%,不是网上有说过的磁盘满了的问题。怀疑不知道是不是安装问题,不过卸载后重新安装了还是这样,求各位大神解答。
  • [pm2@2.10.1] link /usr/local/node8.9.1/bin/pm2-runtime@ -> /usr/local/node8.9.1/lib/node_modules/pm2/bin/pm2-runtime 建立pm2软链接 ln -s /usr/local/node8.9.1/bin/pm2 /usr/local/bin/pm2 Nuxt...
  • linux 安装pm2

    千次阅读 2022-01-23 16:13:12
    npm install -g pm2 #查看服务器的npm默认安装目录 npm config get prefix #如果目录是 /usr/local/nodejs cd /usr/local/nodejs/lib/node_modules/ #添加软链接 ln -s /usr/local/nodejs/lib/node_modules/pm...
  • linux下安装pm2,pm2: command not found

    千次阅读 2019-02-17 22:44:08
    1:安装pm2 操作描述:  你要在linux上安装pm2有很多方法,但我是用node的工具npm来完成安装的,所以在安装pm2之前需要先安装node。这里如果不会,就百度一个安装node,这个小事我就不做了,如果不服,你可以.加....
  • pm2 常用命令

    千次阅读 2021-11-26 10:44:57
    npm install pm2 -g 常用命令 # 启动进程/应用 pm2 start bin/www # 重命名进程/应用 pm2 start app.js --name wb123、 # 添加进程/应用 pm2 start bin/www # 结束进程/应用 pm2 stop www # 结束所有进程/应用 ...
  • PM2实用入门指南

    万次阅读 2018-03-14 09:46:24
    来源:https://www.cnblogs.com/chyingp/p/pm2-documentation.html 简介 ...下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和配置。 安装 全局安装,简直不能更简单。 npm in...
  • 你所不知道的pm2

    千次阅读 2018-01-09 23:33:13
    pm2】 如官网介绍的,pm2是nodejs下先进的,生产进程管理器, 安装 1 npminstall-gpm2 常用命令 1 2 3 4 5 6 pm2startapp.js--namedemo pm2stopdemo pm2restartdemo pm2delet
  • 2 成为高手 – 进阶篇 3 追根溯源 – 内核篇 4 跨界应用 – 创造篇 5 利剑在手 – 工具篇 6 Web技术 – 应用篇 前言 首先,本篇主要讲述发生在项目实际部署NodeJS应用时遇到的多核CPU没有充分利用的...
  • 为什么要使用PM2及PM常用指令

    千次阅读 2019-09-04 18:03:31
    PM2 pm2 是开源的基于Nodejs的进程管理器,包括守护进程、监控、日志的一整套完整的功能; pm2 基本是node应用程序不二的守护进程选择; 事实上,pm2并不仅仅可以启动node程序,对于一般的脚本程序同样可以胜任; ...
  • 【涂叶node】CentOS 通过npm 全局安装pm2后,mac上出现 pm2 未找到命令(-bash: pm2: command not found)解决方案 首先介绍一下pm2:【官方介绍】pm2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐...
  • 使用pm2来保证Spring Boot应用稳定运行

    千次阅读 2020-01-08 17:37:54
    使用pm2来保证Spring Boot应用稳定运行 原作者:dulingyulove原文链接:https://www.bbsmax.com/A/KE5QmgZ35L/ Spring Boot开发web应用就像开发普通的java程序一般简洁,因为其内嵌了web容易,启动的时候只...
  • Pm2 部署 Nuxt 项目

    千次阅读 2022-03-17 16:58:21
    1. 克隆代码 2.vscode 打开项目 并安装 yarn 3.编译打包生成 .nuxt 目录(后续如果升级 只需要替换该目录即可) yarn build 或者 npm run build 4.登录宝塔安装 pm2 ...pm2 start..
  • PM2使用方法

    千次阅读 2019-04-18 19:50:08
    pm2 -v 找不到 whereis node 找到node下的bin 里面有PM2的话sudo ln -s /usr/local/node/node-v9.3.0-linux-x64/bin/pm2 /usr/local/bin/ 软链接到全局 用它来启动程序(在当前目录下可以直接启动,p...
  • pm2启动jar包

    千次阅读 2020-09-26 10:04:47
    pm2启动jar包 简介PM2: 是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。 Linux中全局安装PM2: #npm是node.js命令,自行百度安装并配置源...
  • Yapi 配置 pm2服务

    千次阅读 2020-12-05 10:58:47
    全局安装 pm2 npm install pm2 -g 配置pm2服务 pm2 start D:\YApi\my-yapi\vendors\server\app.js --name Yapi 以Yapi的名称命名并启动 常用命令 pm2 start Yapi pm2 stop Yapi

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439,929
精华内容 175,971
关键字:

pm2

友情链接: pwm实现da原理.zip