但是bower的市场兼容性明显没有npm强壮,未经作者

作者: 前端  发布:2019-11-04

nodejs部署方式-pm2(一)

2016/12/03 · JavaScript · NodeJS

本文作者: 伯乐在线 - pangjian 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

图片 1

目前Nodejs开发中有很多痛点,其中有一个是修改完代码以后需要我们重启服务才能看到效果。这样一次次的杀进程、重启,杀进程、重启很让人头大。程序员是最痛恨重复工作的物种,之前有了解过的同学可能知道foreverforever可以帮我们解决上面的问题,通过对资源变化的检测做到变化后自动重启。开发阶段我们使用node file.js来启动另外由于Nodejs的单线程,任何异常都会导致整个服务中断,这对于生产上长时间提供服务的程序来讲是不可以的,forever可以帮我们在异常后重启,保证服务一直在线,我想这也就是它名字的由来吧。但我想说的是forever不够“高!大!上!”。接下来我要介绍一个足够高大上的神器– pm2

<<编程基础-语言JavaScript.Nodejs.Mobile>>
https://github.com/openstf

 

http://www.cnblogs.com/lan-writenbook/p/5473345.html
https://mp.weixin.qq.com/debug/wxadoc/dev/api/
http://blog.csdn.net/lilong_dream/article/details/23356513
http://www.linuxprobe.com/chapter-03.html
http://www.cnblogs.com/fnng/category/410088.html

简介

pm2=P(rocess) M(anager)2,是可以用于生产环境的Nodejs的进程管理工具,并且它内置一个负载均衡。它不仅可以保证服务不会中断一直在线,并且提供0秒reload功能,还有其他一系列进程管理、监控功能。并且使用起来非常简单。下面我将把我的使用过程分享出来,Nodejs应用是一个基于Express 4.x的应用,名称是Wolverine

<pre>

需求(这段话是摘抄参考文档的,因为作者也想这么说):

       公司出于自身隐私保护需要,不想把自己的代码开源到包管理区,但是又急需一套完整包管工具,来管理越来越多的组件、模块和项目。对于前端,最熟悉的莫过于npm,bower等;但是bower的市场兼容性明显没有npm强壮,加之commonjs规范的日益成熟。npm应该是前端包管理的不二选择。

公司对于搭建本地私有npm库有如下要求:

  1. 私有包托管在内部服务器中

  2. 项目中使用了公共仓库上的公共包,也使用了内部服务器上的私有包

  3. 希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库

  4. 服务器硬盘有限,希望只缓存下载过的包,而不是全部同步。

  5. 对于下载,发布npm包有对应的权限管理,安装方便,配置简单,依赖少。

pm2是一个带有负载均衡功能的应用进程管理器,类似有Supervisor,forever。
Linux Binaries下载地址:https://nodejs.org/dist
cd oneinstack/src
wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-x64.tar.gz
tar xzf node-v4.2.4-linux-x64.tar.gz
cp node-v4.2.4-linux-x64/bin/node /usr/local/bin/
cp -R node-v4.2.4-linux-x64/lib/node_modules /usr/local/lib/
ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm
npm install pm2@latest -g #安装最新版本pm2模块
PS: 如果你的主机无法连接公网,先找到能连公网的主机安装上面的方法安装pm2,然后拷贝到你要安装的主机。拷贝如下目录:
/usr/local/bin/node
/usr/local/lib/node_modules
再创建相关软连接

安装

环境清单:

  • windows7 x64
  • node v5.0.0
  • npm 3.3.6

全局安装pm2

$ npm install pm2 -g

1
$ npm install pm2 -g

更新

$ pm2 update

1
$ pm2 update

pm2和forever是启动Nodejs服务常用到的两个工具。使用这两个指令可以使node服务在后台运行(类似于linux的nohup),另外它们可以在服务因异常或其他原因被杀掉后进行自动重启。 由于Node的单线程特征,自动重启能很大程度上的提高它的健壮性。
本文不对比两者工具优劣,只是结合自己的使用,简要介绍如何在工程部署时更好的使用pm2。

Sinopia 是一个零配置的私有的带缓存功能的npm包管理工具。

三、PM2常用命令

启动

以前启动Wolverine是利用package.json的scripts来实现的,只需要执行npm run start就可以启动,配置如下:

"scripts": { "start": "node ./bin/www", "debug": "node debug ./bin/www" },

1
2
3
4
5
"scripts": {
    "start": "node ./bin/www",
    "debug": "node debug ./bin/www"
 
  },

使用pm2我们可以在start处配置成 pm2 ./bin/www,命令后面支持加参数来实现watch、cluster多进程模式等功能。我不太喜欢一大串的命令,于是我使用了配置文件的方式。
Wolverine的根目录,我创建了一个processes.json配置文件,配置文件内容如下,注释写的也很清楚了

{ "apps" : [{ "name" : "Wolverine", //名称 "script": "./bin/www", //程序入库 "cwd": "./", //根目录 "watch":[ "bin", "common", "configs", "public", "routes", "views" ],//需要监控的目录 "error_file":"./logs/app-err.log",//错误输出日志 "out_file":"./logs/app-out.log", //日志 "log_date_format":"YYYY-MM-DD HH:mm Z" //日期格式 }] }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "apps" : [{
    "name" : "Wolverine",  //名称
    "script": "./bin/www", //程序入库
    "cwd": "./",           //根目录
    "watch":[
"bin",
"common",
"configs",
"public",
"routes",
"views"
],//需要监控的目录
    "error_file":"./logs/app-err.log",//错误输出日志
    "out_file":"./logs/app-out.log",  //日志
    "log_date_format":"YYYY-MM-DD HH:mm Z" //日期格式
    }]
}

