nodejs安排形式,编程基础

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"
 
  },

使用pm2nodejs安排形式,编程基础。大家可以在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下载地址:htt美高梅开户网址 ,ps://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 软件即服务,例如谷歌的 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

|

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图