Linux环境下使用PM2和脚本自动部署博客完整教程

本教程将教你如何在Linux服务器上使用PM2进程管理工具和自动化脚本,实现博客项目的一键部署和后台运行。

🎯 教程目标

  • 掌握PM2进程管理工具的使用
  • 学会编写自动化部署脚本
  • 实现博客项目的一键部署和重启
  • 配置开机自启动和健康检查

📋 前置条件

  • Linux服务器(Ubuntu/CentOS等)
  • Node.js环境已安装
  • Git仓库已配置
  • 具备基本的Shell脚本知识

第一部分:PM2进程管理器配置

1. 安装PM2

1
2
3
4
5
# 全局安装PM2
npm install pm2 -g

# 验证安装
pm2 --version

2. PM2基本使用

启动应用

1
2
3
4
5
# 方式1:直接启动脚本文件
pm2 start app.js --name "blog"

# 方式2:通过npm脚本启动
pm2 start npm --name "blog" -- run start

查看应用状态

1
pm2 list

你会看到类似输出:

1
2
3
4
5
┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │
├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┤
│ 0 │ blog │ default │ N/A │ fork │ 12345 │ 2d │ 0 │ online │ 0% │ 30.5mb │ root │
└─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┘

其他常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 停止应用
pm2 stop blog

# 重启应用
pm2 restart blog

# 删除应用
pm2 delete blog

# 查看日志
pm2 logs blog

# 实时监控
pm2 monit

3. 配置开机自启动

1
2
3
4
5
# 生成开机启动脚本
pm2 startup

# 保存当前进程列表
pm2 save

第二部分:创建自动化部署脚本

1. 创建部署脚本

创建 deploy.sh 文件:

1
vim deploy.sh

2. 脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/bin/bash

# 自动化部署脚本
# 使用方法: ./deploy.sh [服务名] [分支名]

# 配置参数
SERVICE_NAME=${1:-"blog"} # 默认服务名为 blog
BRANCH=${2:-"main"} # 默认分支为 main
LOG_FILE="deploy.log"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log() {
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a $LOG_FILE
}

success() {
echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a $LOG_FILE
}

error() {
echo -e "${RED}[ERROR]${NC} $1" | tee -a $LOG_FILE
}

warning() {
echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a $LOG_FILE
}

# 错误处理
handle_error() {
error "部署失败,退出码: $1"
error "请检查日志文件: $LOG_FILE"
exit $1
}

# 设置错误时自动退出
set -e
trap 'handle_error $?' ERR

log "开始自动化部署..."
log "服务名: $SERVICE_NAME"
log "分支: $BRANCH"

# 1. 检查 Git 状态
log "检查 Git 仓库状态..."
if [ ! -d ".git" ]; then
error "当前目录不是 Git 仓库"
exit 1
fi

# 2. 暂存本地修改(如果有)
if ! git diff --quiet; then
warning "检测到本地修改,正在暂存..."
git stash push -m "Auto stash before deploy $(date)"
fi

# 3. 拉取最新代码
log "拉取最新代码 (分支: $BRANCH)..."
git fetch origin
git checkout $BRANCH
git pull origin $BRANCH

success "代码拉取完成"

# 4. 安装依赖
log "安装 npm 依赖..."
if [ -f "package-lock.json" ]; then
npm ci # 更快且更可靠
else
npm install
fi

success "依赖安装完成"

# 5. 运行构建(如果需要)
if [ -f "package.json" ] && grep -q "\"build\":" package.json; then
log "运行构建脚本..."
npm run build
success "构建完成"
fi

# 6. 检查 PM2 服务状态
log "检查 PM2 服务状态..."
if pm2 list | grep -q "$SERVICE_NAME"; then
log "重启 PM2 服务: $SERVICE_NAME"
pm2 restart $SERVICE_NAME
else
warning "服务 $SERVICE_NAME 不存在,尝试启动..."
if [ -f "ecosystem.config.js" ]; then
pm2 start ecosystem.config.js
else
pm2 start app.js --name $SERVICE_NAME
fi
fi