随后,我在package.json中增加了一条

"pm2": "pm2 start processes.json"

1
"pm2": "pm2 start processes.json"

在启动就直接输入如下命令就好:

$ npm run pm2

1
$ npm run pm2

看到下面的界面,就启动成功了,然后我们就可以关掉这个窗口了,服务不会因此停止,是不是高大上多了。
图片 2

基本指令

npm install pm2 -g : 全局安装。
pm2 start app.js : 启动服务,入口文件是app.js。
pm2 start app.js -i [n] --name [name] : 启动n个进程,名字命名为name。
npm restart [name or id] : 重启服务。
npm reload [name or id] : 和rastart功能相同,但是可以实现0s的无缝衔接;如果有nginx的使用经验,可以对比nginx reload指令。
pm2 start app.js --max_memory_restart 1024M : 当内存超过1024M时自动重启。 如果工程中有比较棘手的内存泄露问题,这个算是一个折中方案。
pm2 monit : 对服务进行监控。

更多的指令可以参考 PM2 介绍

1.要安装的软件

假设你现在已经写好了一个app.js的文件,需要启动,你可以使用pm2进行管理

管理和监控

启动成功的界面会展示App name和id,这两个值很重要。当然这两个值都可以在processes.json配置文件进行配置。
打开命令行,在任何路径下,输入

$ pm2 list

1
$ pm2 list

就能看到启动时的图表界面,方便我们查看所有通过pm2管理的Nodejs服务。

输入,下面命令配合id或者name可以查看某一个进程的详细信息

$ pm2 show Wolverine 或者 $ pm2 show 0

1
2
$ pm2 show Wolverine 或者
$ pm2 show 0

图片 3
内容涉及重启次数、运行时间、脚本路径、参数、日志路径、运行模式等等信息
输入

$ pm2 monit

1
$ pm2 monit

停止、重启等命令

$ pm2 stop [app-name|id] #停止某一个进程,可以使用app-name或者id $ pm2 stop all #停止所有进程 $ pm2 restart all #重启所有的进程 $ pm2 delete [app-name|id]#删除并停止进程 $ pm2 delete all #删除并停止所有进程

1
2
3
4
5
6
7
$ pm2 stop [app-name|id]  #停止某一个进程,可以使用app-name或者id
$ pm2 stop all            #停止所有进程
 
$ pm2 restart all         #重启所有的进程
 
$ pm2 delete [app-name|id]#删除并停止进程
$ pm2 delete all          #删除并停止所有进程

可以进一步查看每一个服务的cpu、内存动态占用情况。
图片 4

高级用法

pm2支持配置文件启动:
pm2 ecosystem: 生成配置文件ecosystem.json
pm2 startOrRestart /file/path/ecosystem.json : 通过配置文件启动服务

如下是我开发时ecosystem.json的内容:

  {
    /**
    * Application configuration section
    * http://pm2.keymetrics.io/docs/usage/application-declaration/
    * 多个服务,依次放到apps对应的数组里
    */
    apps : [
    // First application
        {
            name      : "nova",
            max_memory_restart: "300M",
            script    : "/root/nova/app.js",
            out_file : "/logs/nova_out.log",
            error_file : "/logs/nova_error.log",
            instances  : 4,
            exec_mode  : "cluster",
            env: {
                NODE_ENV: "production"
            }
        }
    ]
 }

上述采用cluster模式启动了4个服务进程;如果服务占用的内存超过300M,会自动进行重启。

软件简介

nodejs/npm 软件名称: node-v6.9.1-linux-x64.tar.gz   下载地址:

安装命令:

tar -xvf node-v6.9.1-linux-x64.tar.gz

sinopia    版本:1.4.0 安装命令: 

npm install -g sinopia  

pm2   版本:2.1.4  安装命令

 npm install -g  pm2  

nrm   版本:1.0.0  安装命令

npm install -g nrm  
  1. 启动

日志监控

如果你一直使用tail -f log_file.log log_error.log来查看日志,你可能会爱上下面的这个功能。

$ pm2 logs $ pm2 logs [app-name]

1
2
$ pm2 logs
$ pm2 logs [app-name]

我们可以实时查看全部进程的日志,或者只查看某一个。我们甚至可以使用json格式查看日志。

$ pm2 logs --json

1
$ pm2 logs --json

监控工具

pm2的监控功能是其一大特色,它提供的监控服务Keymetrics monitoring 很酷炫,感兴趣的可以配置玩一下。

规划目录(下为本次安装的实际目录,可根据实际环境调整)

目录 账户 备注
npm、nodejs解压目录 /opt/software nadmin

 

sinopia启动时目录 /home/nadmin nadmin

 

sinopia的passwd路径 /home/nadmin/node_htpasswd nadmin  
sinopia的storage路径 /home/nadmin/sinopia/storage nadmin 建议磁盘空间较大不推荐放在home目录

pm2 start app.js

Web API

如果你不仅仅想监控被pm2管理的进程,还需要监控进程所运行的机器的信息,你可以使用下面这个API

$ pm2 web

1
$ pm2 web

pm2会启动一个叫做pm2-http-interface的进程提供web服务。你打开浏览器输入http://127.0.0.1:9615,是不是被看到的结果惊艳到了。
图片 5
pm2提供的web api通过json输出了很多信息。大致结构可以看截图:
图片 6

拿出你的想象力,我们可以开发一个应用来调用此api,就可以开发出一个图形界面的监控软件了。。。

