PM2 是 node 进程管理工具,包括守护进程、监控、日志等一套完整的功能
npm install pm2 -g
首先要有一个可以启动的 node 文件
const http = require('http');
http
.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('this is test vi');
})
.listen(8081);
console.log('server runing on http://47.xx.139.xx:8081');
# 简单启动 默认会生成一个 名为 app 的应用运行在对应端口8081
pm2 start app.js
# 启动的同时监听文件变化,发生改变后自动重启 (--watch)
pm2 start app.js --watch
# 负载均衡启动多个实例 (-i num) num 可以是指定数字或者是 max 表示根据当前机器内核数确定
pm2 start app.js -i max --watch
# 自定义应用名称 (-n xxx)
pm2 start app.js -i max --watch -n app-2 # 开启 App Name 为 app-2 的应用
# 定义标准输出日志路径和错误日志输出路径
pm2 start app.js -o ./logs/out.log -e ./logs/error.log
# appName 和 appId 可以通过 pm2 list 查看
pm2 stop appName|appId
# 停止所有应用
pm2 stop all
pm2 restart app.js #
# 停止后可以通过 restart 重启,删除后不能重启
pm2 delete appName|appId
pm2 list
pm2 show appName|appId
pm2 logs appName|appId
pm2 monit
# 根目录下编写配置文件
module.exports = {
apps: [ // apps 中可以配置多个应用
{
name: 'express-demo', // 应用名称
script: 'app.js', // 启动脚本
cwd: './', // 当前工作路径
watch: true, // 监控变化的目录
exec_mode: 'cluster', // 集群模式
instances: 'max', // 实例数量
max_memory_restart: '40M', // 如果超过指定内存就重启
ignore_watch: [ // 从监控目录中排除
'node_modules',
'logs'
],
error_file: './logs/app-err.log', // 错误日志路径
out_fileL: './logs/app-out.log', // 普通日志路径
env: { // 默认环境变量
NODE_ENV: 'production' // 环境变量
},
env_dev: { // 命令行可以指定当前环境变量为dev
NODE_ENV: 'development'
},
env_prod: {
NODE_ENV: 'production'
}
}
],
// deploy: {} 部署配置
}
# 命令行启动即可
pm2 start ecosystem.config.js --env dev
更多配置官网查看
步骤:通过本地 pm2 工具在本地命令行登录服务器,然后通知服务器从 git 仓库将代码clone 到服务器部署到相应文件夹,然后等待进一步操作
# server
# 依次执行
ssh-keygen -t rsa -b 4096 -C "[email protected]" 一路回车
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub # 显示公钥
# 将公钥复制到第三方 git 平台
// local
module.exports = {
apps: [
{
name: 'express-demo', // 应用名称
script: 'app.js', // 启动脚本
cwd: './', // 当前工作路径
watch: true, // 监控变化的目录
exec_mode: 'cluster', // 集群模式
instances: 'max', // 实例数量
max_memory_restart: '40M', // 如果超过指定内存就重启
ignore_watch: [ // 从监控目录中排除
'node_modules',
'logs'
],
error_file: './logs/app-err.log', // 错误日志路径
out_fileL: './logs/app-out.log', // 普通日志路径
env: { // 默认环境变量
NODE_ENV: 'production' // 环境变量
},
env_dev: { // 命令行可以指定当前环境变量为dev
NODE_ENV: 'development'
},
env_prod: {
NODE_ENV: 'production'
}
}
],
deploy: { // 部署配置
prod: { // 对应环境名称
user: 'mjz',
host: ['47.94.139.47'], // 要部署的服务器IP
port: '39999', // 端口号
path: '/www/website', // 克隆到服务器上的路径
repo: '[email protected]:mjzhang/node-website.git', // 仓库地址
ref: 'origin/master', // 代码仓库的分支
ssh_options: 'StrictHostKeyChecking=no', // 取消 key 校验
'post-deploy': 'npm install && pm2 startOrRestart ecosystem.config.js --env prod'
env: {
NODE_ENV: 'production'
}
}
}
}
# local
git add .
git commit -m 'xxx'
git push origin master
# server
# 创建 /www/website
cd /www
sudo chmod 777 website # 修改文件夹权限为可读可写,否则下一步会报错--没有修改权限
pm2 deploy ecosystem.config.js prod setup
部署成功后 /www/website 多了一下三个文件夹
配置文件 ecosystem.config.js 中的
'post-deploy': 'npm install && pm2 startOrRestart ecosystem.config.js --env prod'
可以使得代码克隆到服务器后就运行
git add . && git commit -m 'xxx' && git push origin master
pm2 deploy ecosystem.config.js prod
pm2 monit