success "服务重启完成"

# 7. 健康检查
log "等待服务启动..."
sleep 3

if pm2 list | grep -q "$SERVICE_NAME.*online"; then
success "服务运行正常"
else
error "服务启动失败"
pm2 logs $SERVICE_NAME --lines 10
exit 1
fi

# 8. 清理旧的日志(保留最近1000行)
log "清理部署日志..."
if [ -f "$LOG_FILE" ]; then
tail -n 1000 $LOG_FILE > ${LOG_FILE}.tmp && mv ${LOG_FILE}.tmp $LOG_FILE
fi

success "🎉 部署成功完成!"
log "服务状态:"
pm2 list | grep $SERVICE_NAME

# 显示最近的日志
log "最近的应用日志:"
pm2 logs $SERVICE_NAME --lines 5 --nostream

3. 设置脚本权限

1
chmod +x deploy.sh

第三部分:高级配置

1. PM2生态系统配置

创建 ecosystem.config.js 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module.exports = {
apps: [{
name: 'blog',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
}
}]
}

2. 部署配置文件

创建 deploy.config 文件:

1
2
3
4
5
# deploy.config
SERVICE_NAME="blog"
BRANCH="main"
BUILD_COMMAND="npm run build"
HEALTH_CHECK_URL="http://localhost:3000/health"

第四部分:使用方法

1. 基本部署

1
2
3
4
5
6
7
8
# 基本用法(默认 blog 服务,main 分支)
./deploy.sh

# 指定服务名(比如部署其他项目)
./deploy.sh my-api

# 指定服务名和分支
./deploy.sh my-api develop

参数说明:

  • 第一个参数:服务名称(默认为 blog
  • 第二个参数:Git分支名(默认为 main

2. 首次部署

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 克隆项目
git clone https://github.com/your-username/your-blog.git
cd your-blog

# 2. 创建部署脚本
vim deploy.sh
# 复制上面的脚本内容

# 3. 设置权限
chmod +x deploy.sh

# 4. 执行部署
./deploy.sh

3. 日常更新

1
2
# 只需要一条命令
./deploy.sh

4. 多项目部署示例

如果你有多个项目需要部署:

1
2
3
4
5
6
7
8
# 部署博客项目
./deploy.sh blog main

# 部署API项目
./deploy.sh api-server develop

# 部署前端项目
./deploy.sh frontend release

第五部分:监控和维护

1. 查看服务状态

1
2
3
4
5
6
7
8
# 查看所有服务
pm2 list

# 查看详细信息
pm2 show blog

# 实时监控
pm2 monit

2. 日志管理

1
2
3
4
5
6
7
8
# 查看实时日志
pm2 logs blog

# 查看错误日志
pm2 logs blog --err

# 清空日志
pm2 flush

3. 性能监控

1
2
3
4
5
6
7
8
# CPU和内存使用情况
pm2 monit

# 重启所有服务
pm2 restart all

# 重载配置
pm2 reload ecosystem.config.js

🔧 故障排查

常见问题

  1. 服务启动失败

    1
    pm2 logs blog --lines 50
  2. 端口被占用

    1
    2
    netstat -tlnp | grep :3000
    kill -9 <PID>
  3. 权限问题

    1
    sudo chown -R $USER:$USER /path/to/project

📈 优化建议

  1. 使用集群模式:提高性能和可用性
  2. 配置日志轮转:避免日志文件过大
  3. 设置监控告警:及时发现问题
  4. 定期备份:保护重要数据

总结

通过本教程,你已经学会了:

  • ✅ PM2进程管理工具的安装和使用
  • ✅ 编写自动化部署脚本
  • ✅ 配置服务的自动重启和健康检查
  • ✅ 设置开机自启动
  • ✅ 监控和维护服务

现在你可以通过一条简单的命令 ./deploy.sh 就能完成博客的自动部署,大大提高了开发效率!


提示:建议在生产环境中使用前,先在测试环境中验证脚本的可靠性。如果你有任何问题,欢迎在评论区讨论交流!