一些思考

2.具体安装步骤(Server端)

pm2 start app.js --name my-api #my-api为PM2进程名称

其它

pm2的优势和功能还不止这些,后续还会有文章详述更多高级的用法,比如进程恢复、图形界面,模块,甚至的功能开发。最重要的优势我想就是它的稳定性了,pm2的功能全部通过了测试,有超过1000个测试。同时提供Windows、MacOSX(OSX)、Linux的稳定版本。PayPal、微软、IBM等等大厂都在使用。我们已经有充分的理由把它应用到生产环境上。

打赏支持我写出更多好文章,谢谢!

打赏作者

1. 服务进程数

至于要启动几个进程,可以通过服务器的内核数进行确定,几个内核就启动几个服务。指令如下:

  # 查看物理CPU个数
  cat /proc/cpuinfo| grep "physical id" | sort| uniq | wc -l

  # 查看每个物理CPU中core的个数(即核数)
  cat /proc/cpuinfo| grep "cpu cores"| uniq

  # 查看逻辑CPU的个数
  cat /proc/cpuinfo| grep "processor"| wc -l

当然可以启动多个端口,一个端口号对应一个服务,这样的话就需要nignx来做负载均衡了。

创建账户nadmin

$ useradd nadmin

pm2 start app.js -i 0 #根据CPU核数启动进程个数

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

图片 7 图片 8

1 赞 7 收藏 评论

2. 是否需要nginx

nginx可以做的事情主要有两个:

  1. 反向代理,实现简单的负载均衡: 如果有多台服务器或者一台服务器多个端口,可以考虑用nginx。

  2. 静态资源缓存:把一些静态资源(如静态页面,js等资源文件)放到nginx里,可以极大的提高服务的性能。

安装node和npm

安装步骤1的目录和命令,解压软件 node-v6.9.1-linux-x64.tar.gz

(注:npm会在安装node的时候一起安装)

$ tar -xvf node-v6.9.1-linux-x64.tar.gz

添加node_home到环境变量,用root账户修改/etc/profile

$vim /etc/profile          #追加
NODE_HOME=/opt/software/node-v6.9.1-linux-x64
PATH=$PATH:$NODE_HOME/bin

source 使配置生效

$ source /etc/profile

配置生效之后,在任意地方可查看版本如下:

1 $ node -v
2 v6.9.1
3 $ npm -v
4 3.10.8  

pm2 start app.js --watch #实时监控app.js的方式启动,当app.js文件有变动时,pm2会自动reload

  1. 查看进程

关于作者:pangjian

图片 9

庞健,金融IT男。 个人主页 · 我的文章 · 5 ·   

图片 10

3. 自动化部署

通过shell脚本实现资源拉取、服务重启、nginx缓存更新等操作,再配合pm2的监控功能,就初步达到了一个后端工程部署的标配了。

配置npm

先查看npm的配置文件地址

$npm config get userconfig
/home/nadmin/.npmrc

修改此配置文件,修改后查看,内容如下

$ cat /home/nadmin/.npmrc
proxy=http://网络代理ip:8080/
https-proxy=http://网络代理ip:8080/
no_proxy=本地yum源ip
registry=https://registry.npm.taobao.org/

也可通过命令设置http网络代理地址和npm server的地址,如下:

$ npm config set proxy 

$ npm config set https-proxy 

$ npm config set registry ""

由于上步骤npm已经安装配置完毕,所以下面的安装软件可以通过npm命令进行

pm2 list

参考资料:

  1. pm2官网

  2. node-deploy-practice

  3. pm2监控

pm2是非常优秀工具,它提供对基于node.js的项目运行托管服务。它基于命令行界面,提供很多特性: 内置的负载均衡器等等,下面我们就一起来看看吧。

一、简介

pm2是一个带有负载均衡功能的应用进程管理器,类似有Supervisor,forever。

二、安装

Linux Binaries下载地址:https://nodejs.org/dist
cd oneinstack/src
wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-x64.tar.gz
tar xzf node-v4.2.4-linux-x64.tar.gz
cp node-v4.2.4-linux-x64/bin/node /usr/local/bin/
cp -R node-v4.2.4-linux-x64/lib/node_modules /usr/local/lib/
ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm
npm install pm2@latest -g #安装最新版本pm2模块
PS: 如果你的主机无法连接公网,先找到能连公网的主机安装上面的方法安装pm2,然后拷贝到你要安装的主机。拷贝如下目录:
/usr/local/bin/node
/usr/local/lib/node_modules
再创建相关软连接

三、PM2常用命令

假设你现在已经写好了一个app.js的文件,需要启动,你可以使用pm2进行管理

  1. 启动

安装sinopia

$npm install -g sinopia

pm2 show 0 或者 # pm2 info 0 #查看进程详细信息,0为PM2进程id

  1. 监控

pm2 start app.js

配置sinopia

Sinopia的特点是,你在哪个目录运行,它的就会在对应的目录下创建自己的文件。目录下默认有两个文件:config.yaml和storage,htpasswd 是添加用户之后自动创建的

由于每次启动默认的config.xml文件是从原始文件default.yaml拷贝而来,可先修改sinopia原始的default.yaml

地址:sinopia安装目录/conf/ default.yaml

查看

$ pwd
/opt/software/node-v6.9.1-linux-x64/lib/node_modules/sinopia/conf
$ ll
total 12
-rw-rw-r-- 1 nadmin nadmin 1309 Nov 9 19:52 default.yaml
-rw-rw-r-- 1 nadmin nadmin 4076 Jun 7 2015 full.yaml
-rw-rw-r-- 1 nadmin nadmin   39 Jun 7 2015 README.md

修改完毕,内如下:

storage: ./storage
auth:
htpasswd:
   file: /home/nadmin/node_htpasswd
uplinks:
npmjs:
   url: http://registry.npm.taobao.org/
packages:
'@*/*':
   access: $all
   publish: $authenticated
'*':
   access: $all
   publish: $authenticated
   proxy: npmjs
logs:
- {type: stdout, format: pretty, level: http}
listen: 0.0.0.0:4873
http_proxy: http://代理服务器ip:8080
https_proxy: http://代理服务器ip:8080

pm2 monit

  1. 停止

pm2 start app.js --name my-api #my-api为PM2进程名称

启动 sinopia

在规划好的启动目录下执行命令sinopia

$ pwd
/home/nadmin
$ sinopia
warn --- config file - /home/nadmin/sinopia/config.yaml
warn --- http address - http://0.0.0.0:4873/
http --> 200, req: 'GET http://registry.npm.taobao.org/express', bytes: 0/578356
http <-- 200, user: admin, req: 'GET /express', bytes: 0/34448
http --> 200, req: 'GET http://registry.npm.taobao.org/type-is', bytes: 0/54083

sinopia已经启动,可正常使用,此种方法日志会输出到控制台,不建议使用,后面会介绍使用pm2对sinopia进程进行托管启动的方法。

访问 查看页面,看到如下页面,说明sinopia安装成功!

图片 11

pm2 stop all #停止PM2列表中所有的进程

pm2 start app.js -i 0 #根据CPU核数启动进程个数

安装pm2

$npm install -g pm2

使用pm2启动sinopia

$ pm2 start sinopia
[PM2] Applying action restartProcessId on app [sinopia](ids: 0)
[PM2] [sinopia](0) ✓
[PM2] Process successfully started

使用pm2托管的进程可以保证进程永远是活着的,尝试通过kill -9去杀sinopia的进程发现杀了之后又自动启起来。推荐使用此种方式启动sinopia.

 

pm2 开机自启动sinopia

pm2 startup centos,根据提示用root账户执行:

# su -c "env PATH=$PATH:/opt/software/node-v6.9.1-linux-x64/bin pm2 startup centos -u nadmin --hp /home/nadmin"

pm2 启动sinopia 4个进程,且保存日志

$ pm2 start sinopia -i 4 --watch --merge-logs --log-date-format="YYYY-MM-DD HH:mm: Z" -l /opt/log/sinopia.log

保存当前配置,开机自启动时按照此时配置启动

$ pm2 save

 

pm2 stop 0 #停止PM2列表中进程为0的进程

  1. 重载

pm2 start app.js --watch #实时监控app.js的方式启动,当app.js文件有变动时,pm2会自动reload

  1. 查看进程

安装nrm

nrm是 npm registry 管理工具, 能够查看和切换当前使用的registry。不安装也可以。

$npm install -g nrm

$ nrm ls
  npm ---- https://registry.npmjs.org/
  cnpm --- http://r.cnpmjs.org/
* taobao - https://registry.npm.taobao.org/
  nj ----- https://registry.nodejitsu.com/
  rednpm - http://registry.mirror.cqupt.edu.cn/
  npmMirror  https://skimdb.npmjs.com/registry/
  edunpm - http://registry.enpmjs.org/
  mytestnpm  http://ServerS:4873/  

使用命令

$ nrm add XXXXX # 添加本地的npm镜像地址

$ nrm use XXXX # 使用本址的镜像地址

pm2 reload all #重载PM2列表中所有的进程

pm2 list

3.验证

在客户端ServerC假设使用者已经安装npm/nrm并且已经正确配置

pm2 reload 0 #重载PM2列表中进程为0的进程

  1. 重启

pm2 show 0 或者 # pm2 info 0 #查看进程详细信息,0为PM2进程id

  1. 监控

1>npm install

现在验证使用刚刚搭建好的sinopia npm库(

修改npm的访问代理为刚刚搭建好的

# cat .npmrc
registry=http://serverS:4873/

执行安装express的命令

$npm install express  

安装成功!

pm2 restart all #重启PM2列表中所有的进程

pm2 monit

  1. 停止

2>npm publish

本地如果有可用来发布的模块可以直接用,本地没有,使用npm init根据提示创建一个。

初始化创建一个模块

$npm init  

如果需要登录才能publish则登录

运行npm adduser注册账号,如果已经有账号直接运行 npm login

登录成功时可通过npm whoami查看

执行发布

# npm publish chenyu/
+ chenyu@1.0.0

去serverS查看刚刚publish的模块:成功!

 图片 12

pm2 restart 0 #重启PM2列表中进程为0的进程

  1. 删除PM2进程

pm2 stop all #停止PM2列表中所有的进程

4.安装过程的一些报错和解决办法

pm2 delete 0 #删除PM2列表中进程为0的进程

pm2 stop 0 #停止PM2列表中进程为0的进程

  1. 重载

1>注册账号失败Incorrect username or password

npm set registry http://ServerS:4873

npm adduser --registry http://Servers:4873

报错:Incorrect username or password

解决办法:把.npmrc中的网络代理proxy/ https-proxy去掉即可。

pm2 delete all #删除PM2列表中所有的进程

  1. 日志操作

pm2 reload all #重载PM2列表中所有的进程

2>在Client端使用新搭建的npm库安装软件的时候,报404错误

检查后发现,Server端的npm的.npmrc中和sinopia的config.yaml中上网代理未设置,加上后即可。

 

pm2 logs [--raw] #Display all processes logs in streaming

pm2 reload 0 #重载PM2列表中进程为0的进程

  1. 重启

5.附录(npm、pm2等的使用方法)

pm2 flush #Empty all log file

pm2 restart all #重启PM2列表中所有的进程

config.xml文件详解:

config.yaml是sinopia的配置文件

pm2 reloadLogs #Reload all logs

  1. 升级PM2

pm2 restart 0 #重启PM2列表中进程为0的进程

  1. 删除PM2进程

1>其常用的配置

storage: 仓库保存的地址,publish时仓库保存的地址。

auth: htpasswd file:账号密码的文件地址,初始化时不存在,可指定需要手工创建。

               max_users:默认1000,为允许用户注册的数量。

                    为-1时,不允许用户通过npm adduser注册。

                  但是,当为-1时,可以通过直接编写htpasswd file内容的方式添加用户。

语法:用户名:{SHA}哈希加密的字符=:autocreated 时间

加密算法:SHA1哈稀之后再转换成 Base64 输出就好

 

uplinks: 配置上游的npm服务器,主要用于请求的仓库不存在时到上游服务器去拉取。

packages: 配置模块。access访问下载权限,publish包的发布权限。

      格式如下:

scope:

          权限操作

 scope:两种模式

一种是 @*/* 表示某下属的某项目

  另一种是 * 匹配项目名称(名称在package.json中有定义)

 权限:

l  access: 表示哪一类用户可以对匹配的项目进行安装(install)

l  publish: 表示哪一类用户可以对匹配的项目进行发布(publish)

l  proxy: 如其名,这里的值是对应于 uplinks 的名称,如果本地不存在,允许去对应的uplinks去取。

  操作:

l  $all 表示所有人(已注册、未注册)都可以执行对应的操作

l  $authenticated 表示只有通过验证的人(已注册)可以执行对应操作,注意,任何人都可以去注册账户。

l  $anonymous 表示只有匿名者可以进行对应操作(通常无用)

l  或者也可以指定对应于之前我们配置的用户表 htpasswd 中的一个或多个用户,这样就明确地指定哪些用户可以执行匹配的操作

 

listen:配置监听端口和主机名。

       localhost:4873 #默认

       0.0.0.0:4873 #在所有网卡监听

代理:

#http_proxy:   #http代理

#https_proxy:   #https代理

#no_proxy: localhost,127.0.0.1  #不适用代理的iP

修改了配置文件后,运行命令

$ sinopia -c config.yml

npm install pm2@lastest -g #安装最新的PM2版本

pm2 delete 0 #删除PM2列表中进程为0的进程

2>附录github中比较全的配置和说明

#仓库
# path to a directory with all packages
storage: ./storage

# a list of users
#
# This could be deprecated soon, use auth plugins instead (see htpasswd below).
users:
  admin:
    # crypto.createHash('sha1').update(pass).digest('hex')
    password: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

#是否支持web接口
web:
  # web interface is disabled by default in 0.x, will be enabled soon in 1.x
  # when all its issues will be fixed
  #
  # set this to `true` if you want to experiment with web ui now;
  # this has a lot of issues, e.g. no auth yet, so use at your own risk
  #enable: true

  title: Sinopia
  # logo: logo.png
  # template: custom.hbs

auth:
  htpasswd:
    file: ./htpasswd
    # Maximum amount of users allowed to register, defaults to "+inf".
    # You can set this to -1 to disable registration.
    #max_users: 1000

# a list of other known repositories we can talk to
#上游npm服务器配置
uplinks:
  npmjs:
    url: https://registry.npmjs.org/

#设置请求无应答超时时间
    # amount of time to wait for repository to respond
    # before giving up and use the local cached copy
    #timeout: 30s

#设置数据认为最新的时间为2分钟,2分钟同一个数据的请求不会向上游服务器请求
    # maximum time in which data is considered up to date
    #
    # default is 2 minutes, so server won't request the same data from
    # uplink if a similar request was made less than 2 minutes ago
    #maxage: 2m

#设置访问失败达到某次数,就停止一段时间不访问上游服务器,默认是2次不应答,5分钟不去请求
    # if two subsequent requests fail, no further requests will be sent to
    # this uplink for five minutes
    #max_fails: 2
    #fail_timeout: 5m

    # timeouts are defined in the same way as nginx, see:
    # http://wiki.nginx.org/ConfigNotation

#包权限配置
packages:
  # uncomment this for packages with "local-" prefix to be available
  # for admin only, it's a recommended way of handling private packages
  #'local-*':
  #  access: admin
  #  publish: admin
  #  # you can override storage directory for a group of packages this way:
  #  storage: 'local_storage'

  '*':
    # allow all users to read packages (including non-authenticated users)
    #
    # you can specify usernames/groupnames (depending on your auth plugin)
    # and three keywords: "$all", "$anonymous", "$authenticated"
    access: $all

    # allow 'admin' to publish packages
    publish: admin

#如果包本地不存在,则去npmjs去请求
    # if package is not available locally, proxy requests to 'npmjs' registry
    proxy: npmjs

#####################################################################
# Advanced settings
#####################################################################

# if you use nginx with custom path, use this to override links
#url_prefix: https://dev.company.local/sinopia/

# You can specify listen address (or simply a port).
# If you add multiple values, sinopia will listen on all of them.
#
# Examples:
#
#listen:
# - localhost:4873            # default value
# - http://localhost:4873     # same thing
# - 0.0.0.0:4873              # listen on all addresses (INADDR_ANY)
# - https://example.org:4873  # if you want to use https
# - [::1]:4873                # ipv6
# - unix:/tmp/sinopia.sock    # unix socket

#https证书配置(listen需要设置成https)
# Configure HTTPS, it is required if you use "https" protocol above.
#https:
#  key: path/to/server.key
#  cert: path/to/server.crt

# type: file | stdout | stderr
# level: trace | debug | info | http (default) | warn | error | fatal
#
# parameters for file: name is filename
#  {type: 'file', path: 'sinopia.log', level: 'debug'},
#
# parameters for stdout and stderr: format: json | pretty
#  {type: 'stdout', format: 'pretty', level: 'debug'},
logs:
  - {type: stdout, format: pretty, level: http}
  #- {type: file, path: sinopia.log, level: info}

#代理设置
# you can specify proxy used with all requests in wget-like manner here
# (or set up ENV variables with the same name)
#http_proxy: http://something.local/
#https_proxy: https://something.local/
#no_proxy: localhost,127.0.0.1

#设置json文档大小上限
# maximum size of uploaded json document
# increase it if you have "request entity too large" errors
#max_body_size: 1mb

# Workaround for countless npm bugs. Must have for npm <1.14.x, but expect
# it to be turned off in future versions. If `true`, latest tag is ignored,
# and the highest semver is placed instead.
#ignore_latest_tag: false

pm2 updatePM2 #升级pm2

  1. 更多命令参数请查看帮助

pm2 delete all #删除PM2列表中所有的进程

  1. 日志操作

npm常见使用命令

pm2 --help

四、PM2目录结构

默认的目录是:当前用于的家目录下的.pm2目录(此目录可以自定义,请参考:五、自定义启动文件),详细信息如下:
$HOME/.pm2 #will contain all PM2 related files
$HOME/.pm2/logs #will contain all applications logs
$HOME/.pm2/pids #will contain all applications pids
$HOME/.pm2/pm2.log #PM2 logs
$HOME/.pm2/pm2.pid #PM2 pid
$HOME/.pm2/rpc.sock #Socket file for remote commands
$HOME/.pm2/pub.sock #Socket file for publishable events
$HOME/.pm2/conf.js #PM2 Configuration

五、自定义启动文件

创建一个test.json的示例文件,格式如下:
{
"apps":
{
"name": "test",
"cwd": "/data/wwwroot/nodejs",
"script": "./test.sh",
"exec_interpreter": "bash",
"min_uptime": "60s",
"max_restarts": 30,
"exec_mode" : "cluster_mode",
"error_file" : "./test-err.log",
"out_file": "./test-out.log",
"pid_file": "./test.pid"
"watch": false
}
}

说明:

apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
name:应用程序的名称
cwd:应用程序所在的目录
script:应用程序的脚本路径
exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)
exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
error_file:自定义应用程序的错误日志文件
out_file:自定义应用程序日志文件
pid_file:自定义应用程序的pid文件
watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。
详细参数列表:见附件八

六、实例

已上面的test.json为例

pm2 logs [--raw] #Display all processes logs in streaming

1>常用命令

npm install XX :本地安装,安装到当前的目录中

npm install –g XX :模块将被安装到【全局目录】

查看全局目录npm config get prefix

设置全局目录npm config set prefix XXX

查看缓存目录npm config get cache

设置缓存目录npm cofnig set cache XXX

一般采用全局安装,方便管理、结构清晰还可以重复利用

 

其他命令如下:

npm install <name>安装nodejs的依赖包

例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本,如npm install express@3.0.6

npm install <name> -g  将包安装到全局环境中

但是代码中,直接通过require()的方式是没有办法调用全局安装的包的。全局的安装是供命令行使用的,就好像全局安装了vmarket后,就可以在命令行中直接运行vm命令

npm install <name> --save  安装的同时,将信息写入package.json中

项目路径中如果有package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包

这样代码提交到github时,就不用提交node_modules这个文件夹了。

npm init  会引导你创建一个package.json文件,包括名称、版本、作者这些信息等

npm remove <name>移除

npm update <name>更新

npm ls 列出当前路径下安装的了所有包

npm root 查看当前包的安装路径

npm root -g  查看全局的包的安装路径

npm help  帮助,如果要单独查看install命令的帮助,可以使用的npm help install

npm config get cache 查看npm的缓存目录

下过的包都在里面,比如刚刚下载的loadash

cat > /data/wwwroot/nodejs/test.sh << EOF

pm2 flush #Empty all log file

2>关于npm缓存目录的一些记录

npm安装的模块有两个缓存目录:
默认*inux和mac下是在用户主目录下的.npm目录下,通过npm config get cache 可以查看。window下则在%AppData%/npm-cache 目录下。

该目录下的模块结构为.npm/module_name/module_version/这种方式命名。

值得注意的是,执行npm install命令的时候npm只会检查node_modules中是否存在该模块,如果没有则会去registry下载,无论.npm文件夹下是否存在。这也是install速度慢的一个原因。

解决办法使用npm install --cache-min <整数时间> <package-name>;
这个命令的意思是从缓存中进行安装,只有再超过参数时间的时候才从regitry上安装。但内在也进行了一次与registry的交互,只是交互的etag属性,服务器返回304表示没有更新不需要下载

另外也可以将缓存目录设置成node_modules目录。

!/bin/bash

while :
do
echo "Test" >> 1.log
sleep 5
done
EOF

pm2 reloadLogs #Reload all logs

  1. 升级PM2

pm2命令详解

pm2是开源的基于Nodejs的进程管理器。包括进程、日志、监控的一整套完整功能。它带有负载均衡功能,当你要把你的独立代码资源利用全部的服务器所有cpu,保证进程永远都是活着的,0秒的重载,PM2是完美的。

常用的命令介绍:

以下是pm2常用的命令行

$ pm2 start app.js              # 启动app.js应用程序

$ pm2 start app.js -i 4         # cluster mode 模式启动4个app.js的应用实例

                                # 4个应用程序会自动进行负载均衡

                               

$ 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 [app-name]           # 显示应用程序的所有信息

 

$ pm2 logs                      # 显示所有应用程序的日志

$ pm2 logs [app-name]           # 显示指定应用程序的日志

$ pm2 flush

 

$ pm2 stop all                  # 停止所有的应用程序

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

$ pm2 restart all               # 重启所有应用

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

$ pm2 gracefulReload all        # Graceful reload all apps in cluster mode

$ pm2 delete all                # 关闭并删除所有应用

$ pm2 delete 0                  # 删除指定应用 id 0

$ 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 deploy app.json prod setup    # Setup "prod" remote server

$ pm2 deploy app.json prod          # Update "prod" remote server

$ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2

 

$ pm2 module:generate [name]    # Generate sample module with name [name]

$ pm2 install pm2-logrotate     # Install module (here a log rotation system)

$ pm2 uninstall pm2-logrotate   # Uninstall module

$ pm2 publish                   # Increment version, git push and npm publish

命令验证:

停止sinopia:

$ pm2 stop sinopia

 

启动sinopia:

$ pm2 start sinopia

重启 sinopia:

$ pm2 retart sinopia

 

显示 sinopia 的log:

$ pm2 logs sinopia

chmod +x test.sh #添加执行权限

npm install pm2@lastest -g #安装最新的PM2版本

6.参考文档

 

pm2 start test.json #启动,如下图:

[图片上传失败...(image-680e62-1511421667535)]

pm2 updatePM2 #升级pm2

  1. 更多命令参数请查看帮助

pm2 list #查看pm2进程,如下图:

[图片上传失败...(image-20bc39-1511421667535)]

七、备注
其他可参数见官网:http://pm2.keymetrics.io
安装:npm install -g pm2
启动程序:pm2 start <app_name|id|all>
列举进程:pm2 list
退出程序:pm2 stop <app_name|id|all>
重起应用:pm2 restart
程序信息:pm2 describe id|all
监控:pm2 monit
实时集中log处理: pm2 logs
API:pm2 web (端口:9615 )

pm2 --help

四、PM2目录结构

默认的目录是:当前用于的家目录下的.pm2目录(此目录可以自定义,请参考:五、自定义启动文件),详细信息如下:
$HOME/.pm2 #will contain all PM2 related files
$HOME/.pm2/logs #will contain all applications logs
$HOME/.pm2/pids #will contain all applications pids
$HOME/.pm2/pm2.log #PM2 logs
$HOME/.pm2/pm2.pid #PM2 pid
$HOME/.pm2/rpc.sock #Socket file for remote commands
$HOME/.pm2/pub.sock #Socket file for publishable events
$HOME/.pm2/conf.js #PM2 Configuration

五、自定义启动文件

创建一个test.json的示例文件,格式如下:
{
"apps":
{
"name": "test",
"cwd": "/data/wwwroot/nodejs",
"script": "./test.sh",
"exec_interpreter": "bash",
"min_uptime": "60s",
"max_restarts": 30,
"exec_mode" : "cluster_mode",
"error_file" : "./test-err.log",
"out_file": "./test-out.log",
"pid_file": "./test.pid"
"watch": false
}
}

说明:

apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
name:应用程序的名称
cwd:应用程序所在的目录
script:应用程序的脚本路径
exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)
exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
error_file:自定义应用程序的错误日志文件
out_file:自定义应用程序日志文件
pid_file:自定义应用程序的pid文件
watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。
详细参数列表:见附件八

六、实例

已上面的test.json为例

cat > /data/wwwroot/nodejs/test.sh << EOF

!/bin/bash

while :
do
echo "Test" >> 1.log
sleep 5
done
EOF

chmod +x test.sh #添加执行权限

pm2 start test.json #启动,如下图:

[图片上传失败...(image-291475-1511349583307)]

pm2 list #查看pm2进程,如下图:

[图片上传失败...(image-1f3f2c-1511349583307)]

七、备注
其他可参数见官网:http://pm2.keymetrics.io

====================================================================================================================

安装:npm install -g pm2

启动程序:pm2 start <app_name|id|all>

列举进程:pm2 list

退出程序:pm2 stop <app_name|id|all>

重起应用:pm2 restart

程序信息:pm2 describe id|all

监控:pm2 monit

实时集中log处理: pm2 logs

API:pm2 web (端口:9615 )

<pre>

使用PM2来部署nodejs项目。

如果直接通过node app来启动,如果报错了可能直接停在整个运行,supervisor感觉只是拿来用作开发环境的。再网上找到pm2.目前似乎最常见的线上部署nodejs项目的有forever,pm2这两种。
使用场合:

  • supervisor是开发环境用。

  • forever管理多个站点,每个站点访问量不大,不需要监控。

  • pm2 网站访问量比较大,需要完整的监控界面。

PM2的主要特性:

  • 内建负载均衡(使用Node cluster 集群模块)

  • 后台运行

  • 0秒停机重载,我理解大概意思是维护升级的时候不需要停机.

  • 具有Ubuntu和CentOS 的启动脚本

  • 停止不稳定的进程(避免无限循环)

  • 控制台检测

  • 提供 HTTP API

  • 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

安装

npm install -g pm2

用法

$ npm install -g pm2 命令行全局安装pm2
$ pm2 start app.js 启动app项目
$ pm2 list 列出由pm2管理的所有进程信息,还会显示一个进程会被启动多少次,因为没处理的异常。

图片 13

image

$ pm2 monit 监视每个node进程的CPU和内存的使用情况

图片 14

image

$ pm2 logs 显示所有进程日志
$ 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 start app.js -i max 根据有效CPU数目启动最大进程数目
$ pm2 start app.js -i 3 启动3个进程
$ pm2 start app.js -x 用fork模式启动 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23 用fork模式启动 app.js 并且传递参数 (-a 23)
$ pm2 start app.js --name serverone 启动一个进程并把它命名为 serverone
$ pm2 stop serverone 停止 serverone 进程
$ 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启动文件

在项目根目录添加一个processes.json:
内容如下:

{
  "apps": [
    {
      "name": "mywork",
      "cwd": "/srv/node-app/current",
      "script": "bin/www",
      "log_date_format": "YYYY-MM-DD HH:mm Z",
      "error_file": "/var/log/node-app/node-app.stderr.log",
      "out_file": "log/node-app.stdout.log",
      "pid_file": "pids/node-geo-api.pid",
      "instances": 6,
      "min_uptime": "200s",
      "max_restarts": 10,
      "max_memory_restart": "1M",
      "cron_restart": "1 0 * * *",
      "watch": false,
      "merge_logs": true,
      "exec_interpreter": "node",
      "exec_mode": "fork",
      "autorestart": false,
      "vizion": false
    }
  ]
}

说明:

  • apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用

  • name:应用程序名称

  • cwd:应用程序所在的目录

  • script:应用程序的脚本路径

  • log_date_format:

  • error_file:自定义应用程序的错误日志文件

  • out_file:自定义应用程序日志文件

  • pid_file:自定义应用程序的pid文件

  • instances:

  • min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量

  • max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)

  • cron_restart:定时启动,解决重启能解决的问题

  • watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。

  • merge_logs:

  • exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs

  • exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork

  • autorestart:启用/禁用应用程序崩溃或退出时自动重启

  • vizion:启用/禁用vizion特性(版本控制)

可以通过pm2 start processes.json来启动。
也可以把命令写在package.json里。如下:

图片 15

image

pm2 是一个带有负载均衡功能的Node应用的进程管理器.

当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的。它非常适合IaaS结构,但不要把它用于PaaS方案(随后将开发Paas的解决方案).

备注:SaaS、PaaS和IaaS是云服务模式。
SaaS 软件即服务,例如Google的 Gmail 邮箱服务.面向应用型用户.
PaaS 平台即服务.例如Google的GAE,面向开发型用户
IaaS 基础架构即服务,例如亚马逊的AWS,IaaS对于不知道新推出的应用程序/网站会有多成功的创业公司来说非常有用

请参考
云服务模式:SaaS、PaaS和IaaS,哪一种适合你?

主要特性:

内建负载均衡(使用Node cluster 集群模块)

后台运行

0秒停机重载,我理解大概意思是维护升级的时候不需要停机.

具有Ubuntu和CentOS 的启动脚本

停止不稳定的进程(避免无限循环)

控制台检测

提供 HTTP API

远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

测试过Nodejs v0.11 v0.10 v0.8版本,兼容CoffeeScript,基于Linux 和MacOS.

安装

npm install -g pm2

用法

$ npm install pm2 -g # 命令行安装 pm2

$ pm2 start app.js -i 4 #后台运行pm2,启动4个app.js

                            # 也可以把'max' 参数传递给 start

                            # 正确的进程数目依赖于Cpu的核心数目

$ pm2 start app.js --name my-api # 命名进程

$ pm2 list # 显示所有进程状态

$ pm2 monit # 监视所有进程

$ pm2 logs # 显示所有进程日志

$ 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 start app.js -i max # 根据有效CPU数目启动最大进程数目

$ pm2 start app.js -i 3 # 启动3个进程

$ pm2 start app.js -x #用fork模式启动 app.js 而不是使用 cluster

$ pm2 start app.js -x -- -a 23 # 用fork模式启动 app.js 并且传递参数 (-a 23)

$ pm2 start app.js --name serverone # 启动一个进程并把它命名为 serverone

$ pm2 stop serverone # 停止 serverone 进程

$ 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 # 启动 并 生成一个配置文件

你也可以执行用其他语言编写的app ( fork 模式):

$ pm2 start my-bash-script.sh -x --interpreter bash

$ pm2 start my-python-script.py -x --interpreter python

0秒停机重载:

这项功能允许你重新载入代码而不用失去请求连接。

注意:

仅能用于web应用

运行于Node 0.11.x版本

运行于 cluster 模式(默认模式)

$ pm2 reload all

CoffeeScript:

$ pm2 start my_app.coffee #这就是全部

PM2准备好为产品级服务了吗?

只需在你的服务器上测试

$ git clone

https://github.com/Unitech/pm2.git

$ cd pm2

$ npm install # 或者 npm install --dev ,如果devDependencies 没有安装

$ npm test

pm2 list

列出由pm2管理的所有进程信息,还会显示一个进程会被启动多少次,因为没处理的异常。

|

图片 16

image

|
| |

pm2 monit

监视每个node进程的CPU和内存的使用情况。

|

图片 17

image

|

本文由9159.com发布于前端,转载请注明出处:但是bower的市场兼容性明显没有npm强壮,未经作者

关键词:

上一篇:因为 Node.js 在重启以后
下一篇:没有了